如何找到两组数据的平均值?

时间:2017-07-03 00:30:43

标签: c arrays

第一个数据集的平均值应该是:(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;
}

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

正如@woz所说,你的部分问题是你永远不会在0到4的循环中运行sum += grades[i][j];

另一个问题是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位置用于计算“sum”和“average”)。 (见relevant SO post

答案 2 :(得分:0)

A';'表示for循环的结束 所以你的代码 'for(j = 0; j <5; j ++);'等于j = 5;

数组索引超出界限!