显示来自数组的信息时出现问题
本文关键字:问题 信息 数组 显示 | 更新日期: 2023-09-27 18:15:22
我正在尝试用c#代码(控制台应用程序)编写一个简单的程序,提示用户输入10个名称,然后以随机顺序(不是名称输入的顺序)在末尾显示10个名称
这是我得到的结果:-
static void Main(string[] args)
{
string[] names = new string [10];
int i;
for ( i = 0; i < 10 ; i++)
{
Console.WriteLine("Give me name " + (i+1) );
names[i] = Console.ReadLine();
}
for (int j = 0; j <= 10; j++)
{
Console.WriteLine(names[j]);
}
Console.ReadLine();
}
到目前为止,我已经能够提示用户输入10个名称,并存储这10个名称,并在最后显示它们,然而,一旦它们被显示,我得到错误:-"IndexOutOfRangeException未处理",Console.WriteLine(names[j]);
得到突出显示。
最后,一旦对这些问题进行了排序,我如何以随机顺序显示输入的名称?
从输入得到0到9,但尝试打印0到10。数组中不存在第10项。修改如下:
for (int j = 0; j < 10; j++)
{
Console.WriteLine(names[j]);
}
第一个循环从0运行到9,但第二个循环从0运行到10,因此您尝试显示数组中不存在的项。将循环中的j <= 10
更改为j < 10
(就像在第一个循环中一样),以循环到9而不是10。
更好的是,您可以在循环中使用i < names.Length
和j < names.Length
。这样,即使你改变数组的大小,循环也不会发生任何变化。
要以随机顺序显示项目,您需要洗牌数组。最好的方法是费雪-耶茨洗牌法。像这样排列数组中的项:
Random rnd = new Random();
for (int i = 0; i < names.Length − 1; i++) {
int j = rnd.Next(i, names.Length);
string tmp = names[i];
names[i] = names[j];
names[j] = tmp;
}
那么你就可以像现在这样显示数组中的项了(在循环中进行了校正)
要解决错误,只检查小于10 (<10)而不是小于或等于10 (<=10)使用random类获得随机顺序。确保只创建一个随机实例并调用Next,以便在紧循环
中生成新的随机数。Random random = new Random();
for (int j = 0; j < 10; j++)
{
int randomNumber = random.Next(1,10);
Console.WriteLine(names[randomNumber-1]);
}
问题是您的索引是基于0的,并包含10个条目,但最后一个是Array[9]而不是Array[10]
{弗兰克,保罗,约翰}
所以Array[0]是Frank,数组[3]是…超出范围
循环使用
for (int j = 0; j <= 10; j++)
{
Console.WriteLine(names[j]);
}
第一次通过,j = 0,名字[j]对我们来说就是Frank。你的问题是,因为10 <= 10确实为真,所以它正在寻找j[10],而j[10]并不存在。
解决方案是改变j <10
for (int j = 0; j < 10; j++)
{
Console.WriteLine(names[j]);
}