2

最低平均の表示に問題があります。試験のスコア入力を終了する終了値を作成しました。-999 をトリガーして最低の試験スコアを表示すると、実際の最低スコアではなく -999 の値が表示されます。この値を除外するにはどうすればよいですか?

これが私のコードです:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int menuChoice, scoreCount = 0;
    float examScore = 0.0, 
          maxScore = 0.0,
          minScore = 0.0, 
          avgScore = 0.0, 
          sumScore = 0.0;

    printf("************************************\n");
    printf("1-> Enter an Exam Score\n");
    printf("2-> Display the highest exam score\n");
    printf("3-> Display the lowest exam score\n");
    printf("4-> Display the average exam score\n");
    printf("5-> Quit the program\n");
    printf("************************************\n\n");

    printf("Select a number that corresponds to the menu :\n");
    scanf("%d", &menuChoice);

    while(menuChoice != 5) 
    {
        switch(menuChoice)
        {
        case 1:
            while(examScore != -999)
            {
                printf("Enter an exam score (enter -999 to quit score input):\n");
                scanf("%f", &examScore);
                printf("The score you've entered equates to : %.2f\n\n", examScore);
                scoreCount++;

                if(maxScore < examScore)
                {
                    maxScore = examScore;
                }
                if(minScore > examScore)
                {
                    minScore = examScore;
                }
                else if(examScore < 0 || examScore > 100)
                {
                  printf("Exam Scores range from 0.0 - 100.0\n");
                }
                sumScore += examScore;
                avgScore = sumScore / scoreCount;
            }
            break;

        case 2:
            printf("The highest exam score is : %.2f\n", maxScore);
            break;

        case 3:
            printf("The lowest exam score is : %.2f\n", minScore);
            break;

        case 4:
            printf("The average exam score is : %.2f", avgScore);              
            break;

        default:
            printf("You've entered an invalid menu choice, review more carefully!");
            break;
        }

        printf("Select a number that corresponds to the menu :\n");
        scanf("%d", &menuChoice);
    } 

    system("pause");
    return 0;
}
4

7 に答える 7

1

while ループのロジックを修正します。-999minScoreかどうかを確認する前に更新するので、それは良くありません。examScore

また、変数を使用する前のように変数を初期化する必要があり、フロートexamScoreのように正確な比較を行うべきではありません。examScore != -999int に変更するか、 のようなより寛容な比較を行ってexamScore < -998ください。

于 2012-05-29T22:49:52.437 に答える
1

次のプログラムを検討してください。呼ばれますdo_stuffか?

int foo;
while (foo != 5) {
   foo = 5;
   do_stuff();
}

fooは初期化される前にテストされるため、実際の動作は未定義です。あなたのコードには、同じ問題がありexamScoreます。これは宿題なので、これは単なるヒントです。上記の単純なプログラムをどのように修正しますか?

于 2012-05-29T22:52:40.587 に答える
0

値のほかに論理エラーがあり、 2つのinitフロートを直接比較する問題があります。ケース1のwhileループでは、ユーザー入力が最初に終了条件を満たしているかどうかを判断してから、それを処理する必要があります。また、minScoretwain249が言ったように、割り当ての前に比較する必要があります。

于 2012-05-30T02:44:05.413 に答える
0
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int scoreCount = 0;
    float maxScore = -1000.0,
          minScore = 1000.0,
          sumScore = 0.0;

    printf("************************************\n");
    printf("1-> Enter Exam Scores\n");
    printf("2-> Display the highest exam score\n");
    printf("3-> Display the lowest exam score\n");
    printf("4-> Display the average exam score\n");
    printf("5-> Quit the program\n");
    printf("************************************\n\n");

    for(;;)
    {
        int menuChoice;
        printf("Select a number that corresponds to the menu:\n");
        scanf("%d", &menuChoice);

        if(scoreCount == 0 && menuChoice >= 2 && menuChoice <= 4)
        {
            printf("Please enter some scores by choosing menu item 1\n");
            continue;
        }

        switch(menuChoice)
        {
        case 1:
            for(;;)
            {
                float examScore;
                printf("Enter an exam score (enter -999 to quit score input):\n");
                scanf("%f", &examScore);
                if (examScore == -999)
                    break;
                printf("The score you've entered equates to : %.2f\n\n", examScore);
                if(examScore < 0 || examScore > 100)
                {
                    printf("Exam scores range from 0.0 - 100.0\n");
                    continue;
                }

                sumScore += examScore;
                ++scoreCount;

                if(maxScore < examScore)
                {
                    maxScore = examScore;
                }
                if(minScore > examScore)
                {
                    minScore = examScore;
                }
            }
            break;

        case 2:
            printf("The highest exam score is : %.2f\n", maxScore);
            break;

        case 3:
            printf("The lowest exam score is : %.2f\n", minScore);
            break;

        case 4:
        {
            float avgScore = sumScore / scoreCount;
            printf("The average exam score is : %.2f\n", avgScore);
            break;
        }

        default:
            printf("You've entered an invalid menu choice, review more carefully!");
            break;
        }
    }

    return 0;
}
于 2012-06-02T03:10:14.003 に答える
0

このコードの問題は、ユーザーが -999 を入力すると、それがテスト スコアとして処理されることです。ユーザー入力の直後にループが中断されるように、ループを再構築する必要があります。

于 2012-05-29T22:52:29.780 に答える
0

他の誰もが言ったように、-999そのスコアを処理した後にチェックを行います。また、現在の試験が低い場合にのみ更新するminScore必要があるため、次のようなものにする必要があると思います。

if(maxScore < examScore)
{
    maxScore = examScore;
}

if(minScore > examScore)
{
   minScore = examScore;
}

最後に、変数を使用する前にすべての変数を初期化する必要があります。

編集:

while(...) 
   printf("Enter an exam score (enter -999 to quit score input):\n");
   scanf("%f", &examScore);
   printf("The score you've entered equates to : %.2f\n\n", examScore);

   if(examScore < 0 || examScore > 100)
   {
       printf("Exam Scores range from 0.0 - 100.0\n");
       continue; //goes back to the top of the loop skipping everything else
   } 
   //At this point you know the score is valid so you can process it
   scoreCount++;

   if(maxScore < examScore)
   {
       maxScore = examScore;
   }
   if(minScore > examScore)
   {
      minScore = examScore;
   }
   sumScore += examScore;
   avgScore = sumScore / scoreCount;
}

ループに入っていない場合、または使用したくない場合は、有効性チェックの後にcontinue他のすべて (すべての処理内容) をブロックに入れるだけです。else

于 2012-05-29T22:54:51.443 に答える