Question

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

}

Faire une mission, ceci est mon premier programme d'écrire avec des objets portent donc avec moi. Je ne peux pas obtenir la sortie de ce code pour tourner à droite. Je besoin d'un moyen de sortir de la boucle, et ce que je suis en utilisant seulement ne fonctionne pas. Toutes les suggestions, des conseils ou des conseils?

Était-ce utile?

La solution

Essayez de comparer l'arrêt au zéro car.

stop == '0'

Vous pouvez également simplifier votre code en faisant cela.

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

Autres conseils

Dans ce scénario, pompe à gaz une fois supplémentaire après l'utilisateur clique « 0 ». En supposant que cela ne soit pas désiré, vous avez ce qu'on appelle un « off par une erreur. » Vous pouvez résoudre ce problème (et éliminer la variable temporaire) en réorganisant votre fonction comme suit:

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

Pour éviter d'utiliser une instruction break, vous pouvez utiliser la construction suivante:

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 Septembre 27): @TonyK Tout simplement parce que la langue fournit une fonctionnalité ne signifie pas que l'on doit l'utiliser. La déclaration de goto est un exemple classique.

D'accord, avec une telle boucle simple, il n'y a vraiment pas de différence entre l'utilisation d'une fonction et la pause. Les deux sont clairs. Toutefois, lorsque des fonctionnalités supplémentaires sont ajoutés par mois (ou années) plus tard, ainsi que des conditions supplémentaires pour sortir de la boucle, il est très facile de trouver des déclarations de if se multiplient imbriquées avec une logique complexe dans une boucle qui est si grand, vous avez un disque le temps de trouver son début, beaucoup moins les points de sortie. L'un des moyens de lutter contre ce type de code ballonnement est d'écrire de courts, des fonctions simples et ciblées qui sont bien nommés. Si vous faites cela, les documents de code lui-même. Comparer

while (true)

contre

while (shouldDispenseGas())

De même, comparer l'algorithme STL for_each. Bien sûr, std::for_each(v.begin(), v.end(), &foo); est un peu plus courte que for (int i = 0; i < v.size(); ++i) { ...body of foo()... }. Mais l'avantage réel est qu'il est plus facile de voir ce que l'intention est. Dans le for_each vous voyez tout de suite que vous allez faire quelque chose une fois et une seule fois, à chaque élément. Dans la boucle, vous avez aucune idée. Le compteur boucle i peut être modifiée dans la boucle. Un break peut être caché à l'intérieur aussi bien. En se défaussant cette déclaration de break et intégrer la logique shouldDispenseGas, vous comprenez immédiatement les conditions dans lesquelles la boucle continuera, et à la fin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top