2014-10-06 59 views
1

我仍然是一個初學者,這個程序給了我一些麻煩。一切工作正常,直到它計算作爲陣列等級[]的元素的輸入值的平均值。我的程序不會取平均輸入數組元素

輸出結果是一張表格,列出了每個學生輸入成績旁邊的學生編號1至5。 我可以顯示學生人數和成績,但程序似乎無法正常計算平均值。請幫忙?

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

void main() 
{  
    float grade[5]; 
    int n; 

    for(n=1; n<=5; n++){ 
     printf("Enter grade %d between 0 and 100: ",n); 
     scanf("%f", &grade[n]); 
    } 

    printf("\nStudent\t\tGrade\n"); 

    for(n=1; n<=5; n++){ 
     printf("%d\t\t%.1f\n\n",n ,grade[n]); 
    } 
    printf("--------------------\n"); 

    float avg = (grade[0] + grade[1] + grade[2] + grade[3] + grade[4])/5; 
    printf("Average Grade:\t%.1f", avg); 
} 
+4

數組下標爲'浮子級[5];'0至4運行,而不是1至5。因此,你寫出你的陣列中的邊界時掃描和打印,從而導致不確定的行爲。你的平均值使用了一個未初始化的變量('grade [0]')。你應該檢查'scanf()'的返回值,以確保你每次都得到實際的數據。 – 2014-10-06 20:49:18

回答

3

您的for循環不正確。具體地,索引從0開始,例如而不是

for(n=1; n<=5; n++) { 

使用

for(n = 0; n < 5; n++) { 

平均的計算是正確的。這只是錯誤的索引。

2

數組索引從0開始,而不是從C開始。在計算平均值時,您會得到正確的結果,但是當您執行循環輸入數據時不會。 因此,當您有:

for(n=1; n<=5; n++){ 
    printf("Enter grade %d between 0 and 100: ",n); 
    scanf("%f", &grade[n]); 
} 

你最終運行1過去的數組的末尾。

相反,你應該從0開始你的循環:

for(n=0; n<5; n++){ 
    printf("Enter grade %d between 0 and 100: ",n); 
    scanf("%f", &grade[n]); 
} 

第二個循環是一樣的。正如評論指出的,你必須再考慮到該指數是一個在第二循環中印學生數較低時:

printf("%d\t\t%.1f\n\n", n+1,grade[n]); 
+0

爲了得到與以前相同的輸出,他需要printf'n + 1',而不是'n'。 – dom0 2014-10-06 20:51:44

+0

@ dom0,很好 – shuttle87 2014-10-06 20:53:59

0

你也可以把avg計算第二循環中。

avg = 0; 
for(n=0; n<5; n++){ 
    printf("%d\t\t%.1f\n\n",n ,grade[n]); 
    avg += grade[n]; 
}