2017-07-03 59 views
0

第一組數據的平均值應該是:(80 + 70 + 65 + 89 + 90)/ 5和第二組(85 + 80 + 80 + 82 + 87)/ 5,但由於某種原因,我的代碼是不工作。如何找到兩組數據的平均值?

當我運行代碼時,我得到17.0和219886384而不是78.8和82.8。

int main(void) 
{  
    int grades[2][5] = {{80, 70, 65, 89, 90}, {85, 80, 80, 82, 87}}; 
    float average; 
    int sum; 
    int i; 
    int j; 
    for(i = 0; i < 2; i++) 
    { 
     sum = 0; 
     for(j = 0; j < 5; j++); 
     { 
      sum += grades[i][j]; 
     } 
     average = sum/5; 
     printf("The average grade for %d is: %f\n", i, average); 
    } 
    return 0; 
} 
+0

請縮進代碼! –

+8

只要從你的'for'中刪除(; j = 0; j <5; j ++);' – woz

回答

0

A';'意思是for循環的結束 所以你的代碼 'for(j = 0; j < 5; j ++);'等於j = 5;

數組索引超出界限!

0

由於@woz說,你的問題的一部分是,你永遠從0循環運行sum += grades[i][j];〜4

另一個問題是sum5是類型int的,所以即使在你從內部循環中刪除多餘的分號,你仍然會有不正確的輸出。而應該做的:average = sum/5.0f;

因此,你的代碼應該是:

#include "stdio.h" 
int main(void) 
{  
    int grades[2][5] = {{80, 70, 65, 89, 90}, {85, 80, 80, 82, 87}}; 
    float average; 
    int sum; 
    int i; 
    int j; 
    for(i = 0; i < 2; i++) 
    { 
     sum = 0; 
     for(j = 0; j < 5; j++) // CHANGE 1: remove semicolon 
     { 
      sum += grades[i][j]; 
     } 
     average = sum/5.0f; // CHANGE 2: ensure that the result is a floating point number 
     printf("The average grade for %d is: %f\n", i, average); 
    } 
    return 0; 
} 

你可以運行它here

<script src="//repl.it/embed/JLAN/0.js"></script>

在未來,當你遇到你的預期與實際結果之間的這種差異,添加斷點到您的代碼,看看它實際上是在網上尋找解決方案之前做

你得到非常大的值的原因是緊跟着你的數組的內存中的整數(在假設的5位置用於計算「總和」和「平均值」)。 (見relevant SO post

2

使用整數算術計算平均值:sum/5。使用sum/5.0或將sum定義爲浮點變量。

for語句中存在一個愚蠢的錯誤,for子句之後的額外分號是空語句,將for減少爲空循環,後接單個塊,該塊訪問超出數組末尾的條目。

for(j = 0; j < 5; j++); <--- spurious semicolon! 
    { 
     sum += grades[i][j]; 
    } 

如果你把左大括號放在同一行,被稱爲Kernighan和Ritchie風格,這樣的錯誤會變得不太可能:

for (j = 0; j < 5; j++) { 
     sum += grades[i][j]; 
    } 

同樣,如果您定義循環在for子句中的索引,這個錯誤變成了語法錯誤的循環索引是超出範圍的塊:

#include <stdio.h> 

int main(void) {  
    int grades[2][5] = {{80, 70, 65, 89, 90}, {85, 80, 80, 82, 87}}; 

    for (int i = 0; i < 2; i++) { 
     float average, sum = 0; 
     for (int j = 0; j < 5; j++) { 
      sum += grades[i][j]; 
     } 
     average = sum/5; 
     printf("The average grade for %d is: %f\n", i, average); 
    } 
    return 0; 
}