我正在尝试创建一个类,它将从控制台窗口收集一些整数。该类首先询问要求总和的数量,然后从控制台读取多个整数。
如果用户输入一个带小数的数字,这是不允许的,我有另一个名为Input.cs的类,它会发回一条消息,要求他们再试一次。
该类有4个方法,WriteProgamInfo,ReadInput,SumNumbers和ShowResults。
WriteProgamInfo只显示Console.WriteLine
的一些信息,ReadInput询问用户想要添加多少个数字,
private void ReadInput()
{
Console.Write("Number of values to sum? ");
numOfInput = Input.ReadIntegerConsole(); //This here is from the Input class that sends an error message if a decimal is being used. This works fine.
Console.WriteLine();
}
但现在我遇到了这个问题,在SumNumbers中它要求用户使用for循环给出他/她想要添加的数字的值,该循环取决于用户在ReadInput中输入的内容。
// asks for which numbers to be added, based on how many times
// is given by user in ReadInput
private void SumNumbers()
{
int index;
int num = 0;
for (index = 1; index <= numOfInput; index++) // Loop that asks the quesion d
{
Console.Write("Please give the value no. " + index + " (whole number):");
//This here is from the Input class that sends an error message if a decimal
//is being used. This is where I have a problem.
num = Input.ReadIntegerConsole2();
sum += num;
}
}
我遇到的问题是我希望错误消息在发送消息后继续for循环。 例如,我想要加2个数字,所以我先添加1,然后控制台打印:请给出值2(整数):但是,让我说我然后键入1.6这是不允许的,控制台然后打印:输入错误。请再试一次:,现在这就是我希望它继续与之前相同的问题:“请给出值2(整数):”
我该怎么做? 输入类如下所示:
public static int ReadIntegerConsole2()
{
int input;
if (int.TryParse(Console.ReadLine(), out input))
return input;
else
Console.WriteLine("Wrong input. Please try again: ");
Console.Write("Please give the value no. " + /*index from SumNumbers + */" (whole number):");
return ReadIntegerConsole2();
}
答案 0 :(得分:2)
您可以使用Int32.TryParse使用的相同模式。这意味着您将要添加的数字作为out参数传递,如果数字无效,则返回布尔值
public static bool ReadIntegerConsole2(out int number)
{
int input;
bool ok = true;
number = 0;
if (int.TryParse(Console.ReadLine(), out input))
number = input;
else
{
ok = false;
Console.WriteLine("Wrong input. Please try again: ");
}
return ok;
}
现在在调用代码中,您可以控制循环,知道调用ReadInteger2的结果
private void SumNumbers()
{
int index;
int num = 0;
for (index = 1; index <= numOfInput; index++)
{
Console.Write("Please give the value no. " + index + " (whole number):");
if(Input.ReadIntegerConsole2(out num))
sum += num;
else
// Decrement the counter to avoid skipping an input
index--;
}
}
答案 1 :(得分:2)
有许多方法可以实现您的目标。但在我看来,最明显的一个是遵循您已经使用的int.TryParse()
设置的示例。将ReadIntegerConsole2()
方法更改为以相同方式工作:
public static bool TryReadIntegerConsole2(out int input)
{
if (int.TryParse(Console.ReadLine(), out input))
return true;
Console.WriteLine("Wrong input. Please try again: ");
return false;
}
然后在你的循环中使用它:
private void SumNumbers()
{
int index;
int num = 0;
for (index = 1; index <= numOfInput; index++) // Loop that asks the quesion d
{
do
{
Console.Write("Please give the value no. " + index + " (whole number):");
} while (!Input.TryReadIntegerConsole2(out num));
sum += num;
}
}
答案 2 :(得分:1)
当您尝试检索第二个值时,继续循环,直到您检索的值对您的案例有效。
private int GetUserValue(int index)
{
var secondValueValid = false;
int secondValue;
do
{
Console.WriteLine("Please enter the value at index {0}: ", index);
if(int.TryParse(Console.ReadLine(), out secondValue))
{
secondValueValid = true;
}
else
{
Console.WriteLine("Value entered is not a whole integer, please try again.");
}
}
while(!secondValueValid)
return secondValue;
}
这将循环,直到用户输入一个整数值,在这种情况下,它将退出循环并返回输入的值,并且在SumNumbers
方法中,您需要做的只是:
private void SumNumbers()
{
int index;
int num = 0;
for (index = 1; index <= numOfInput; index++)
{
num = GetUserValue(index);
sum += num;
}
}