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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top