2017-12-19 13 views
-1

何かそこに間違っています。私は本当のクラスの平均を取得し、どのくらいの人々が試験でB C D Fを取得する必要があります。何か間違っている私は本当のクラスの平均を取得し、どのくらいの人々が取得する必要がありますA B C D F試験で私を助けてください?

#include <stdio.h> 

int main() { 
    int sum, stu, ort, grade, i; 
    printf("how many students in the class?"); 
    scanf("%d", &stu); 
    for (i = 1; i <= stu; i++) { 
    printf("enter a score"); 
    scanf("%d", &grade); 
    if (grade < 20) 
     printf("Not: F\n", grade); 
    else if (grade < 40) 
     printf("Grade: D\n", grade); 
    else if (grade < 60) 
     printf("Grade: C\n", grade); 
    else if (grade < 80) 
     printf("Grade: B\n", grade); 
    else if (grade < 100) 
     printf("Grade: A\n", grade); 
    } 
    sum += grade; 
    ort = (sum)/(stu); 
    printf("medium= %d", ort); 
} 
+2

何が間違っていますか? 'sum'を0に初期化します。 –

+2

「何か間違っている」=>問題の明確な説明ではありません – Stargateur

+1

1) 'sum'を初期化する必要があります。 2) 'sum + = grade;'はループの中に入るべきです。 –

答えて

2

私はそれを見ると2つの問題があります。

  1. sumは初期化されていないため、初期値は不定です。

    具体的には、sumは自動ストレージローカル変数であり、明示的に初期化されない限り、不確定値を含みます。

    さて、ここでの使用状況を見て、sum += grade;は章ごと§6.3.2.1としてundefined behaviorを呼び出すC11

    [...]左辺値がされている可能性が自動記憶域期間のオブジェクトを指定した場合 はレジスタ記憶クラスで宣言されており(アドレスは取得されていません)、そのオブジェクト は初期化されていません(初期化子で宣言されておらず、使用前に が割り当てられていません)。

  2. 追加sum += grade;はループ内になければなりません。そうしないと、ループからのエントリを累積することができなくなります。

これは、操作の成功を確実にするために、scanf()の戻り値を確認してください。そうしないと、不特定の動作に終わる可能性があります。

+0

また、私はortが目的のためにfloatまたはdoubleとしてよりよく宣言されていると信じています – Srdjan

2
if (grade < 20) 
     printf("Not: F\n", grade); 
    else if (grade < 40) 
     printf("Grade: D\n", grade); 
    else if (grade < 60) 
     printf("Grade: C\n", grade); 
    else if (grade < 80) 
     printf("Grade: B\n", grade); 
    else if (grade < 100) 
     printf("Grade: A\n", grade); 

コードのこの部分では、まったく使用しないでください。 , gradeの部分を削除するか、フォーマット内に"%d"を追加する必要があります。

関連する問題