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

问题描述 投票:-3回答:3

我是初学者并且学习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!");
    }
}
c#
3个回答
1
投票

我认为这里的问题是你已经混淆了你的循环条件。您当前的代码说:

“虽然去年大于或等于零且小于或等于30(有效值),但仍要求提供一个数字”

你想要它说的是:

“虽然去年小于零或大于30(无效价值),但继续要求一个数字”

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

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,并将输出参数设置为该值。这很方便,因为我们可以使用返回值来测试输入是否是有效整数,并且我们可以使用output参数来测试它是否在可接受的范围内:

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

现在有了这个方法,我们的主要代码非常简单:

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
投票

当需要用户输入时,不要使用int.Parse,如果输入的内容不是int,该怎么办?巴姆!计算机不知道你想要什么,不能弄明白,奇点发生在整个宇宙中,我们都死了,(或者只是抛出和异常)......

请改用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


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很重要。

您可以将methodname更改为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的更多信息,请点击此处。

© www.soinside.com 2019 - 2024. All rights reserved.