验证输入到多维数组

时间:2018-03-17 23:48:33

标签: c#

我不能让我的第二个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;

        }
    }
}

2 个答案:

答案 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);
    }
}

附加说明

  • 我已将您的逻辑移至GetScore;这有助于保持逻辑,以便从使用它的地方获得并验证价值,使得代码不那么复杂。
  • 通过使用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)).