在控制台应用程序中,我试图检查年份的输入值是否介于1-10之间。
目前我还在使用以下方法检查输入是否为有效的int。
int numberOfYears;
Console.WriteLine("Enter the number of years:");
string numberOfYearsInput = Console.ReadLine();
while (!Int32.TryParse(numberOfYearsInput, out numberOfYears))
{
Console.WriteLine("Not a valid ammount, try again.");
numberOfYearsInput = Console.ReadLine();
}
我尝试将其更改为:
while (!Int32.TryParse(numberOfYearsInput, out numberOfYears))
{
Console.WriteLine("Not a valid ammount, try again.");
numberOfYearsInput = Console.ReadLine();
if (numberOfYears < 1 || numberOfYears > 10)
{
Console.WriteLine("Not a valid ammount, try again.");
numberOfYearsInput = Console.ReadLine();
}
}
但是,这允许不正确的输入值。我怎样才能将它结合起来才能发挥作用?
修改
已更改为以下并仍允许11,12等作为有效输入
Console.WriteLine("Enter the number of years:");
string numberOfYearsInput = Console.ReadLine();
while (!Int32.TryParse(numberOfYearsInput, out numberOfYears))
{
Console.WriteLine("Not a valid ammount, try again.");
numberOfYearsInput = Console.ReadLine();
if (numberOfYears >= 1 && numberOfYears <= 10)
{
Console.WriteLine("Not a valid ammount, try again.");
numberOfYearsInput = Console.ReadLine();
}
}
答案 0 :(得分:1)
在if语句中,您使用&#39; ||&#39;,但这是一个布尔OR,您需要使用&#39; AND&#39;声明。此外,您的较小/较大的运算符被反转,从而为您提供声明:
如果numberOfYears小于1或者numberOfYears大于10
如果要检查数字是否介于1和10之间,则该行应为:
if (numberOfYears >= 1 && numberOfYears <= 10)
'&&'
是布尔'AND'
运算符
'>='
和'<='
分别大于/小于或等于。
因此它检查numberOfYears是否大于或等于1且小于或等于10.
答案 1 :(得分:0)
它允许错误输入的原因是因为您正在使用OR操作数(||)。
这基本上告诉编译器年份需要高于而不是1 OR 低于 10。
因此,如果你添加一个数字,比如说100,实际上被评估为true,因为它在if语句条件的左侧保持为true。 (高于1)。
所以改成它:
public static void Main()
{
int numberOfYears = GetYears();
Console.WriteLine("Good work, years = " + numberOfYears);
}
public static int GetYears()
{
Console.WriteLine("Enter the number of years:");
string inputYears = Console.ReadLine();
int years;
while(!(Int32.TryParse(inputYears, out years))
|| (years < 1 || years > 10))
{
Console.WriteLine("Not a valid ammount, higher than 1, lower than 10!");
Console.WriteLine("Please enter a new number");
inputYears = Console.ReadLine();
}
return years;
}
这是一个小提琴,在评论中提出解决问题的方法:Fiddle
答案 2 :(得分:0)
试试这个
int numberOfYears;
Console.WriteLine("Enter the number of years:");
string numberOfYearsInput = Console.ReadLine();
bool result = false;
while (!result)
{
if (Int32.TryParse(numberOfYearsInput, out numberOfYears))
{
if (numberOfYears < 1 || numberOfYears > 10)
{
Console.WriteLine("Not a valid ammount, try again.");
numberOfYearsInput = Console.ReadLine();
}
else
{
result = true;
Console.WriteLine("Correct Number");
Console.ReadKey(true);
//Do your code here
}
}
else
{
Console.WriteLine("Not a valid number, try again.");
numberOfYearsInput = Console.ReadLine();
}
}
答案 3 :(得分:0)
我认为这类任务应该由oop标准制定,例如
public static bool BetweenRanges(int a,int b,int number)
{
return (a <= number && number <= b);
}
static void Main(string[] args)
{
Console.WriteLine("Enter the number of years:");
int numberOfYearsInput = Convert.ToInt16(Console.ReadLine());
while (!BetweenRanges(1,10, numberOfYearsInput))
{
Console.WriteLine("Not a valid ammount, try again.");
numberOfYearsInput = Convert.ToInt16(Console.ReadLine());
}
}
在这种情况下,您可以在更多地方使用BetweenRange
并使用任何类型的数字。代码更清晰,更好理解可能在这种情况下并不重要,但它是最佳实践。 (当代码增长时,将很容易理解)
如果是文本输入,您可以检查它并告诉用户不允许使用文本:
public static bool BetweenRanges(int a, int b, int number)
{
return (a <= number && number <= b);
}
static void Main(string[] args)
{
bool notValid = true;
while (notValid)
{
try
{
Console.WriteLine("Enter the number of years:");
int numberOfYearsInput = Convert.ToInt16(Console.ReadLine());
while (!BetweenRanges(1, 10, numberOfYearsInput))
{
Console.WriteLine("Not a valid ammount, try again.");
numberOfYearsInput = Convert.ToInt16(Console.ReadLine());
}
notValid = false;
}
catch
{
Console.WriteLine("Text is not valid ammount, try again.\n");
}
}
}
答案 4 :(得分:0)
问题出现在这行代码while (!Int32.TryParse(numberOfYearsInput, out numberOfYears))
中,因为它传递了所有有效数字,只有在输入不是有效数字时才进入循环。
尝试使用这段代码,让我知道它是否适合您
int numberOfYears;
while (true)
{
Console.WriteLine("Not a valid ammount, try again.");
if (!Int32.TryParse(Console.ReadLine(), out numberOfYears))
continue;
if (numberOfYears >= 1 && numberOfYears <= 10)
{
Console.WriteLine("Valid value");
break;
}
}