【问题标题】:Nested if/else statement inside for loop not working as expectedfor 循环内的嵌套 if/else 语句未按预期工作
【发布时间】:2021-04-02 13:09:03
【问题描述】:

我无法在嵌套在for 循环中的IF/ELSE 语句中发现我的错误在哪里。我确实尝试使用while 循环来使我的IF/ELSE 语句工作,但它没有按预期工作。

即使是我的Console.Writeline 声明也无法捕捉到正确的价格和尺寸。

我的代码:

static void Main(string[] args)
{
    string[] size = { "S", "M", "L", "X"};
    decimal[] price = { 6.99M, 8.99M, 12.50M, 15.00M};

    Console.WriteLine("Please enter a pizza size : ");
    string pizzaSize = Console.ReadLine();

    int i;

    for (i = 0; i < size.Length; i++)
    {
        if (size[i] == pizzaSize)
        {
            Console.WriteLine("Your pizza size is " + pizzaSize + ". The price is " + price[i].ToString("C"));
        } else
        {
            Console.WriteLine("Please enter a valid pizza size");
            return;
        }
    }
    Console.ReadKey();
}

【问题讨论】:

  • 您是否在调试器中运行了您的代码?发生了什么,你观察到了什么?请注意,您可以使用 Visual Studio 中的即时窗口来检查例如在 if 语句中设置断点时 size[i] 的值。
  • 如果您输入例如M 作为选定的披萨大小,第一个检查将是if ("S" == "M"),这显然是false。因此,您将在第一次迭代中点击else 分支,这会导致函数立即进入return。在Main 中,程序终止。进一步考虑,不鼓励将字符串与== 进行比较,并且比较也区分大小写,因此"M" == "m" 将返回false
  • @ADyson 是的,很抱歉。如果用户输入与大小不同,则会执行错误语句
  • else 子句中的 return; 对我来说看起来很奇怪。
  • 很久以前我就被教导一个函数应该只有一个退出点。它有助于结构化代码,并且在尝试调试时可以省去很多麻烦。

标签: c# for-loop if-statement


【解决方案1】:

如果pizzaSize 的值为"L",在for 循环中,第一次检查将是if ("L" == "M"),即false,然后else 分支在第一次迭代中执行,return;else 子句中导致函数立即返回。所以如果要检查pizzaSize的值是否有效,可以使用以下解决方案:

static void Main(string[] args)
    {
        string[] size = { "S", "M", "L", "X"};
        decimal[] price = { 6.99M, 8.99M, 12.50M, 15.00M};

        Console.WriteLine("Please enter a pizza size : ");
        string pizzaSize = Console.ReadLine();

        bool isValid = false;

        while(isValid == false){
              for (int i = 0; i < size.Length; i++)
              {
                    if (size[i] == pizzaSize)
                    {
                          Console.WriteLine("Your pizza size is " + pizzaSize + ". The price is " + price[i].ToString("C"));
                          isValid = true;
                          break;
                     }
              }
        
              if (isValid == false){
                    Console.WriteLine("Please enter a valid pizza size");
                    pizzaSize = Console.ReadLine();
              }
        }

        Console.ReadKey();
    }

【讨论】:

    【解决方案2】:

    else 块将在每次测试条件为假时执行,至少会执行 3 次,即使条件为真,即如果您没有 return 语句,这将不允许循环继续,只要代码点击else,它将立即返回退出程序。

    给定的答案已经解决了这些问题,我要更改的是比较,您希望您的代码能够识别输入的大小写,使用Equals 将是一种更可靠的方法:

    static void Main(string[] args)
    {
        string[] size = { "S", "M", "L", "X" };
        decimal[] price = { 6.99M, 8.99M, 12.50M, 15.00M };
    
        Console.Write("Please enter a pizza size : ");
        string pizzaSize;
        var exists = false;
    
        while (!exists && (pizzaSize = Console.ReadLine()) != null)
        {
            for (int i = 0; i < size.Length; i++)
            {
                if (size[i].Equals(pizzaSize, StringComparison.OrdinalIgnoreCase))
                {
                    Console.WriteLine("Your pizza size is " + size[i] + ". The price is " + price[i].ToString("C"));
                    exists = true;
                    break;
                }
            }
            if (!exists)
            {
                Console.Write("Please enter a valid pizza size: ");
            }
        }
        Console.ReadKey();
    }
    

    还有一些小的调整可以让您的 I/O 更加用户友好。

    【讨论】:

      【解决方案3】:

      看来,您在第一次不匹配时返回 else 分支,因此离开了整个函数。

      有几种方法可以修复您的代码。在不过多接触代码的情况下,您可以在 if 分支中的 WriteLine 之后引入一个 break 语句以离开循环(您已经完成,无需检查其他大小)并在 else- 中添加一个额外的 if 语句分支,包装其内容,以检查当前循环迭代是否是最后一个。如果是最后一次迭代,还是不匹配,只能是无效大小。

      但实际上,最好使用简单的 switch-case 而不是手动迭代。

      【讨论】:

        猜你喜欢
        • 2020-11-28
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        相关资源
        最近更新 更多