Else 语句和 while 循环

Else statement and while loop

代码跳过错误 if 语句并直接进入 else if

我需要经过几圈,如果小于 2 圈,那么它将进入错误并再次返回要求输入新值。反之亦然,大于 20。我是一名新程序员,发现 C# Windows 表单难以理解

        int.TryParse(txtNumberOfLaps.Text, out laps);

while (laps < 2 && laps > 20)
        {
            if (laps < 2)
            {
                MessageBox.Show("Laps can't be less than 2", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
            else if (laps > 20)
            {
                MessageBox.Show("Laps can't be more than 20", "Error",
                MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
            else if (laps > 2 && laps < 20)
            {
                break;
            }
        }
        
       
        
    

据我所知,我认为您的代码没有进入 while 循环。你问的是 laps < 2 AND laps > 20,而我认为你想要的是 laps < 2 OR laps > 20。你的循环没有意义,因为你的数字不能同时大于 20 和小于 2

它跳到哪个else if?你的循环包含两个。我想程序甚至在开始循环之前就已经退出了,因为循环的哨兵值是无法满足的。对于任何给定的整数 n20>n<2 都不存在。这简直是​​不可能的。您可以通过检查哪些数字会使 while 循环的每个条件为真来看到这一点。例如

n < 2 can most easily be satisfied by supplying a 1.

n = 1 makes n > 20 false, however.

on the other side, n > 20 is most easily made true by supplying 21 as an argument.

n = 21 makes your first condition of n<2 false and thus your loop never begins

因此,在 n 的任何情况下,您的 while 循环甚至都不会收到初始 True 值来开始。

既然已经解决了,让我们为您提供解决方案! :)

您正在寻找的是这样的:

int.TryParse(txtNumberOfLaps.Text, out laps);

while(true)
{
   if (laps < 2 || laps > 20)
      {
         MessageBox.Show("Laps must be in range 2-20", "Error", 
         MessageBoxButtons.OK, MessageBoxIcon.Error);
         break;
      }
    else
      {
         // do other things 
         break;
      }
}

永远不会进入 while 循环,因为数字不能同时小于 2 和大于 20。laps < 2 && laps > 20 可能应该是 laps < 2 || laps > 20

更正,如果数字小于2或大于20,则进入while循环,但最后的else-if语句永远不会为真。如果数字在 2 到 20 之间,则永远不会进入 while 循环,因此无论如何都会命中 none 个 if 语句。

这是一个关于如何解决您描述的问题的示例:

while (true)
{
    Console.WriteLine("Please enter a number between 2 and 20:");
    var input = Console.ReadLine();
    
    if (!int.TryParse(input, out var number))
    {
        // the input could not be parsed
        Console.WriteLine("Please enter a proper numeric value.");
    }
    else if (number < 2)
    {
        Console.WriteLine("The number can't be less than 2.");
    }
    else if (number > 20)
    {
        Console.WriteLine("The number can't be more than 20.");
    }
    else
    {
        // if all if-statements above are false, the number must be between 2 and 20
        Console.WriteLine($"You entered {number}. Good job!");
        break;
    }
}

您发布的代码看起来像是您第一次学习编程时要解决的早期问题之一。它有点像 trick-question,其中有多个缺陷等待您发现。

问题在这里:

while (laps < 2 && laps > 20)

它不能同时低于 2 和高于 20,所以循环永远不会执行。使用 || 而不是 &&,它将起作用。

同样一旦进入循环,最后的else if语句是多余的,可以去掉。如果该条件为真,它无论如何都会跳出循环。

此代码有效:

    int.TryParse(txtNumberOfLaps.Text, out laps);

    while (laps < 2 || laps > 20)
    {
        if (laps < 2)
        {
            MessageBox.Show("Laps can't be less than 2", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);

        }
        else
        {
            MessageBox.Show("Laps can't be more than 20", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);

        }
    }