Программа на C — вывод ошибочных оценок

#c

#c

Вопрос:

Программа на языке Си. Используемая среда IDE — Xcode v12.2.

Проблема, с которой я сталкиваюсь:

Ошибочный вывод баллов. Для каждого раунда программа должна выводить самые высокие и самые низкие результаты, а также средний балл, если игрок решит это сделать.

Вывод результатов после игры в течение 1 раунда:

 Enter 'S' to show results
Enter 'P' to play another round
Enter 'R' to return to the main menu
S
Round 0 score: 92/100
Highest score: 92/100
Lowest score: 92/100
Average score:inf
****** Player: MAX ******
 

Вывод результатов после игры в течение 2 раундов:

 Enter 'S' to show results
Enter 'P' to play another round
Enter 'R' to return to the main menu
S
Round 0 score: 95/100
Highest score: 95/100
Lowest score: 92/100
Average score:inf
****** Player: MAX ******
 

Вопросы:

Почему «Раунд 1» отображается как «Раунд 0»? И что означает «inf» в разделе «средний балл»? Как мне превратить ‘inf’ в числовой вывод? После 2 раундов вывод «Раунд 2» по-прежнему отображается как «Раунд 0», а «Средний балл» не изменился на числовой вывод.

Что я пробовал:

 void quiz(char name[])
{
    // function created to enclose quiz functionality apart from instructions
    int rounds = 0;
    int highest = 0;
    int lowest = INT_MAX;
    float allScore = 0;
    float avg = 0;

    int i, j, g = 0;
    //char x;
    struct struc test[MAX_TESTS];

    srand((unsigned) time(NULL));

    for (;;)
    {
        rounds  ;
        for (i = 0; i < MAX_TESTS; i  )    // generate all questions
        {
            ctm_i(amp;test[i]);

            for (j = 0; j < i; j  )

                if (test[i].a == test[j].a amp;amp; test[i].b == test[j].b amp;amp; test[i].c == test[j].c)
                    //if question is already present
                    ctm_i(amp;test[i]);    //then re-generate
        }
        //int ig = getchar();
        char x;
        x = getchar();
        printf("n Are you ready? Press Enter key to continue. ");
        fflush(stdin);
        while (x != 'n') {}
        while (getchar() != 'n') {}
        //getchar();

        for (i = 1; i <= 5; i  )
        {
            printf(                " *******************************************************************"
                "**"
                "***********n");

            printf(                " ..................................................................."
                ".."
                "...........n");
        }

        // Take quiz
        for (i = 0; i < MAX_TESTS; i  )
            tcm_i(amp;test[i], i);

        printf(" Endnn");

        bool done = false;
        bool unsure = true;
        bool showS = true;

        while (unsure)
        {
            unsure = false;
            puts("n");
            if (showS)
            {
                puts(" Enter 'S' to show results");
            }
            puts(" Enter 'P' to play another round");
            //puts(" Enter 'Q' to quit");
            puts(" Enter 'R' to return to main menu");
            char choice;
            printf(" ");
            myread("%c", amp;choice);
            if (choice == 'r' || choice == 'R')
            {
                done = true;
            }
            else if (choice == 'S' || choice == 's')
            {
                showS = false;
                // calculate total score for current round
                g = 0;
                for (i = 0; i < MAX_TESTS; i  )
                {
                    g  = test[i].grade;    //add score of each question
                }
                allScore  = g;    //add current round's score to total
                avg = allScore / rounds;    //average of all rounds

                if (g > highest)
                {
                    highest = g;
                }

                if (g < lowest)
                {
                    lowest = g;
                }

                if (rounds == 1)
                {
                    printf(" Final score: %d/100n", g);    //display round score
                    printf(" ******Player: %s ******n", name);
                }
                else
                {
                         //puts("Whoops! Looks like highest/lowest have not been adjusted!");
                    printf(" Round %d score: %d/100n", rounds, g);    //display round score
                    printf(" Highest score: %d/100n", highest);
                    printf(" Lowest score: %d/100n", lowest);
                    printf(" Average score: %fn", avg);
                    printf(" ******Player: %s ******n", name);
                }
                unsure = true;
                //getchar();
            }
            else if (choice == 'P' || choice == 'p')
            {
                g = 0;
                for (i = 0; i < MAX_TESTS; i  )
                {
                    g  = test[i].grade;    //add score of each question
                }
                allScore  = g;    //add current round's score to total
                if (g > highest)
                {
                    highest = g;
                }

                if (g < lowest)
                {
                    lowest = g;
                }
            }
            else
            {
                puts(" Invalid input!");
                unsure = true;
            }
        }
        if (done)
            break;
    }
}
 

Комментарии:

1. rounds всегда равно 0. Деление на 0 дает вам бесконечность, представленную inf . Если это когда-либо будет true while (x != 'n') , это будет бесконечный цикл, поскольку x не может измениться в теле цикла. Если вы хотите lowest и highest должны основываться на отдельных оценках, то ваш код для их вычисления находится не в том месте. Прямо сейчас он использует общее количество всех оценок. Ваше форматирование также ужасно и значительно затрудняет чтение вашего кода, что может легко привести к ошибкам.

2. Приношу свои извинения за ужасное форматирование, сейчас я его отредактировал.

3. Не вносите существенных изменений в вопрос после получения ответов. Особенно изменения, которые меняют достоверность ваших ответов. В частности, изменение представленного кода для решения проблем, описанных в ваших ответах, является плохой формой. Это сайт вопросов и ответов , а не дискуссионный форум.

Ответ №1:

Почему «Раунд 1» отображается как «Раунд 0»?

Значение переменной rounds печатается как круглое число. Если круглое число всегда печатается как 0, то из этого следует, что rounds оно всегда имеет нулевое значение в точке, где выполняется этот printf() вызов. И действительно, взгляд на все появления этой переменной в вашем коде показывает, что она инициализируется нулем в своем объявлении, а затем никогда не изменяется.

И что означает «inf» в разделе «средний балл»?

Это означает «бесконечность», и, прежде чем даже взглянуть на ваш код, я бы воспринял это как признак того, что вы где-то использовали результат деления ненулевого числа с плавающей запятой на ноль.

В частности, проблема, похоже, та же, что и предыдущая: вы используете rounds в качестве делителя при вычислении среднего балла, и он всегда равен нулю.

Как мне превратить ‘inf’ в числовой вывод?

Измените ошибочное вычисление на правильное. rounds Может быть достаточно правильного сохранения значения переменной.

После 2 раундов вывод «Раунд 2» по-прежнему отображается как «Раунд 0», а «Средний балл» не изменился на числовой вывод.

Это согласуется с моими наблюдениями выше.

Комментарии:

1. Для проблемы с «круглым 0» я обнаружил, что использование round ; было бы отличным способом вывода правильных чисел. На данный момент вывод среднего результата после игры в течение 2 раундов изменился на добавление как самых высоких, так и самых низких результатов, без деления на 2. И я все еще работаю над этим, есть какие-нибудь советы?

2. @TheNovice, похоже, ты все еще вычисляешь среднее значение на основе неправильного количества раундов. Я не склонен повторно анализировать ваш код в свете изменений, но я подозреваю, что вы увеличиваете rounds его в неправильном месте.

3. Я только что изменил свой код в соответствии с вашими советами, и теперь он отлично работает.