如何找到两组数据的平均值?
问题描述:
第一组数据的平均值应该是:(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;
}
答
A';'意思是for循环的结束 所以你的代码 'for(j = 0; j < 5; j ++);'等于j = 5;
数组索引超出界限!
答
由于@woz说,你的问题的一部分是,你永远从0循环运行sum += grades[i][j];
〜4
另一个问题是sum
和5
是类型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)
答
使用整数算术计算平均值: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;
}
请缩进代码! –
只要从你的'for'中删除(; j = 0; j woz