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);
}
做一个作业,这是我第一个用对象写的程序,所以请耐心等待。 我只是无法得到这个代码的输出结果是正确的。我需要一种出路的方法 循环,我正在使用的是不起作用。有任何建议,提示或提示吗?
答案 0 :(得分:5)
尝试将stop与零字符进行比较。
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');
}
答案 1 :(得分:3)
在这种情况下,您在用户点击“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();
}
}
编辑(2011年9月27日):
@TonyK仅仅因为语言提供了一个功能并不意味着应该使用它。 goto
语句就是一个典型的例子。
当然,使用这样一个简单的循环,使用函数和中断之间确实没有区别。两者都很清楚。但是,当额外的功能在一个月(或几年)之后添加时,以及突破循环的额外条件,很容易在循环内找到具有复杂逻辑的多重嵌套if
语句,你很难找到它的开始,更不用说退出点了。对抗这种类型的代码膨胀的方法之一是编写具有良好名称的简短,简单和集中的函数。如果您这样做,代码会记录自己。比较
while (true)
与
while (shouldDispenseGas())
同样,将其与STL for_each
算法进行比较。当然,std::for_each(v.begin(), v.end(), &foo);
比for (int i = 0; i < v.size(); ++i) { ...body of foo()... }
短一点。但真正的优势在于更容易看出意图是什么。在for_each
中,您会立即看到您将为每个元素执行一次,而且只执行一次。在for循环中,你不知道。循环计数器i
可以在循环中更改。 break
也可能隐藏在里面。通过推卸这个break
语句并在shouldDispenseGas
中嵌入逻辑,您可以立即了解循环将继续的条件并结束。