即使输入错误,程序也会退出循环

时间:2018-09-05 22:41:20

标签: c#

我是一个初学者,正在学习C#。

我正在尝试做作业,但被卡住了。即使我输入了错误的输入,我的程序也会退出循环。

这是我的代码:

public class Program
{
    private static void Main(string[] args)
    {
        int lastYear = 0, thisYear = 0, totalRev;

        while (lastYear >= 0 && lastYear <= 30)
        {
            WriteLine("Enter number contestants last year >> ");
            lastYear = int.Parse(ReadLine());
            lastYear++;
        }

        WriteLine("Number must be between 0 and 30");
        WriteLine("Enter number contestants last year >> ");

        while (thisYear >= 0 && thisYear <= 30)
        {
            WriteLine("Enter num contestants this year >> ");
            thisYear = int.Parse(ReadLine());
        }

        WriteLine("Number must be between 0 and 30");

        totalRev = thisYear * 25;
        WriteLine($"last year's competition has {lastYear} conts, and this year's has {thisYear} conts " +
            "\nRevnue expected this year is {totalRev.ToString("c")} ");

        if (thisYear > lastYear && thisYear <= (lastYear * 2))
            WriteLine("The competition is bigger than ever!");
        else if (thisYear < lastYear)
            WriteLine("A tighter race this year! Come out and cast our vote!!");
        else if (thisYear > lastYear * 2)
            WriteLine("The competition is more than twice as big this year!");
    }
}

3 个答案:

答案 0 :(得分:2)

在需要用户输入时不要使用int.Parse,如果您输入的不是整数,该怎么办? am!计算机不知道您想要什么,无法弄清它,奇异性发生并吸收了整个宇宙,我们都死了(或者只是抛出了异常)...

改为使用TryParse

  

将数字的字符串表示形式转换为其32位带符号   等价的整数。返回值指示操作是否   成功。

您的编程可能正在退出,因为int.Parse抛出ArgumentException并在输入无效时立即退出

更好的模式是

while (thisYear >= 0 && thisYear <= 30)
{
    WriteLine("Enter num contestants this year >> ");
    while(!int.TryParse(ReadLine(), out thisYear))
       WriteLine("OMG you had one job! try again");
}

无论如何,这只是一个例子,请您自行决定细节

最后,您真的应该看看这个

Navigating through Code with the Debugger

答案 1 :(得分:1)

我认为这里的问题是您混淆了循环条件。您当前的代码如下:

  

“去年的值大于或等于0且小于或等于30(有效值)时,请继续输入数字”

您要说的是:

  

“去年的值小于零或大于30(无效值),请继续输入数字”

以下代码片段可以解决该问题。注意,我添加了一个bool firstLoop = true变量,因此我们第一次不会显示错误消息,并且还将初始值设置为 invalid 值,因此循环条件至少会运行一次:

int lastYear = -1, thisYear = -1, totalRev;

bool firstLoop = true;

while (lastYear < 0 || lastYear > 30)
{
    if (firstLoop == false)
    {
        Console.WriteLine("ERROR: Number must be from 0 to 30:. Please try again.");
    }

    Console.WriteLine("Enter number contestants last year (0 - 30) >> ");
    lastYear = int.Parse(Console.ReadLine());

    firstLoop = false;
}

firstLoop = true;

while (thisYear < 0 || thisYear > 30)
{
    if (firstLoop == false)
    {
        Console.WriteLine("ERROR: Number must be from 0 to 30:. Please try again.");
    }

    Console.WriteLine("Enter number contestants this year (0 - 30) >> ");
    thisYear = int.Parse(Console.ReadLine());

    firstLoop = false;
}

但是,看看该代码,我们发现有很多重复。实际上,除了我们要发送给用户的消息和我们要测试/设置的变量外,它是完全相同的。这意味着将其引入自己的方法中是个不错的选择。

如果我们有一个可以传递一个字符串(它将显示给用户)的方法,并且可以传递最小和最大有效值,并且它将为我们返回用户输入,那就太好了!

我们可以使方法主体中的代码循环运行,并可以使用int.TryParse来验证用户的输入。 int.TryParse接受一个字符串参数和一个整数输出参数,如果可以将字符串转换为整数,则返回true,并将输出参数设置为该值。这很方便,因为我们可以使用返回值来测试输入是否为有效整数,并且可以使用输出参数来测试输入是否在可接受的范围内:

private static int GetIntFromUser(string prompt, int minValue, int maxValue)
{
    Console.Write(prompt);

    int result;

    while (!int.TryParse(Console.ReadLine(), out result) || 
        result < minValue || 
        result > maxValue)
    {
        Console.WriteLine("Error: number must be from " + minValue + " to " + maxValue);
        Console.Write(prompt);
    }

    return result;
}

现在使用此方法,我们的主代码已 GREATLY 简化:

int lastYear = GetIntFromUser("Enter number contestants last year (0 - 30) >> ", 0, 30);
int thisYear = GetIntFromUser("Enter number contestants this year (0 - 30) >> ", 0, 30);
int totalRev = thisYear * 25;

答案 2 :(得分:0)

改进的夫妇。我将以下代码封装到一个单独的方法中。

void GetYearInput(ref int year)
{
    while (lastYear >= 0 && lastYear <= 30)
    {
        Console.WriteLine("Enter number contestants last year >> ");
        lastYear = int.Parse(Console.ReadLine());
        lastYear++;
    }
}

//根据您的需要更改方法。 另外,对于int.Parse,我将使用int.TryParse,如下所示:

bool ifSuccess = int.TryParse(val, out result);

请记住,如果val是无效输入,结果将为0。因此,检查ifSuccess至关重要。

您可以将方法名称更改为GetValidYear或IsValidYear()。

此外,在这里可能关系不大,但是对于多个if,我宁愿嵌套if:

if (thisYear > lastYear)
{
    if (thisYear <= (lastYear * 2))
    {}
    else if (thisYear > lastYear * 2)
    {}
    else {}
}
else if (thisYear < lastYear)
{}
else if(thisYear == lastYear) {}     

请避免重复,复制/粘贴代码并在必要时进行重构。小型可维护方法易于测试,维护bla bla。

有关refout的更多信息在这里。