Frage

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);

}

einen Auftrag tun, ist dies mein erstes Programm mit Objekten so Bär schreiben mit mir. Ich kann einfach nicht die Ausgabe dieses Codes erhalten nach rechts herausstellen. Ich muss einen Weg raus die Schleife, und was funktioniert verwende ich einfach nicht. Irgendwelche Vorschläge, Tipps oder Hinweise?

War es hilfreich?

Lösung

Versuchen Anschlag auf den Null char verglichen wird.

stop == '0'

Sie können auch Ihren Code vereinfachen, indem dies zu tun.

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');
}

Andere Tipps

In diesem Szenario pumpen Sie Gas eine zusätzliche Zeit, nachdem der Benutzer Hits ‚0‘. Unter der Annahme, dass dies nicht erwünscht ist, haben Sie, was als bekannt ist „off-by-one Fehler.“ Sie können dieses Problem beheben (und beseitigen die temporäre Variable) durch Ihre Funktion Umordnung wie folgt:

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();
    }
}

Um mit einer break-Anweisung zu vermeiden, können Sie den folgenden Aufbau verwenden:

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. September): @TonyK Nur weil eine Sprache bietet eine Funktion, bedeutet nicht, dass man es verwenden soll. Die goto Aussage ist ein klassisches Beispiel dafür.

Zugegeben, mit einer solchen einfachen Schleife, gibt es wirklich keinen Unterschied zwischen einer Funktion und die Pause. Beide sind klar. Wenn jedoch zusätzliche Funktionen einen Monat später (oder Jahre) hinzugefügt bekommen, zusammen mit zusätzlichen Bedingungen für die Schleife ausbricht, ist es sehr einfach mehrfach verschachtelte if Anweisungen mit komplexer Logik in einer Schleife zu finden, die so groß ist, haben Sie ein harten Zeit ihren Anfang zu finden, geschweige denn die Austrittspunkte. Eine der Möglichkeiten, diese Art von Code aufblasen zu bekämpfen, ist kurz, einfach und konzentriert Funktionen zu schreiben, die gut benannt sind. Wenn Sie dies tun, um die Code-Dokumente selbst. Vergleichen

while (true)

Vergleich

while (shouldDispenseGas())

In ähnlicher Weise vergleichen Sie diese mit dem STL for_each Algorithmus. Sicher, std::for_each(v.begin(), v.end(), &foo); ist etwas kürzer als for (int i = 0; i < v.size(); ++i) { ...body of foo()... }. Aber der wirkliche Vorteil ist, dass es einfacher ist zu sehen, was die Absicht ist. Im for_each sehen Sie sofort, dass Sie etwas einmal tun werden, und nur einmal, zu jedem Element. In der for-Schleife, haben Sie keine Ahnung. Der Schleifenzähler i kann in der Schleife verändert werden. Ein break kann sowohl innerhalb als auch versteckt werden. Durch Drückebergerei dieser break Anweisung und die Logik in shouldDispenseGas Einbettung Sie sofort verstehen, die Bedingungen, unter denen die Schleife wird fortgesetzt, und Ende.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top