繁体   English   中英

如何摆脱我的do / while循环?

[英]How can I break out of my do/while loop?

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与零char进行比较。

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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM