Sono un programmatore autodidatta. Ho iniziato a programmare circa 1,5 anni fa. Ora ho iniziato ad avere lezioni di programmazione a scuola. Abbiamo avuto lezioni di programmazione per 1/2 anni e ne avremo un'altra 1/2 adesso.
Nelle classi stiamo imparando a programmare in C ++ (che è un linguaggio che già sapevo di usare abbastanza bene prima di iniziare).
Non ho avuto alcuna difficoltà durante questa lezione, ma c'è un problema ricorrente a cui non sono stato in grado di trovare una soluzione chiara.
Il problema è come questo (in Pseudocode):
do something
if something failed:
handle the error
try something (line 1) again
else:
we are done!
Ecco un esempio in C ++
Il codice richiede all'utente di inserire un numero e lo fa fino a quando l'input non è valido. Usa cin.fail()
per verificare se l'input non è valido. Quando cin.fail()
è true
Devo chiamare cin.clear()
e cin.ignore()
per poter continuare a ricevere input dal flusso.
I am aware that this code does not check of
EOF
. The programs we have written are not expected to do that.
Ecco come ho scritto il codice in uno dei miei compiti a scuola:
for (;;) {
cout << ": ";
cin >> input;
if (cin.fail()) {
cin.clear();
cin.ignore(512, '\n');
continue;
}
break;
}
Il mio insegnante ha detto che non dovrei usare break
e continue
come questo. Ha suggerito che dovrei usare un normale while
o do ... while
loop invece.
Mi sembra che usare break
e continue
sia il modo più semplice per rappresentare questo tipo di loop. Ci ho pensato per un po ', ma non ho trovato una soluzione più chiara.
Penso che volesse che facessi qualcosa del genere:
do {
cout << ": ";
cin >> input;
bool fail = cin.fail();
if (fail) {
cin.clear();
cin.ignore(512, '\n');
}
} while (fail);
Per me questa versione sembra molto più complessa poiché ora abbiamo anche una variabile chiamata fail
per tenere traccia di e il controllo per l'errore di input è stato eseguito due volte invece di una sola volta.
Ho anche immaginato di poter scrivere il codice in questo modo (abusando della valutazione del cortocircuito):
do {
cout << ": ";
cin >> input;
if (fail) {
cin.clear();
cin.ignore(512, '\n');
}
} while (cin.fail() && (cin.clear(), cin.ignore(512, '\n', true);
Questa versione funziona esattamente come le altre. Non usa break
o continue
e il test cin.fail()
viene eseguito una sola volta. Tuttavia non mi sembra giusto abusare della "regola di valutazione del cortocircuito" come questa. Non credo nemmeno che il mio insegnante lo gradirebbe.
Questo problema non si applica solo al controllo cin.fail()
. Ho usato break
e continue
come questo per molti altri casi che comportano la ripetizione di un set di codice finché non viene soddisfatta una condizione in cui deve essere fatto qualcosa anche se la condizione non è soddisfatta (come chiamare cin.clear()
e cin.ignore(...)
dall'esempio cin.fail()
).
Ho continuato a utilizzare break
e continue
durante il corso e ora il mio insegnante ha ora smesso di lamentarsi.
Quali sono le tue opinioni su questo?
Pensi che il mio insegnante abbia ragione?
Conosci un modo migliore per rappresentare questo tipo di problema?