在我的程序中,我要求用户输入数组的大小,然后用用户输入的数字填充数组。
然后用户输入一个数字,该数字将检查数组中是否存在。如果是,它将向控制台打印一条消息。
我希望能够根据数组中数字的位置打印不同的消息。
如果是第1日,第21日,第31日等......将打印不同的信息
如果是第2次,第22次,第32次等,则会打印另一条消息
如果是第3次,第23次,第33次等,则会打印不同的信息
然后默认情况是,如果它是“th”号码之一,将打印另一条消息
这是我的代码的一部分,它只适用于前10个数字。我遇到的问题是,11日,12日,13日不遵循正常规则,任何以11,12或13结尾的数字。
Console.Write("Now enter a number to compare: ");
int c = Convert.ToInt32(Console.ReadLine());
int pos = Array.IndexOf(arr, c);
if (pos > -1)
{
switch (pos)
{
case 0:
Console.WriteLine("{0} is the {1}st number in this list", c, pos + 1);
break;
case 1:
Console.WriteLine("{0} is the {1}nd number in this list", c, pos + 1);
break;
case 2:
Console.WriteLine("{0} is the {1}rd number in this list", c, pos + 1);
break;
default:
Console.WriteLine("{0} is the {1}th number in this list", c, pos + 1);
break;
}
}
else
{
Console.WriteLine("Sorry this number does not appear in the array");
}
我宁愿不手动输入它,因为最终我将使用大尺寸数组。
我想要么能够使用通配符(*)或逗号,但它不会让我。如果不手动输入每个数字,解决这个问题的简单方法是什么?
答案 0 :(得分:6)
只需将switch (pos)
更改为switch(pos % 10)
并调整您的switch语句:
switch (pos % 10)
{
case 1:
Console.WriteLine("{0} is the {1}st number in this list", c, pos);
break;
case 2:
Console.WriteLine("{0} is the {1}nd number in this list", c, pos);
break;
case 3:
Console.WriteLine("{0} is the {1}rd number in this list", c, pos);
break;
default:
Console.WriteLine("{0} is the {1}th number in this list", c, pos);
break;
}
modulo operator %
将为您提供整数除法pos / 10
的其余部分 - 即一个始终在[0, 9]
范围内的整数。除了特殊情况11,12和13之外,这足以使其余代码几乎完成。
要处理这些案例而不弄乱switch
案例本身,您可以将解决方案扩展到
var position = (pos == 11 || pos == 12 || pos == 13) ? 999 : pos % 10;
switch (position)
{
...
}
上面的数字999是一个完全随意的选择,需要落入default
switch
的情况。我在这里使用了999来消除误传的可能性;如果您愿意,可以选择其他号码。
答案 1 :(得分:3)
使用模运算符(数字%10)。