1. 二维数组的引出
问题1:为何称之为3D,4D呢?这个D指的是什么?
答曰:指的是维度。
问题:咱们班49个同学,这学期假设有6门课,如何来描述49个同学这6门课成绩?如何分别计算每个同学的6门课成绩之和?
如果用一维数组来实现的话,需要定义6个数组分别来存放6门课成绩,每个同学的6门课成绩遍布6个不同的数组。程序如下:
#include<stdio.h>
int main()
{
double a1[49],a2[49],a3[49],a4[49],a5[49],a6[49];
int i,j;
double sum;
for(i=0;i<49;i++)
{
scanf("%lf%lf%lf",&a1[i],&a2[i],&a3[i]);
scanf("%lf%lf%lf",&a4[i],&a5[i],&a6[i]);
}
for(i=0;i<49;i++)
{
sum=0;
sum=a1[i]+a2[i]+a3[i]+a4[i]+a5[i]+a6[i];
printf("%d:%lf\n",i,sum);
}
return 0;
}
试想:如果有10门课?20门课呢?
可见在实际的工作中,仅仅使用一维数组是远远不够的。随后我们会学习线性代数,里面会有矩阵,例如:
如何用计算机来存储这个矩阵呢?也即如何存储里面的数据呢?只有解决了存储问题,才能谈及处理数据问题:例如求最大值或最小值,转置等等。
N个城市,城市之间的路径长度,如何来描述N个城市之间的路径长度,来求出遍历这N个城市的最短路径呢?
针对这些问题,采用二维数据就可以轻易而举地解决了。二维数组就是为它们而生的!
针对矩阵问题,定义二维数组:int a[5][3];
N个城市问题,假设有100个城市:double len[100][100];
2. 二维数组的初始化
如果已知要处理的数据,在定义数组时就可以初始化了,例如:
int a[2][4]={{1,2,3,4},{0,6,7,8}};
int a[2][4]={1,2,3,4,0,6,7,8};
int a[2][4]={{1,2},{0}};
3. 二维数组的简单应用
3.1求最值
#include<stdio.h>
#define N 49
#define M 6
int main()
{
int a[N][M],i,j;
int max,min;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
scanf("%d",&a[i][j]);
max=min=a[0][0];
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{
if(a[i][j]>max)
max=a[i][j];
if(a[i][j]<min)
min=a[i][j];
}
printf("max:%d\nmin:%d\n",max,min);
return 0;
}
3.2 处理相应的数据
针对同学成绩问题,采用二维数组来实现,代码如下:
#include<stdio.h>
int main()
{
double score[49][6],sum[49];
int i,j;
for(i=0;i<49;i++)
for(j=0;j<6;j++)
scanf("%lf",&score[i][j]);
for(i=0;i<49;i++)
{
sum[i]=0;
for(j=0;j<6;j++)
sum[i]+=score[i][j];
printf("%d:%lf\n",i,sum[i]);
}
return 0;
}
在上述程序中,由于定义double sum[6];时没有初始化,所以在程序中需要sum[i]=0;其实,可以这样:
double sum[6]={0};
这样的话,数组sum中的6个元素均被初始化为0。
4. 其他的多维数组
还有三维、四维等等,int a[2][3][4];处理的时候需要三层循环嵌套。暂且不讨论了,掌握住一维和二维就可以了。