Programma in parte non funzionante

Pubblicità

Lugio

Utente Attivo
Messaggi
845
Reazioni
225
Punteggio
50
Salve a tutti,
mi son messo con impegno nello studio del C++ attraverso l'uso di un libro; uno degli esercizi era di creare un programma in cui inserire e/o visualizzare voti usando il template vector ed il goto ( quest ultimo obbiettivo facoltativo posto da un mio amico ).

#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;

int main() {

Principale:
vector <int> VotoVettore;
int Voto;
int Scelta;
cout <<"Premere 1 per visualizzare i voti, 2 per inserire voti\n";
cin >> Scelta;

if ( Scelta == 1) {

for ( int Indice; Voto != 0; Indice++ ) {
Voto = VotoVettore [Indice];
cout << Voto;
}
cout <<"Premere 1 per tornare al menu principale\n";
cin >> Scelta;
if ( Scelta == 1) {
goto Principale;
}
}

if ( Scelta == 2 ) {

while ( Voto = 0; ) {
cin >> Voto;
VotoVettore.push_back(Voto);
}
cout <<"Premere 1 per tornare al menu principale\n";
cin >> Scelta;
if ( Scelta == 1 ) {
goto Principale;
}
}

}

Il programma compila e funziona, ma dopo aver inserito e memorizzato i voti nel vector, se si usa il comando per visualizzarli non visualizza niente.

Ringrazio in anticipo per ogni consiglio.
 
Ci sono due grossi errori, in pratica lo stesso, sia nella sezione di ingesso dati che quella di stampa utilizzi il valore di una variabile (Voto) prima di assegnarla. Riguarda il codice.
 
Ci sono due grossi errori, in pratica lo stesso, sia nella sezione di ingesso dati che quella di stampa utilizzi il valore di una variabile (Voto) prima di assegnarla. Riguarda il codice.

Sinceramente a me non sembra.
In entrambe le parti assegno a Voto un valore prima di usarla.
O forse intendi altro
 
che compili non significa che funzioni, sicuramente intende altro ed io ci aggiungo che usare il goto per una cosa tanto semplice (basta un ciclo indefinito) ti porta a fare nuovi errori; riscrivi il programma e non usare il goto, che tra l'altro verrebbe mal visto in qualunque ambito (sia scolastico che professionale).
 
In entrambi i casi (for e while), utilizzi Voto nella istruzione condizionale, mentre lo inizializzi nel corpo del loop. La condizione viene eseguita prima del corpo.
Inoltre guarda l'istruzione while: è una assegnazione invece di una condizione.
Il tuo codice inoltre non ammette lo zero come voto, utilizzi lo zero per terminare i cicli. Lo zero è un voto, quindi o utilizzi il numero di voti per terminare i cicli, o usi un voto che non sia possibile (per esempio un voto negativo).
 
@bataki anche usando un qualsiasi while anzichè il goto il programma non esegue la parte della visualizzazione.
@Andretti60 Scusa, il Voto = 0 nel while è ststo un errore di riscrittura nel codice che ho ivi postato.
Inoltre:
1) Lo 0 è stato usato perchè avendo usato un Vector, appena una locazione è vuota il programma si ferma;
2) il problema di voto nel for l'ho già corretto con un semplice if.
 
Se hai fatto modiche, pubblicale (e usa il tag CODE invece che SPOILER)
Lo zero come ho detto e' una valido voto, devi modificare il codice.
 
Se hai fatto modiche, pubblicale (e usa il tag CODE invece che SPOILER)
Lo zero come ho detto e' una valido voto, devi modificare il codice.
HO provato a cambiare così, ma il problema persiste.

Codice:
#include <iostream>
#include <vector>
#include <stdio.h>

using namespace std;

int main() {


    vector <int> VotoVettore;
    int Voto;
    int Scelta;
    while ( Scelta != 0 ) {
        cout <<"Premere 1 per visualizzare i voti, 2 per inserire voti\n";
        cin >> Scelta;

        if ( Scelta == 1) {

            for ( int Indice; Voto != -1; Indice++ ) {
                    Voto = VotoVettore [Indice];
                    cout << Voto <<"\n";
            }
        }

        if ( Scelta == 2 ) {
            cout << "Digitare -1 per tornare al menu principale\n\n";
            while ( Voto != -1  ) {
                cout << "Inserire Voto\n";
                cin >> Voto;
                VotoVettore.push_back (Voto);
            }
        }
    }
}
 
perche' il problema rimane: nel ciclo FOR fai il test su Voto PRIMA di valutarlo. Se hai scelto opzione 2) e poi opzione 1), logico che Voto sarà -1 quindi il ciclo FOR non viene eseguito.
Prova:

Codice:
int i = 0;
Voto = 0
while (Voto >=0)
{
Voto=VotoVettore[i++];
cout << Voto;
}
 
perche' il problema rimane: nel ciclo FOR fai il test su Voto PRIMA di valutarlo. Se hai scelto opzione 2) e poi opzione 1), logico che Voto sarà -1 quindi il ciclo FOR non viene eseguito.
Prova:

Codice:
int i = 0;
Voto = 0
while (Voto >=0)
{
Voto=VotoVettore[i++];
cout << Voto;
}

Vero, non ci avevo pensato.
Ora il programma fa, ho però aggiunto un while del comando 1, perchè se no scriveva anche il -1.
Inoltre si poteva scrivere col for, l'unico modifica era inizializzare Voto = 0 nel if del comando uno
 
Solo un paio di dettagli:
quando dichiari la variabile Scelta ti conviene inizializzarla esplicitamente ad un valore diverso da 0, per es.
int Scelta = 4;
infatti, se non assegni un valore esplicito, potresti sulla carta avere un compilatore che invece di assegnare un valore a caso gli assegna proprio lo 0, ed in tal caso il programma non verrebbe mai eseguito;
inoltre vedo che c'è un ciclo for con una variabile Indice che non viene mai esplicitamente inizializzata, probabilmente dovresti scrivere for ( int Indice=0; ...)
 
Pubblicità
Pubblicità
Indietro
Top