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);
}
Делание уроки, это - моя первая программа, которая запишет с объектами, так терпите меня. Я просто не могу заставить вывод этого кода оказываться правым. Мне нужен способ выйти из цикла, и что я использую, просто не работает. Какие-либо предложения, подсказки или подсказки?
Попробуйте сравнить стоп с нулевым символом.
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');
}
В этом сценарии вы качаете газ еще раз после того, как пользователь нажимает «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
, вы сразу понимаете условия, при которых цикл будет продолжаться и завершаться.