【问题标题】:Simple while loop not terminating (beginner)简单的while循环没有终止(初学者)
【发布时间】:2014-01-07 04:57:02
【问题描述】:

这就是我希望我的程序执行的操作。提示用户输入 10 个整数。然后我的程序将偶数相加,奇数相加,然后显示两个和。简单的初学者练习。为此,我使用了一个带有控制变量的 while 循环。这是我的全部代码:

    #include <iostream> 

    using namespace std;

    int main()
    {

        int evenSum = 0;
        int oddSum = 0;
        int num;
        int control = 0; 

        cout << "Enter 10 integers: " << endl; 

        cin >> num; 

        while (control <= 10)
        {
            if (num%2 == 0)
            {
                evenSum = evenSum + num;
            }
            else
            {
                oddSum = oddSum + num;
            }

            control++;

            cin >> num; 

        }

        cout << "The sum of the even integers is " << evenSum << endl;

        cout << "The sum of the odd integers is " << oddSum << endl;

        return 0;

    }

为了测试这段代码,我使用前 10 个正整数 1-10 作为输入。但是,我有些头疼。首先,控制永远不会从 while 循环传递,即程序永远不会到达显示 evenSum 和 outSum 变量值的地步。我花了很长时间弄清楚为什么 while 循环永远不会终止。正如我写的那样,一旦 control = 11,while 条件就会变为 false,并且控制变量在 while 主体的末尾递增,所以它不应该继续下去。然而确实如此。

我的第二个头痛(可能相关)是我输入中偶数的总和应该是 30,奇数的总和应该是 25。然而,虽然我的程序得到了 oddSum 正确,它只求和最多可达 20,因此由于某种原因它不计算最后一个数字 (10)。

我在纸上仔细地浏览了这个程序好几次。另外,我已经让它显示变量值,所以我可以跟踪它在每个 while 循环中所做的事情。最终,它只是停止显示输出,但实际上并没有终止。并且它正确地总结了偶数和赔率,只是没有添加最后一个数字。

在我看来,这里至少有一个错误,可能有 2 个相互混合。但是我尝试过调整我的各种价值观,但没有任何作用。我的另一个想法是我怀疑我设置输入流的方式。 IE。我不确定在 while 循环的最后一次迭代中将为 num 分配什么值。

任何人都可以阐明这些问题中的任何一个吗?

【问题讨论】:

    标签: c++ while-loop


    【解决方案1】:

    在循环顶部读取(检查计数后)

    // cin >> num; 
    while (control <= 10)
    {
      cin >> num;
      if (num%2 == 0)
      {
        evenSum = evenSum + num;
      }
      else
      {
        oddSum = oddSum + num;
      }
      control++;
      // cin >> num; 
    }
    

    【讨论】:

    • 这确实解决了 evenSum 问题。现在根据需要加起来为 30。但是,while 循环仍然没有放弃控制权。
    • 0-1011 值。 0,1,2,3,4,5,6,7,8,9,10。
    【解决方案2】:

    尝试跟踪代码执行。手动。这是了解计算机如何思考的最佳方式。

    你会意识到,循环条件被打破了。您从 0 开始数,一直到 10,包括,在 11 处停止。0..10,即 11 个数字!

    此外,您在开始时读取一次输入,然后在每次迭代结束时读取一次。读取 12 次。

    当尝试读取多于提供的输入时,程序会阻塞并等待更多输入。无限循环中的程序处于活动状态,它会消耗您所有的 CPU 资源。在这种情况下,程序被阻止并且几乎没有使用任何资源。

    【讨论】:

    • 我将我的计数变量初始化为 1,并连同 Elliot 的/您的建议一起仅在 while 循环开始时读取输入,从而修复了它。感谢您让我深入了解问题!
    • @user3128869 在大多数编程语言中,一种更常见的方法是从 0 开始计数并使用严格的不等式。如果您保留int control = 0; 并将循环条件更改为while (control &lt; 10) { …,它也可以工作。这是品味和惯例的问题,两种解决方案都有效。在索引数组时,从零开始的计数更有用,因为它们具有从零开始的索引。
    【解决方案3】:

    要求在循环内输入数字,很容易理解何时输入特定数字

         int control = 1;
    
         while (control <= 10)
            {
               cout << "Enter integer at position:"+Control << endl; 
                cin >> num; 
                if (num%2 == 0)
                {
                    evenSum = evenSum + num;
                }
                else
                {
                    oddSum = oddSum + num;
                }
    
                control++;         
    
            }
    

    【讨论】:

      【解决方案4】:

      我看不到错误。只是你必须输入 11 个数字而不是 10 个的问题。你试过输入 11 个数字吗?

      【讨论】:

        【解决方案5】:

        嘿,我也是一个初学者,但我试图回答你的问题。您也可以使用复合赋值,即 += 而不是重复 evenSum 和 oddSum 两次。

                    #include <iostream> 
        
                    using namespace std;
        
                    int main()
                    {
        
                        int evenSum = 0;
                        int oddSum = 0;
                        int num;
                        int control = 0;
                        cout << "Enter 10 integers: " << "\n";
        
                        while (control <= 9 )
                        {
                            cin >> num;
        
                            if (num % 2 == 0)
                            {
                                evenSum += num;
                            }
                            else
                            {
                                oddSum += num;
                            }
        
                            control++;
                        }
        
                        cout << "The sum of the even integers is: " << evenSum << "\nThe sum of the odd integers is: " << oddSum << "\n";
        
                        return 0;
        
                    }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-14
          • 2022-01-05
          • 2017-03-10
          • 2013-09-26
          • 1970-01-01
          • 2022-01-25
          • 2013-04-22
          • 1970-01-01
          相关资源
          最近更新 更多