C语言二维数组例题疑惑

今天刷题,刷了个C语言经典例题,有一个地方始终项不明白,求大佬指点.
题:
clipboard.png

答案是:

#include<stdio.h>
#define M 5 //定义符号常量,学生人数为5
#define N 4 //定义符号常量,课程为4门
int main(void)
{int i,j;
float scoreM = {{78,85,83,65},{88,91,89,93},{72,65,54,75},{86,88,75,60},{69,60,50,72}};
float stu_ave[M] = {0}; //存放每位学生的平均成绩
float cla_ave[N] = {0}; //存放每门课程的平均成绩

for(i=0;i<M;i++){ //行

for(j=0;j<N;j++){//列

stu_ave[i] += score[i][j];

//计算第i个学生N门课程的总成绩

cla_ave[j] += score[i][j];

//计算第j门课程的总成绩(**这里看不懂)**

}

stu_ave[i]/= N; //计算第i个学生的平均成绩

}

for(j=0;j<N;j++)

cla_ave[j]/=M; //计算第j门课的平均成绩

printf("学生编号 课程1 课程2 课程3 课程4 个人平均\n");

for(i=0;i<M;i++){

printf("Student%d\t",i+1); //输出学生编号

for(j=0;j<N;j++){

printf("%.1f",score[i][j]); //输出4门课总成绩

}

printf("%.1f\n",stu_ave[i]); //输出个人平均成绩

}

printf("\n课程平均");

for(j=0;j<N;j++)

printf("%.1f",cla_ave[j]); //输出每门课程的平均成绩

printf("\n");

return 0;

}

这段代码可以得出正确结果,可我不明白的是代码第14行的for循环中cla_ave[j] += score[i][j]; 为什么这个代码能得出第j门课程的总成绩? N不是4个吗?所以这个for循环应该循环4次才对阿,即4个成绩的和。可是学生一共是5个,第j门课程的总成绩应该是5个学生成绩的和(比如课程1,78+88+72+86+69)。这个代码是怎么得出每门课程的总成绩呢?总感觉内层少了1次循环,可是结果是正确的,想不通...

回答:

考虑以下代码:

    for (i = 0; i < M; i++) { //行

for (j = 0; j < N; j++) {//列

stu_ave[i] += score[i][j];

//计算第i个学生N门课程的总成绩

cla_ave[j] += score[i][j];

//计算第j门课程的总成绩(**这里看不懂)**

}

stu_ave[i] /= N; //计算第i个学生的平均成绩

}

两个循环,其实就是遍历二维数组score[M][N]一遍,只不过stu_ave是按行(固定行号不变)累加,然后平均;而cla_ave是按列(固定列号不变)累加,后面使用以下代码进行平均:

    for (j = 0; j < N; j++)

cla_ave[j] /= M; //计算第j门课的平均成绩

看你的疑惑应该是你的思路比较混乱,可以先假设i=1,j=0场景,再仔细分析,其实很简单,cal_ave只是在按列相加而已,因为行代表学生、列代表课程,所以按列相加就是该课程学生的总成绩,后面再平均即可。

以上是 C语言二维数组例题疑惑 的全部内容, 来源链接: utcz.com/p/173820.html

回到顶部