我是一个初学者,正在学习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!");
}
}
答案 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");
}
无论如何,这只是一个例子,请您自行决定细节
最后,您真的应该看看这个
答案 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。