Programma in parte non funzionante

Lugio

Utente Attivo
845
225
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
HDD
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
GPU
rx 480 8gb reference
Monitor
TV HD 32"
PSU
cx750m corsair
Case
cooler master mastercase 5
OS
windows 10 64bit
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.
 

Andretti60

Utente Èlite
6,440
5,091
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.
 

Lugio

Utente Attivo
845
225
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
HDD
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
GPU
rx 480 8gb reference
Monitor
TV HD 32"
PSU
cx750m corsair
Case
cooler master mastercase 5
OS
windows 10 64bit
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
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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).
 

Andretti60

Utente Èlite
6,440
5,091
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).
 

Lugio

Utente Attivo
845
225
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
HDD
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
GPU
rx 480 8gb reference
Monitor
TV HD 32"
PSU
cx750m corsair
Case
cooler master mastercase 5
OS
windows 10 64bit
@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.
 

Andretti60

Utente Èlite
6,440
5,091
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.
 

Lugio

Utente Attivo
845
225
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
HDD
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
GPU
rx 480 8gb reference
Monitor
TV HD 32"
PSU
cx750m corsair
Case
cooler master mastercase 5
OS
windows 10 64bit
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);
            }
        }
    }
}
 

Andretti60

Utente Èlite
6,440
5,091
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;
}
 

Lugio

Utente Attivo
845
225
CPU
i5 6600k
Dissipatore
enermax liqmax 240
Scheda Madre
msi z170 gaming m3
HDD
seagate barracuda 1tb
RAM
hyperx fury 16gb cl14 2133hz
GPU
rx 480 8gb reference
Monitor
TV HD 32"
PSU
cx750m corsair
Case
cooler master mastercase 5
OS
windows 10 64bit
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
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
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; ...)
 
  • Mi piace
Reazioni: Andretti60

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!