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

}

做作业,这是我第一个用对象编写的程序,所以请耐心等待。我只是无法让这段代码的输出正确。我需要一种摆脱循环的方法,而我正在使用的东西不起作用。有什么建议、提示或技巧吗?

4

2 回答 2

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');
}
于 2010-02-27T04:11:16.290 回答
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声明就是一个典型的例子。

诚然,有了这样一个简单的循环,使用函数和 break 之间真的没有区别。两者都很清楚。然而,当一个月(或几年)后添加额外的功能,以及跳出循环的额外条件时,很容易if在一个如此大的循环中找到具有复杂逻辑的多重嵌套语句,你很难找到它的起点,更不用说出口点了。对抗这种类型的代码膨胀的方法之一是编写简短、简单且重点突出的命名良好的函数。如果您这样做,则代码会自行记录。比较

while (true)

相对

while (shouldDispenseGas())

同样,将其与 STLfor_each算法进行比较。当然,std::for_each(v.begin(), v.end(), &foo);比 短一点for (int i = 0; i < v.size(); ++i) { ...body of foo()... }。但真正的优势在于更容易看出意图是什么。在for_each你立即看到你将对每个元素做一次,而且只有一次。在 for 循环中,您不知道。循环计数器i可以在循环中改变。Abreak也可能隐藏在里面。通过回避这个break语句并将逻辑嵌入到 中shouldDispenseGas,您可以立即了解循环将继续和结束的条件。

于 2010-02-27T05:17:08.890 回答