第一个数据集的平均值应该是:(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 :(得分: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];
。
另一个问题是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
位置用于计算“sum”和“average”)。 (见relevant SO post)
答案 2 :(得分:0)
A';'表示for循环的结束 所以你的代码 'for(j = 0; j <5; j ++);'等于j = 5;
数组索引超出界限!