C#输出数组的最小数

Posted

技术标签:

【中文标题】C#输出数组的最小数【英文标题】:C# output the lowest number of an array 【发布时间】: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 循环检查输入的值。 【参考方案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。当您对数组进行排序时,您将拥有所有开头的零。

【讨论】:

以上是关于C#输出数组的最小数的主要内容,如果未能解决你的问题,请参考以下文章

c#如何让递归函数输出多个结果

用c#比较三个数的大小,并输出最大数。

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

HNUCM-1435 最大最小值(分治法)

java输出最大值和最小值

如何使用数组 C# 将每月降雨量输出为“*”?