二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。
类型说明符 数组名[常量表达式][常量表达式]。
——百度百科
二维数组又称为矩阵,但实际在储存时仍是一维数组的存储形式。
我们将采用例题的形式进行二维数组相关常见系统的理解。
假如一个学习小组有6名同学,每人有三门必修课(数学、语文和英语),成绩如下表所示,求每门课的平均分和每个人的平均分。
课程 | 王笑 | 李鹏 | 吴欣 | 张平 | 赵明 | 张晓娜 |
数学 | 85 | 93 | 84 | 85 | 95 | 86 |
语文 | 79 | 95 | 95 | 80 | 100 | 98 |
英语 | 80 | 91 | 93 | 75 | 97 | 90 |
此类题目一般我们都会设行为i,列为j。
可设一个二维数组a[3][6]存储3门课程6个人的成绩。
然后再设一个一维数组v[3]存储每门课的平均分,设一个一维数组w[6]存储每个人的平均分。
代码实现
#include<stdio.h>
int main()
{
/*
v[0]+=a[0][j];//数学
v[1]+=a[1][j];//语文
v[2]+=a[2][j];//英语
w[0]+=a[i][0];//王笑
w[1]+=a[i][1];//李鹏
w[2]+=a[i][2];//吴欣
w[3]+=a[i][3];//张平
w[4]+=a[i][4];//赵明
w[5]+=a[i][5];//张晓娜
*/
float v[3]={},w[6]={};//因为一般的平均数都不是整数,所以我们用float类型
int i,j;
int a[3][6]={{85,93,84,85,95,86},{79,95,95,80,100,98},{80,91,93,75,97,90}};
for(i=0;i<3;i++)//行
{
for(j=0;j<6;j++)//列
{
v[i]+=a[i][j];
}
v[i]/=6;
printf("v[%d]=%.3lf\n",i,v[i]); //%.3lf意思就是取小数点后三位
}
for(j=0;j<6;j++)//列
{
for(i=0;i<3;i++)//行
{
w[j]+=a[i][j];
}
w[j]/=3;
printf("w[%d]=%.3lf\n",j,w[j]);
}
return 0;
}
值得说明的是,其实int a[3][6] 的储存也可以是如下样式。
int a[3][6]={85,93,84,85,95,86,79,95,95,80,100,98,80,91,93,75,97,90};
前提过 实际在储存时仍是一维数组的存储形式。
采用for双循环嵌套模型对3行6列进行遍历 ,以下为代码详解。
每门课的平均分(就是每一行的相加,再除6)
课程 | 王笑 | 李鹏 | 吴欣 | 张平 | 赵明 | 张晓娜 | 每课平均分 |
数学 | 85 | 93 | 84 | 85 | 95 | 86 | |
语文 | 79 | 95 | 95 | 80 | 100 | 98 | |
英语 | 80 | 91 | 93 | 75 | 97 | 90 |
找其特点然后构思代码,每一行相加,就是行数i不变,而列数j在变,然后每一列的数相加。
第一行的数据都相加,第二行的数据都相加...。每一行互不干扰。
(其实行不变,列改变的更容易理解,我们初学者大多常见的就是这种行不变,列改变的基础题型,如9*9乘法表)
实现代码如下
for(i=0;i<3;i++)//行
{
for(j=0;j<6;j++)//列
{
v[i]+=a[i][j];
}
v[i]/=6;
printf("v[%d]=%.3lf\n",i,v[i]);
}
数组的下标是从0开始。
然后第一个for中i循环,i就从0变为1,而在重复第二个for的j循环。j依次遍历。
此时的v[i]就是v[1]=a[1][0]+a[1][1]+a[1][2]+a[1][3]+a[1][4]+a[1][5] 。然后再/6。
然后第一个for中i循环,i就从1变为2,而在重复第二个for的j循环。j依次遍历。
此时的v[i]就是v[2]=a[2][0]+a[2][1]+a[2][2]+a[2][3]+a[2][4]+a[2][5] 。然后再/6。
而每个人的平均分(就是每一列的相加,再除3)
课程 | 王笑 | 李鹏 | 吴欣 | 张平 | 赵明 | 张晓娜 |
数学 | 85 | 93 | 84 | 85 | 95 | 86 |
语文 | 79 | 95 | 95 | 80 | 100 | 98 |
英语 | 80 | 91 | 93 | 75 | 97 | 90 |
每人平均分 |
找其特点然后构思代码,每一列相加,就是列不变,而行数在变,然后每一行的数相加。
第一列的数据都相加,第二列的数据都相加...。每一列互不干扰。
实现代码如下
for(j=0;j<6;j++)//列
{
for(i=0;i<3;i++)//行
{
w[j]+=a[i][j];
}
w[j]/=3;
printf("w[%d]=%.3lf\n",j,w[j]);
}
我们可以与上文的核心代码进行对比发现。是两次for循环的嵌套位置发生了改变。但其核心的理念是不变的。
然后第一个for中j循环,i就从0变为5,而在重复第二个for的i循环。i依次遍历。
此时的w[j]就是v[0]=a[0][0]+a[1][0]+a[2][0]+a[3][0]+a[4][0]+a[5][0] 。然后再/3。
然后第一个for中j循环,i就从0变为5,而在重复第二个for的i循环。i依次遍历。
此时的w[j]就是v[1]=a[0][1]+a[1][1]+a[2][1]+a[3][1]+a[4][1]+a[5][1] 。然后再/3。
......依次直到j=5结束。
输出结果如下
既然没有终点,那在何处又何妨呢。
希望对你有帮助,语言学习贵在坚持输入和输出!