我不能让我的第二个if语句按预期工作。它正在将数据添加到阵列中,即使它已被验证为不正确。例如:控制台提示;
为学生输入分数:1
然后,如果输入500,则会出现以下提示:
请输入0到100之间的值。
为学生1输入分数:
不是在#34;得分1"要输入正确的数据。
我不明白为什么,因为第一个if语句就是这样,将数组保持在[0,0]直到输入正确的数据。
static bool IsInRange (int input)
{
return input >= 0 && input <= 100;
}
for (int studentIndex = 0; studentIndex < studentCount; studentIndex++)
{
for (int scoreIndex = 0; scoreIndex < scoreCount; scoreIndex++)
{
int parsedScore = -1;
string score = string.Empty;
while(!IsNumeric(score) && !IsInRange(parsedScore))
{
Console.WriteLine("Enter score: {0} for student: {1}", scoreIndex + 1, studentIndex + 1);
score = Console.ReadLine();
if (!IsNumeric(score))
{
Console.WriteLine(string.Empty);
Console.WriteLine("Please enter a numeric value.");
continue;
}
parsedScore = Convert.ToInt32(score);
if (!IsInRange(parsedScore))
{
Console.WriteLine(string.Empty);
Console.WriteLine("Please enter a value between 0 and 100");
}
studentScores[studentIndex, scoreIndex] = parsedScore;
}
}
}
答案 0 :(得分:2)
您的具体问题是!IsNumeric(score) && !IsInRange(parsedScore)
行。
即
Is Numeric | Is In Range | Result Of Condition
----------------------------------------------
True | True | False
True | False | False
False | True | False
False | False | True
......虽然你想要
Is Numeric | Is In Range | Result Of Condition
----------------------------------------------
True | True | False
True | False | True
False | True | True
False | False | True
即。 while (!IsNumeric(score) || !IsInRange(parsedScore))
或while (!(IsNumeric(score) && IsInRange(parsedScore))
。
但是,我建议你再进一步重构:
static bool IsInRange (int input)
{
return input >= 0 && input <= 100;
}
static int GetScore (int studentIndex, int intscoreIndex)
{
int parsedScore;
var isValid = false;
while (!isValid)
{
Console.WriteLine("Enter score: {0} for student: {1}", scoreIndex + 1, studentIndex + 1);
var score = Console.ReadLine();
if (IsNumeric(score))
{
parsedScore = Convert.ToInt32(score);
if (IsInRange(parsedScore))
{
isValid = true;
}
else
{
Console.WriteLine(string.Empty);
Console.WriteLine("Please enter a value between 0 and 100");
}
}
else
{
Console.WriteLine();
Console.WriteLine("Please enter a numeric value.");
}
}
return parsedScore;
}
for (int studentIndex = 0; studentIndex < studentCount; studentIndex++)
{
for (int scoreIndex = 0; scoreIndex < scoreCount; scoreIndex++)
{
studentScores[studentIndex, scoreIndex] = GetScore(studentIndex, scoreIndex);
}
}
附加说明
IsValid
标志,您可以避免两次评估相同的逻辑(即实际验证时一次,第二次决定是否循环)。答案 1 :(得分:1)
我认为你必须添加继续,否则它只会将其保存到数组中。由于继续将强制它退出当前循环,它将永远不会将其保存到studentScores。
if (!IsInRange(parsedScore))
{
Console.WriteLine(string.Empty);
Console.WriteLine("Please enter a value between 0 and 100");
continue;
}
虽然我的第一个答案没有提供解决方案,JohnLBevan确实正确地解释了这个问题,并发现了while循环的问题。
while (!IsNumeric(score) || !IsInRange(parsedScore))
// or
while (!(IsNumeric(score) && IsInRange(parsedScore)).