错误输入后继续在类之间循环

时间:2015-10-07 16:09:25

标签: c#

我正在尝试创建一个类,它将从控制台窗口收集一些整数。该类首先询问要求总和的数量,然后从控制台读取多个整数。

如果用户输入一个带小数的数字,这是不允许的,我有另一个名为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();
}

3 个答案:

答案 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;
    }
}