Как я могу убежать из моего/цикл с условием продолжения?

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

}

Делание уроки, это - моя первая программа, которая запишет с объектами, так терпите меня. Я просто не могу заставить вывод этого кода оказываться правым. Мне нужен способ выйти из цикла, и что я использую, просто не работает. Какие-либо предложения, подсказки или подсказки?

6
задан Machavity 8 October 2018 в 12:28
поделиться

2 ответа

Попробуйте сравнить стоп с нулевым символом.

stop == '0'

Также вы можете упростить свой код, сделав это.

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');
}
5
ответ дан 16 December 2019 в 21:38
поделиться

В этом сценарии вы качаете газ еще раз после того, как пользователь нажимает «0». Если предположить, что это нежелательно, у вас есть так называемая «ошибка нечеткости». Вы можете исправить это (и исключить временную переменную), переставив функцию следующим образом:

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

Чтобы избежать использования оператора break, вы можете использовать следующую конструкцию:

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 (27 сентября 2011 г.): @TonyK Тот факт, что язык предоставляет функцию, не означает, что ее следует использовать. Оператор goto является классическим примером этого.

Конечно, в таком простом цикле нет никакой разницы между использованием функции и прерыванием. Оба ясны. Однако, когда через месяц (или годы) позже будут добавлены дополнительные функции вместе с дополнительными условиями для выхода из цикла, очень легко найти многократно вложенные операторы if со сложной логикой внутри цикла, поэтому большой, вам трудно найти его начало, не говоря уже о точках выхода. Один из способов борьбы с этим типом раздувания кода - писать короткие, простые и целенаправленные функции с хорошо названными именами. Если вы это сделаете, код сам документирует. Сравните

while (true)

с

while (shouldDispenseGas())

. Аналогично, сравните это с алгоритмом STL for_each . Конечно, std :: for_each (v.begin (), v.end (), & foo); немного короче, чем for (int i = 0; i . Но реальное преимущество в том, что легче понять, в чем заключаются намерения. В for_each вы сразу видите, что вы будете делать что-то один раз и только один раз для каждого элемента. В цикле for вы понятия не имеете.Счетчик цикла i может быть изменен в цикле. Разрыв также может быть скрыт внутри. Уходя от этого оператора break и внедряя логику в shouldDispenseGas , вы сразу понимаете условия, при которых цикл будет продолжаться и завершаться.

3
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: