C # Блокировка определенных типов ответов с использованием значения часового - PullRequest
0 голосов
/ 07 октября 2018

Я пишу код для получения самой высокой оценки и самой низкой оценки.Это также собирает среднее.Он использует 999 для выхода из цикла do.Мне нужно, чтобы он прекратил добавлять неправильные ответы, а также 999, но я не могу заставить его работать.(mark! = 999) останавливает 999, добавление команды выхода к оценкам, которые мы пытаемся отследить, но мне нужно сделать так, чтобы она блокировала отметки выше 100 или ниже 0, и я не могу ее получитьна работу.

Блок кода, с которым я работаю, таков:

    if (mark != 999 && (mark < 0 || mark > 100))
                {
                    sum += mark;
                    count++;
                }

Это основная программа:

    int mark,
            sum = 0,
            lowMark = 100,
            highMark = 0,
            average,
            count = 0;
        char playagain = 'N';
        // In a do loop, ask the user to enter a grade for a student or 999 to quit
        do
        {
            do
            {
                Console.Write("Please enter a mark for the student or enter 999 to quit: ");
                mark = int.Parse(Console.ReadLine());
                while (mark != 999)
                {
                    if (mark != 999 && (mark < 0 || mark > 100))
                    {
                        sum += mark;
                        count++;
                    }
                    if (mark < lowMark)
                    {
                        lowMark = mark;
                    }
                    if (mark > highMark)
                    {
                        highMark = mark;
                    }
                    if (mark < 0 || mark > 100)
                    {
                        Console.WriteLine("Invalid input value.");
                        Console.Write("Please enter a mark for the student or enter 999 to quit: ");
                        mark = int.Parse(Console.ReadLine());
                    }
                    else break;
                }
            } while (mark != 999);

            average = sum / count;

            Console.WriteLine($"\nThe class average was {average}%");
            Console.WriteLine($"The highest mark was {highMark}% and the lowest mark was {lowMark}%");

            Console.WriteLine("\nWould you like to start again?: Y/N");
            playagain = char.Parse(Console.ReadLine());
            playagain = char.ToUpper(playagain);
        } while (playagain == 'Y');
        // In a while loop, the program will:
        // - Determine if the entered mark is the highest or lowest grade
        // - Validate the entered grade before entering another grade; display some error
        //   message if the grade is invalid (i.e. < 0 or > 100)
        // - Prompt the user to enter another grade or 999 to quit

        // If there are valid marks:
        // - Calculate the average grade for the class
        // - Display the average, highest, and lowest grades
        // Else, display some error message
        // - Prompt the user to redo the steps above or quit.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Попробуйте это.

class Program
{
    static void Main(string[] args)
    {
        bool playAgain = true;

        while (playAgain)
        {
            decimal mark = 0, lowMark = -1, highMark = -1, sum = 0, average = 0; 
            int count = 0;                

            do
            {
                Console.Write("Please enter a mark for the student or enter 999 to quit: ");

                if (!decimal.TryParse(Console.ReadLine(), out mark) || 
                    (mark < 0 || mark > 100 || (mark > 0 && mark < 1)))
                {
                    Console.WriteLine("Invalid input value.");
                    continue;
                }
                else
                {
                    mark = mark / (decimal)100;
                    sum += mark;
                    count++;
                    if (lowMark < 0 || mark < lowMark)
                    {
                        lowMark = mark;
                    }
                    if (mark > highMark)
                    {
                        highMark = mark;
                    }
                }
            } while (mark != 999);

            average = count == 0 ? 0 : sum / count;
            lowMark = lowMark < 0 ? 0 : lowMark;
            highMark = highMark < 0 ? 0 : highMark;

            Console.WriteLine("\nThe class average was {0}", 
                average.ToString("P1", CultureInfo.InvariantCulture));
            Console.WriteLine("The highest mark was {0} and the lowest mark was {1}", 
                highMark.ToString("P1", CultureInfo.InvariantCulture), 
                lowMark.ToString("P1", CultureInfo.InvariantCulture));
            Console.WriteLine("\nWould you like to start again?: Y/N");
            playAgain = Console.ReadKey().Key == ConsoleKey.Y;
            Console.WriteLine();
        }
    }
}
0 голосов
/ 07 октября 2018

Как указано в комментариях, эта строка

if (mark != 999 && (mark < 0 || mark > 100)) 

оценивается как истинная только тогда, когда вы вводите отметку меньше 0 или больше 100, что противоречит вашим требованиям.Таким образом, условие должно быть записано как

if (mark >= 0 && mark <= 100)

И для циклов while, точка решает , когда прервать или продолжить.Хорошей практикой является проверка условий в начале , если выполняются определенные условия, такие как ввод пользователем 999 или недопустимая отметка, немедленно прервите или продолжите, не идя дальше.

Так что для внутреннего цикла while , вы можете написать это так:

while (true)
{
    Console.Write("Please enter a mark for the student or enter 999 to quit: ");
    mark = int.Parse(Console.ReadLine());
    if (mark == 999) //get signal for exit
    {
        break;  //go no further, stop the loop
    }

    if (mark < 0 || mark > 100) //invalid inputs
    {
        Console.WriteLine("Invalid input value.");
        Console.Write("Please enter a mark for the student or enter 999 to quit: ");
        continue; //go no further, continue the loop, let user input again
    }

    //handle valid inputs
    sum += mark;
    count++;

    if (mark < lowMark)
    {
        lowMark = mark;
    }
    if (mark > highMark)
    {
        highMark = mark;
    }
}   
...