我编写了这个小程序,它捕获了在控制台上连续输入的五个整数。
这符合预期 - 除了一件事:
我没有找到接受0作为输入数字之一的方法
当然,另一种收集类型的解决方案很容易
但这里的挑战是用五个整数数组来做
我试图设置一个布尔标志" zeroEntered",尝试用计数器,试图计算j backwwards。一切都行不通
也许这是不可能的?有人肯定会知道吗?
这是代码:
class Program
{
static void Main(string[] args)
{
#region Catch5IntegerInArrayOfInt[5]
// I try to catch five integers in an array of int[5]
// This works as expected except I cannot catch 0 as one of the numbers
// Cannot wrap my head around this one it seems
// because all ints are initialized with 0
Console.WriteLine("Please enter five unique numbers consecutively.");
int[] fiveNumbers = new int[5]; // do it using an array just the same (as collections were not part of the lectures so far)
for (int i = 0; i < fiveNumbers.Length; i++)
{
Console.WriteLine("Please enter your {0} number:", (Countables)i);
CatchUsersNumbers(fiveNumbers, i);
}
DisplayResult(fiveNumbers);
Console.WriteLine("\n");
}
#endregion
#region HelperMethods
private static bool CheckWhetherInteger(string userInput)
{
bool result = Int32.TryParse(userInput, out myInteger);
if (result == false)
{
Console.Clear();
Console.WriteLine("You did not enter an integer.");
}
return result;
}
private static bool CheckUniqueness(int[] fiveNumbers, int userInput)
{
for (int i = 0; i < fiveNumbers.Length; i++)
{
if (userInput == 0)
{
for (int j = i ; j <fiveNumbers.Length; j--)
{
if (j == 0)
break;
if (fiveNumbers[j] == 0)
{
return false;
}
}
}
else if (fiveNumbers[i] == userInput)
{
return false;
}
}
return true;
}
private static void CatchUsersNumbers(int[] fiveNumbers, int i)
{
while (true)
{
userInput = Console.ReadLine().Trim();
if (CheckWhetherInteger(userInput) && CheckUniqueness(fiveNumbers, myInteger))
{
fiveNumbers[i] = myInteger;
break;
}
else
Console.Clear();
Console.WriteLine("You did not enter a unique integer number, try again...");
}
}
private static void DisplayResult(int[] fiveNumbers)
{
Console.Clear();
Array.Sort(fiveNumbers);
Console.WriteLine("These are the five interger numbers you entered \nand that were stored in the array:\n");
for (int i = 0; i < fiveNumbers.Length; i++)
{
if (i != fiveNumbers.Length - 1)
Console.Write(fiveNumbers[i] + ", ");
else
Console.Write(fiveNumbers[i]);
}
}
#endregion
#region Class Variables
private static int myInteger = 0;
private static string userInput;
private enum Countables
{
first = 0,
second,
third,
fourth,
fifth
}
#endregion
}
谢谢。
答案 0 :(得分:1)
有可能,但是你的5个整数数组将被初始化为5个零,所以当扫描唯一性时,你的检查会失败,特别是因为这段代码:
if (fiveNumbers[j] == 0)
{
return false;
}
因此,您应该保留一个计数器来跟踪数组中已有的项目数,而不是遍历整个数组。然后,在执行检查时,只检查该索引,并且不包括检查中的其他项,因为它们包含0,但您应该将它们视为未初始化。
您也可以使用其他数据类型解决此问题。例如,您可以创建一个可以为空的整数数组,这样您就可以实际检查某个项是否已经有值。或者(也许是最好的解决方案)你可以使用List而不是数组。
答案 1 :(得分:0)
你唯一的错误是int.TryParse()将0视为无效你可以创建另一个if语句来处理异常,但这看起来不太干净
private static bool CheckWhetherInteger(string userInput)
{
if (userInput == "0")
{
myInteger = 0;
return true
}
else
{
bool result = Int32.TryParse(userInput, out myInteger);
if (result == false)
{
Console.Clear();
Console.WriteLine("You did not enter an integer.");
}
}
return result;
}
答案 2 :(得分:0)
我发布解决方案 - 使用可空整数 - 正如Golez Trol所建议的那样。在这里,如果有人有兴趣:
autocapitalize="off"
感谢您的提示 - 我真的被卡住了。