【问题标题】:While loop breaks unintentionallyWhile 循环无意间中断
【发布时间】:2020-08-17 09:18:09
【问题描述】:

我正在接受 C# 培训的第二周,所以我对编程很陌生。我必须制作一个程序,从一系列随机整数输入中返回最小的整数。一旦输入 = 0,程序应该跳出循环。我只被允许使用 while 和 for 循环。出于某种原因,我的程序在第二次输入后跳出循环,看起来它甚至不在乎是否有“0”。你能看看我哪里出错了吗?我一直在为此烦恼。抱歉,如果其他人已经发布了这个问题,但我在任何地方都没有找到答案。

PS:比较时应考虑零输入。 所以这就是我到目前为止所得到的:

 class Program
 {
     static void Main()
     {
        int i = 0;
        int input = Int32.Parse(Console.ReadLine());
        int min = default;

        while (input != 0)
        {
            Console.ReadLine();
            if (i == 0)
            {
                min = input;
                break;
            }

            if (input < min && i !=0)
            {
                input = Convert.ToInt32(Console.ReadLine());
                min = input;
            } 
            i++;
        }
        Console.WriteLine(min);
    }

【问题讨论】:

  • 您可能必须将数据存储到一个列表中,直到输入 0,一旦输入 0,获取该数组中的最小值
  • 使用调试器逐步调试
  • if (i == 0) 始终为真。因为int i = 0; 而你在if 之前没有改变它。
  • 你对数字有限制吗,我的意思是你想输入多少个随机数来从中获取最小值。
  • 嗨,@Hardood 不,我没有限制。结果应在输入零后出现。 Hamid Reza Mohammadi,我修改了 int i 的值,但它不起作用。

标签: c# loops input while-loop


【解决方案1】:

首先,您需要重新阅读for-while-loops 的文档。那里有几个有用的页面..例如for / while.

问题

循环中断的原因是您将i 初始化为0

int i = 0; 

如果满足条件“i is 0”,则在您的循环中使用if-statment 来中断循环。

if (i == 0)
{
    min = input;
    break;
}

您的程序会忽略用户必须提供的每次循环迭代的输入,因为您永远不会将此类信息存储到任何变量中。

while (input != 0)
{
    Console.ReadLine(); 
    // ...
}

可能的解决方案

作为初学者,逐步完成任务很有帮助。试着写下每个步骤来定义一个简单的算法。由于这个问题有很多解决方案,一种可能的方法可能是:

  1. 声明最小值 + 为其分配最大值
  2. 使用while循环并循环直到匹配特定条件
  3. 读取用户输入并尝试将其转换为整数
  4. 检查值是否为0
    • 4.1。如果值为0,则转到步骤8
    • 4.2。如果值不为0,则转到步骤5
  5. 检查值是否小于当前最小值
    • 5.1.如果值较小,请转到第 6 步
    • 5.2。如果值不小,返回步骤 3
  6. 设置新的最小值
  7. 返回步骤 3
  8. 打破循环
  9. 结束程序

处理上述步骤的程序可能如下所示:

using System;

namespace FindMinimum
{
    public class Program
    {
        static void Main(string[] args)
        {
            // Declare minimum value + assign initial value
            int minValue = int.MaxValue;

            // Loop until something else breaks out
            while (true)
            {
                Console.WriteLine("Please insert any number...");

                // Read io and try to parse it to int
                bool parseOk = int.TryParse(Console.ReadLine(), out int num);

                // If the user did not provide any number, let him retry
                if (!parseOk)
                {
                    Console.WriteLine("Incorrect input. Please insert numbers only.");
                    continue;
                }

                // If the user typed in a valid number and that number is zero, break out of the loop
                if (parseOk && num == 0)
                {
                    break;
                }

                // If the user typed in a valid number and that number is smaller than the minimum-value, set the new minimum
                if (parseOk && num < minValue)
                {
                    minValue = num;
                }
            }

            // Print the result to the console
            Console.WriteLine($"Minimum value: {minValue}.");

            // Keep console open
            Console.ReadLine();
        }
    }
}

【讨论】:

  • 非常感谢。这非常有用,感谢您的参考。我错误地观看了一些如何解决这个问题的 C++ 示例,因为我教导它不可能如此不同,虽然我不确定我是否感到困惑。
【解决方案2】:

试试这个:

       int input;
       Console.Write("Enter number:");
       input = Int32.Parse(Console.ReadLine());
       int min = input;

       while(true)
       {
           if (input == 0)
               break;

           if (min > input)
               min = input;

           Console.Write("Enter number:");
           input = Int32.Parse(Console.ReadLine());
       }

       Console.WriteLine(min);
       Console.ReadKey();

希望对你有帮助。

【讨论】:

  • 是的。它有帮助。非常感谢。我必须在您的代码下方添加一点 if 语句,以便如果零是最小值,则答案应该为零。再次感谢你。我不敢相信它是多么简单。我把它弄得太复杂了。
  • 你总是使用零来退出循环,这意味着如果你所有的值都是正的,那么最小值将总是零,如果你插入负数,它就会出现,然后零将承担责任。
  • 在 Console.WriteLine(min);添加 if(input
猜你喜欢
  • 1970-01-01
  • 2022-07-31
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
  • 2019-05-05
  • 2021-10-28
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多