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 个(或其他)数字,否则其中会有0
s。但是您可以使用 List
代替数组。
问题是数组的默认值是0
。使用另一个变量来计算用户输入的项目数(在他输入 0 之前,这根本不是存储问题)或根据@stickybit 评论,使用List<int>
。
由于 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<int>
然后:-)【参考方案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#输出数组的最小数的主要内容,如果未能解决你的问题,请参考以下文章
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。