Come posso rompere il mio do/while loop?
Domanda
void GasPump::dispense()
{
bool cont = true;
char stop;
do{
cout << "Press any key, or enter to dispense.\n"
<< "Or press 0 to stop: \n";
cin.get(stop);
gasDispensed = gasDispensed + gasDispensedPerCycle;
charges = costPerGallon*gasDispensed;
displayGasNCharges();
if(stop == 0)
cont = false;
} while(cont);
}
Facendo un compito, questo è il mio primo programma per scrivere con gli oggetti, in modo da portare con me.Ho appena non può ottenere l'output di questo codice a girare a destra.Ho bisogno di un modo per uscire del ciclo, e quello che sto usando non è solo di lavoro.Eventuali suggerimenti, consigli o suggerimenti?
Soluzione
Prova a confronto di arresto al char zero.
stop == '0'
Inoltre è possibile semplificare il codice in questo modo.
void GasPump::dispense()
{
char stop;
do {
cout << "Press any key, or enter to dispense.\n"
<< "Or press 0 to stop: \n";
cin.get(stop);
gasDispensed = gasDispensed + gasDispensedPerCycle;
charges = costPerGallon*gasDispensed;
displayGasNCharges();
} while (stop != '0');
}
Altri suggerimenti
In questo scenario, si pompa a gas di un tempo supplementare, dopo che l'utente preme '0'.Supponendo che questo non è desiderato, si dispone di ciò che è noto come un "fuori-da-un errore." Si può risolvere questo problema (e di eliminare la variabile temporanea) riordinando la funzione come segue:
void GasPump::dispense()
{
while (true) {
cout << "Press any key, or enter to dispense.\n"
<< "Or press 0 to stop: \n";
if (cin.get() == '0')
break;
gasDispensed = gasDispensed + gasDispensedPerCycle;
charges = costPerGallon*gasDispensed;
displayGasNCharges();
}
}
Per evitare l'uso di un break, è possibile utilizzare la seguente costruzione:
bool GasPump::shouldDispenseGas()
{
cout << "Press any key, or enter to dispense.\n"
<< "Or press 0 to stop: \n";
return (cin.get() != '0');
}
void GasPump::dispense()
{
while (shouldDispenseGas()) {
gasDispensed = gasDispensed + gasDispensedPerCycle;
charges = costPerGallon*gasDispensed;
displayGasNCharges();
}
}
EDIT (2011 27 settembre):@TonyK Solo perché un linguaggio fornisce una funzionalità non significa che si dovrebbe usare.Il goto
l'istruzione è un classico esempio di questo.
Concesso, con un semplice loop, non c'è davvero nessuna differenza tra l'utilizzo di una funzione e la pausa.Entrambi sono chiare.Tuttavia, quando le altre caratteristiche aggiunte in un mese (o anni) più tardi, insieme con altre condizioni per la rottura del ciclo, è molto facile trovare moltiplicare nidificate if
dichiarazioni con una logica complessa all'interno di un ciclo che è così grande, non si fatica a trovare il suo inizio, e tanto meno i punti di uscita.Uno dei modi per combattere questo tipo di codice è troppo grosso per scrivere brevi e semplici, e concentra le funzioni che sono chiamato.Se si esegue questa operazione, il codice di documenti stessi.Confrontare
while (true)
versus
while (shouldDispenseGas())
Allo stesso modo, confrontare questo STL for_each
algoritmo.Certo, std::for_each(v.begin(), v.end(), &foo);
è un po ' più for (int i = 0; i < v.size(); ++i) { ...body of foo()... }
.Ma il vero vantaggio è che è più facile vedere ciò che l'intento è.Nel for_each
si vede subito che si farà qualcosa di una volta, e solo una volta per ogni elemento.Nel ciclo for, non avete idea.Il contatore di ciclo i
può essere modificato in loop.Un break
possono essere nascosti all'interno.Da mettere in secondo piano questo break
istruzione e incorporare la logica shouldDispenseGas
, capisce subito le condizioni in cui il ciclo continuerà, e fine.