【问题标题】:While loop not checking or conditionWhile 循环不检查或条件
【发布时间】:2019-11-23 21:01:22
【问题描述】:

我正在做 C++ 练习。我的一个问题如下...

编写一个程序,继续要求用户输入除 5 之外的任何数字,直到用户输入数字 5。 然后告诉用户“嘿!你不应该输入 5!”并退出程序。

★ 修改程序,10 次迭代后如果用户还没有输入 5 会告诉用户“哇,你比我更有耐心,你赢了。”然后退出。

#include <iostream>

using namespace std;

int main()
{
    int userNum;
    int numTimes = 0;

    do
    {
        cout << "Please enter a number: ";
        cin >> userNum;
        numTimes++;

    }while ((numTimes != 10) || (userNum != 5));
    {
        if (numTimes == 10)
        {
            cout << "Wow, you're more patient than I am, you win.\n";
        }
        else
        {
            cout << "Hey! you weren't supposed to enter 5!\n";
        }
    }
}

我似乎无法让 while 循环的 or 条件工作。

【问题讨论】:

  • || 应替换为 &amp;&amp;
  • 离题:您在 while 循环之后的括号非常令人困惑。不要编写令人困惑的代码。

标签: c++ while-loop


【解决方案1】:

您这样做的方式令人困惑,我的目标是表现力:

#include <iostream>

int main() {
    int userNum;
    int numTimes = 0;

    while (true) {
        std::cout << "Please enter a number: ";
        std::cin >> userNum;

        if (userNum == 5) {
            std::cout << "Hey! you weren't supposed to enter 5!\n";
            break;
        }

        ++numTimes;

        if (numTimes == 10) {
            std::cout << "Wow, you're more patient than I am, you win.\n";
            break;
        }
    }
}

break 允许您方便地退出循环。但是,请不要“滥用”它来过度复杂化或完成奇怪的技巧。没有人喜欢spaghetti code

注意你是怎么shouldn't use namespace std;的。还尝试使用++var 而不是var++ 作为var++ 不必要地复制对象。


Please enter a number: 5
Hey! you weren't supposed to enter 5!

Please enter a number: 12
Please enter a number: 45
Please enter a number: 12
Please enter a number: 0
Please enter a number: 9
Please enter a number: 1
Please enter a number: 2
Please enter a number: 3
Please enter a number: 4
Please enter a number: 1
Wow, you're more patient than I am, you win.

【讨论】:

    【解决方案2】:

    在此处更改

    while ((numTimes != 10) || (userNum != 5));
    

    到这里

    while ((numTimes != 10) && (userNum != 5));
    

    因为您希望它在一个条件变为false 时立即停止。你现在使用|| 的方式,只有当两个条件同时为真时才会停止,所以如果第 10 个数字是5。如果只输入 5 或刚刚达到 10,它不会停止。如果在 10 个数字之后输入 5,它甚至不会停止。

    请记住,a || btrue,即使只有 ab 之一为真。但是既然条件这么混乱,为什么不这样拆分逻辑呢?

    int main()
    {
        int userNum;
    
        for (int numTimes = 0; numTimes < 10; numTimes++){
            std::cout << "Please enter a number: ";
            std::cin >> userNum;
    
            if (userNum == 5) {
                std::cout << "Hey! you weren't supposed to enter 5!\n";
                return 0;
            }
        }
    
        std::cout << "Wow, you're more patient than I am, you win.\n";
    }
    

    【讨论】:

      【解决方案3】:

      问题在于你的情况。您的循环将继续,直到不再满足条件。

      while ((numTimes != 10) || (userNum != 5));
      

      强制循环继续,直到两个条件都为假。如果您的 numTimes == 10,那么 userNum 仍将是

      while ((numTimes < 10) and (userNum != 5));
      

      是正确的条件

      【讨论】:

        猜你喜欢
        • 2017-04-03
        • 2011-03-31
        • 2011-09-09
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        相关资源
        最近更新 更多