我是初学者并且学习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!");
}
}
我认为这里的问题是你已经混淆了你的循环条件。您当前的代码说:
“虽然去年大于或等于零且小于或等于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;
当需要用户输入时,不要使用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");
}
无论如何这只是一个例子,生病留给你的细节
最后,你真的应该看看这个
几个改进。我将以下代码封装到一个单独的方法中。
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。