【问题标题】:C# output the lowest number of an arrayC#输出数组的最小数
【发布时间】:2021-05-15 05:25:10
【问题描述】:

我的任务是让用户输入数字,当他们输入 0 时,循环将结束并应显示最小的数字。但是,由于他们输入的是 0,因此这将成为最小的数字。我尝试使用 OrderBy 跳过数组中的第一个数字,但这似乎不起作用。

 class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Task 7\n");


            int[] numbers = new int[100];
            for(int i = 0; i < numbers.Length; i++)
            {
                Console.WriteLine("Input any number. Once you enter 0, the application will end");
                numbers[i] = int.Parse(Console.ReadLine());
                if(numbers[i] == 0)
                {
                    break;
                }
            }

            int lowest = numbers.OrderBy(num => num).Skip(1).First();
            
             Console.WriteLine($"The lowest number was: {lowest}");
             Console.ReadLine();


        }
    }

当用户输入 0 时,也许有一种更智能的方式来结束循环

有什么想法吗?

【问题讨论】:

  • 一种(简单)方法是不要将最终的0 插入到数组中。但是,在int 数组中,每个元素都使用0 进行初始化。因此,除非用户输入所有 100 个(或其他)数字,否则其中会有0s。但是您可以使用 List 代替数组。
  • 问题是数组的默认值是0。使用另一个变量来计算用户输入的项目数(在他输入 0 之前,这根本不是存储问题)或根据@stickybit 评论,使用List&lt;int&gt;。
  • 由于 Console.ReadLine 返回一个字符串,我建议将终止键更改为 0 以外的值,例如 x 或类似的值。然后,您将 int.Parse 更改为 TryParse,并且只将数字添加到 TryParse 成功的数组(返回 true)。这样你就会有一个干净的数组,然后你可以得到最小的整数。
  • 您根本不应该使用数组。一个列表,甚至更好,根本不存储值!只需使用 do while 循环检查输入的值。

标签: c# arrays loops sorting


【解决方案1】:

在将int.Parse() 的输出添加到您的数组之前,使用一个临时变量来存储它:

var temp = int.Parse(Console.ReadLine());
if(temp == 0)
{
    break;
}
numbers[i] = temp;

您仍然会得到 0 作为最小值,因为数组中的剩余索引尚未分配给(int 初始化为 0),因此您可能希望通过在之前过滤数组来考虑这一点订购:

int lowest = numbers.Where(num => num > 0).OrderBy(num => num).First();

或者通过使用动态大小的数据结构,例如列表:

List<int> numbers = new List<int>();
for(int i = 0; i < 100; i++)
{
    Console.WriteLine("Input any number. Once you enter 0, the application will end");
    var temp = int.Parse(Console.ReadLine());
    if(temp == 0)
    {
        break;
    }
    numbers.Add(temp);
}

int lowest = numbers.OrderBy(num => num).First();

这当然假设您要存储所有输入值,否则just keep track of the lowest value in a single int

【讨论】:

  • 过滤掉所有0 可能是对原始代码最简单的更改。存储0 根本不是问题。
  • @Sinatr 如果由于某种原因必须存储所有值,那么是的,我同意。
  • 必须存储所有值,因为程序必须找到用户输入的所有数字中的最小数字。这解决了我的问题,谢谢!
  • @OskarB 我肯定会选择List&lt;int&gt; 然后:-)
【解决方案2】:

如果您不需要保留所有输入值,您可以使用一个 int 变量来保留该值与新输入值之间的最小值。 所以在循环结束时,你必须打印这个包含最小值的变量。

int lowest = Int32.MaxValue;
for(int i = 0; i < numbers.Length; i++)
{
   Console.WriteLine("Input any number. Once you enter 0, the application will end");
   lowest = Math.Min(int.Parse(Console.ReadLine()), lowest);
   if(lowest == 0)
   {
      break;
   }
}

Console.WriteLine($"The lowest number was: {lowest}");
Console.ReadLine();

【讨论】:

    【解决方案3】:

    检查后给数组赋值:

    var number = int.Parse(Console.ReadLine());
    
    if (number == 0) break;
    
    numbers[i] = number;
    

    【讨论】:

      【解决方案4】:

      也试试这个

      int[] numbers = new int[100];
      int x = 0;
      for (int i = 0; i < numbers.Length; i++)
      {
           Console.WriteLine("Input any number. Once you enter 0, the application will end");   
           switch (x = int.Parse(Console.ReadLine()))
           {
               case 0:
                  break;
               default:
                  numbers[i] = x;
                  break;
           }
           if (x == 0)
              break;
      }
      
      int lowest = numbers.OrderBy(num => num).First();
      
      Console.WriteLine($"The lowest number was: {lowest}");
      Console.ReadLine();
      

      【讨论】:

        【解决方案5】:

        问题是您声明 int[] numbers = new int[100]; int 数组的默认值为 0 因此,例如,如果您仅输入 5 个值,则其他 95 个值仍初始化为 0。当您对数组进行排序时,您将拥有所有开头的零。

        【讨论】:

          猜你喜欢
          • 2017-06-26
          • 2021-09-11
          • 1970-01-01
          • 2022-11-20
          • 1970-01-01
          • 2021-12-12
          • 1970-01-01
          • 1970-01-01
          • 2017-02-13
          相关资源
          最近更新 更多