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

编辑(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嵌入逻辑,你立刻明白其下的循环将继续下去的条件,并结束。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top