【问题标题】:While loop doesn't loop虽然循环不循环
【发布时间】:2011-12-03 11:01:21
【问题描述】:

在这里,我设置了一个 while 循环,在其中输入选择编号 1 或 2。如果我选​​择 1 或 2,它会计算出我选择的 1 或 2;如果我选择一个低于 1 或高于 2 的数字,它会转到要求用户再次输入的 else 语句。但是如果用户输入的问题是,如果他们选择了正确的数字 1 或 2,它就不会循环回到开头;它只会在那里结束循环,而不是转到正确的if 子句。为什么是这样?我觉得好像我攻击它是正确的。

int menus (int selection)
{
    while ( selection > 2 ||  selection < 1)
    {
        if (selection == 1)
        {
            cout << " 1 " << endl;
        }
        if (selection == 2)
        {
        cout << " 2 " << endl;
        }
        else
            cout << "You didnt choose 2 or 3. Choose again";
        cin >> selection;
    }
    return 0;
}

【问题讨论】:

    标签: c++ while-loop if-statement


    【解决方案1】:

    如果输入 1 或 2,它甚至不会进入循环,因为 1 或 2 都不大于 2 或小于 1,它们是相等的。

    这应该可以解决它:

    while ( selection >= 2 ||  selection <= 1) //equals while(true)
    

    请注意,您还应该在第二个 if 中使用 else if 语句,否则它不能正常工作。

    else if (selection == 2)
    {
        cout << " 2 " << endl;
        break; // this leaves the loop
    }
    

    【讨论】:

    • 如果我不能把它当作 all 和默认的 else,究竟是什么?
    • else if 如果您想在 1 个语句中包含多个条件,则使用。如果您使用 2 个 if,则只有第二个链接到 else,第一个独立。你可以测试它并看到它。如果您将 2 个 if 保留在代码中,您将看到它将输入第一个 if 和 else 如果您输入“1”。
    • AFAICS,那个循环(while (selection &gt;= 2 || selection &lt;= 1) 无限期地继续,因为selection 是一个整数;如果值是 2 或更大,或者 1 或更小,它涵盖了整数的每个值,不会是吗?
    • 哦,所以只要我有不止一个,我就应该使用,如果其他基本正确的话?
    • @JonathanLeffler 是的,我认为这就是他想要的。否则 break 会这样做。
    【解决方案2】:

    您的 while 循环排除了您要在循环内测试的值!

    while ( selection > 2 ||  selection < 1)
    {
    if (selection == 1)
    {
        // Impossible!! selection isn't > 2 or < 1.
    }
    

    你可以这样做:

    while (1)
    {
        switch (selection) {
            case 1:
            case 2:
                cout << " " << selection << " " << endl;
                return 0;
            default:
                cout << "You didnt choose 1 or 2. Choose again";
                cin >> selection;
        }
    }
    

    我不明白为什么选择是你的函数的参数。如果没有更多代码,很难判断这是否明智。

    【讨论】:

    • 那么我在 while 循环中究竟做了什么?
    【解决方案3】:

    你的循环条件被扭曲了。

    只有在选择为 3、4、5、...(因为 selection &gt; 2)或 selection 为 0、-1、-2、...(因为 @987654323 @)。所以,你永远不会进入if;你去else。然后在重做循环之前无条件地输入一个新的选择。如果您现在输入一个有效值,则循环终止。您可能还会注意到您的消息与您希望用户提供的内容不符。

    正确缩进时,您的代码与此非常相似:

    int menus (int selection)
    {
        while (selection > 2 || selection < 1)
        {
            if (selection == 1)
            {
                cout << " 1 " << endl;
            }
            else if (selection == 2)
            {
                cout << " 2 " << endl;
            }
            else
                cout << "You didn't choose 1 or 2. Choose again: ";
            cin >> selection;
        }
        return 0;
    }
    

    如果您真的希望用户选择 1 或 2 并返回他们的选择,那么您需要更像:

    int menus (int selection)
    {
        while (selection > 2 || selection < 1)
        {
            cout << "You didn't choose 1 or 2. Choose again: ";
            cin >> selection;
        }
        if (selection == 1)
            cout << " 1 " << endl;
        else if (selection == 2)
            cout << " 2 " << endl;
        return selection;
    }
    

    仍然存在诸如“EOF 上会发生什么?”之类的问题。应该处理。当然,打印也可以精简:

    int menus (int selection)
    {
        while (selection > 2 || selection < 1)
        {
            cout << "You didn't choose 1 or 2. Choose again: ";
            cin >> selection;
        }
        cout << " " << selection << " " << endl;
        return selection;
    }
    

    【讨论】:

    • 那么我该如何攻击这个令人困惑的imk inda。
    【解决方案4】:

    据我所知,您正在将选择传递给函数。 只有当输入不是 1 或 2 时才会运行 while 循环。

    因此将代码更改为:

    int menus (int selection)
    {
      while (true)
     {
      if (selection == 1 || selection == 2)
      {
         cout << selection << endl;
         break;
      }
      else
      {
         cout << "You didnt choose 1 or 2. Choose again";
         cin >> selection;
      }
     }
    
     return 0;
    }
    

    【讨论】:

      【解决方案5】:

      如果他们选择了有效数字,则该数字不再满足循环的条件要求。如果用户失败次数过多,您会发现在可以设置的布尔值上循环更容易,否则,您可以使用do{ /* get the input, count it or ask them to fix it */ }while(selection == 1 || selection == 2);,当数字变为无效时它将停止循环

      【讨论】:

        【解决方案6】:

        在 else 中调用 int menus(),如下所示:

        else{
        cout << "You didnt choose 2 or 3. Choose again";
        cin >> selection;
        menus(selection);
        }
        

        【讨论】:

        • -1:对 menus() 函数的不必要递归调用。最好改正while条件。
        【解决方案7】:

        使用

        do{
        
        }while( selection > 2 ||  selection < 1);
        

        而不是while。

        【讨论】:

          【解决方案8】:

          仔细查看您的“while”条件:它只会在“selection”大于 2 或小于 1 时循环。然后您检查选择是 1 还是 2 - 您刚刚排除了。 循环中也没有输入命令。

          【讨论】:

          • 所以“选择”永远不会改变。如果while 条件的计算结果为true,您将有一个无限循环。
          • 它必须在期间循环改变。所以输入命令必须在你的循环中。
          • 所以我会改变选择> 2 ||选择
          • 首先,selection 的值必须在循环内改变 - 所以输入命令需要在循环内。其次,是的,您需要考虑一下您正在评估的情况。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-06-14
          • 2015-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多