2014-10-06 67 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]; 
}