二维数组初始化的形式为:
数据类型 数组名[整常量表达式][ 整常量表达式]={ 初始化数据 };
在{ }中给出各数组元素的初值,各初值之间用逗号分开。把{ }中的初值依次赋给各数组元素。
有如下几种初始化方式:
⑴ 分行进行初始化
int a[2][3]={{1,2,3},{4,5,6}};
在{ }内部再用{ }把各行分开,第一对{ }中的初值1,2,3是0行的3个元素的初值。第二对{ }中的初值4,5,6是1行的3个元素的初值。相当于执行如下语句:
int a[2][3];
a[0][0]=1;a[0][1]=2;a[0][2]=3;a[1][0]=4;a[1][1]=5;a[1][2]=6;
注意,初始化的数据个数不能超过数组元素的个数,否则出错。
⑵ 不分行的初始化
int a[2][3]={ 1,2,3,4,5,6};
把{ }中的数据依次赋给a数组各元素(按行赋值)。即a[0][0]=1; a[0][1]=2;a[0][2]=3;a[1][0]=4;a[1][1]=5;a[1][2]=6;
⑶ 为部分数组元素初始化
static int a[2][3]={{1,2},{4}};
第一行只有2个初值,按顺序分别赋给a[0][0]和a[0][1];第二行的初值4赋给a[1][0]。由于存储类型是static,故其它数组元素的初值为0。注:某些C语言系统(如:Turbo C)中,存储类型不是static的变量或数组的初值也是0。
static int a[2][3]={ 1,2};
只有2个初值,即a[0][0]=1,a[0][1]=2,其余数组元素的初值均为0。
⑷ 可以省略第一维的定义,但不能省略第二维的定义。系统根据初始化的数据个数和第2维的长度可以确定第一维的长度。
int a[ ][3]={ 1,2,3,4,5,6};
a数组的第一维的定义被省略,初始化数据共6个,第二维的长度为3,即每行3个数,所以a数组的第一维是2。
一般,省略第一维的定义时,第一维的大小按如下规则确定:
初值个数能被第二维整除,所得的商就是第一维的大小;若不能整除,则第一维的大小为商再加1。例如,int a[ ][3]={ 1,2,3,4};等价于:int a[2][3]={ 1,2,3,4};
若分行初始化,也可以省略第一维的定义。下列的数组定义中有两对{ },已经表示a数组有两行。
static int a[ ][3]={{1,2},{4}};
7.3.4 二维数组的应用
例7-6:不用输入,自动形成并输出如下矩阵。
1 2 3 4 5
1 1 6 7 8
A = 1 1 1 9 10
1 1 1 1 11
1 1 1 1 1
由于不允许输入,所以要设法找到矩阵元素的分布规律,用循环的方式自动生成。矩阵下三角的元素全是1,即a[i][j]=1(i=0,1,2,3,4; j=0,1,……,i )。而矩阵上三角的元素按行的顺序依次是2,3,……,11。若令k的初值为2,从a[0][1]开始的上三角元素的值用如下方法得到:
k=2;
a[i][j]=k++; ( i=0,1,2,3;j=i+1,i+2, ……,4)。
如:k=2,a[0][1]=2;k=3,a[0][2]=3;k=4,a[0][3]=4; k=5,a[0][4]=5;k=6,a[1][2]=6;……;k=11,a[3][4]=11。
#define N 5
main( )
{ int i,j,k,a[N][N];
k=2;
for ( i=0; i<N; i++ ) /* 对行循环 */
for ( j=0; j<N; j++ ) /* 对列循环 */
if ( j<=i ) a[i][j]=1; /* 产生矩阵的下三角元素 */
else a[i][j]=k++; /* 产生矩阵的上三角元素 */
for ( i=0; i<N; i++ )
{ for ( j=0; j<N; j++)
printf ("%4d", a[i][j]);
printf("\n"); /* 每输出一行,立即换行*/
}
}
运行程序,输出结果是:
1 2 3 4 5
1 1 6 7 8
1 1 1 9 10
1 1 1 1 11
1 1 1 1 1
例7-7:产生4*4矩阵A,并输出它经过行列互换后的矩阵B。
设A矩阵为:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
则B矩阵为:
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
对照A、B矩阵的元素,可以发现它们的对应关系:
b[i][j] = a[j][i] (i=0,1,2,3;j=0,1,2,3)
#define N 4
main( )
{ int i,j,k,a[N][N],b[N][N];
for ( i=0; i<N; i++ ) /* 输入A矩阵元素 */
for ( j=0; j<N; j++ )
scanf("%d",&a[i][j]);
printf("A array:\n");
for(i=0;i<N;i++) /* 输出A矩阵元素 */
{ for(j=0;j<N;j++)
printf("%-4d", b[i][j]);
printf("\n"); /* 每输出一行,立即换行 */
}
for ( i=0; i<N; i++ ) /* 产生b矩阵元素 */
for ( j=0; j<N; j++ )
b[i][j]=a[j][i];
printf("B array:\n");
for(i=0;i<N;i++) /* 输出B矩阵元素 */
{for(j=0;j<N;j++)
printf("%-4d", b[i][j]);
printf("\n"); /* 每输出一行,立即换行 */
}
}
运行程序:
输入:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16↙
输出:A array:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
B array:
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
例7-8:输入5个学生的学号和3门课的成绩,求每个学生的平均成绩。输出所有学生的学号、3门课的成绩和平均成绩。
建立一个5行5列的实型2维数组,其中,0列存放学号,1,2,3列存放3门课的成绩,4列存放平均成绩。首先,依次输入5个学生的学号和3门课的成绩,存放到数组的0,1,2,3列。然后计算3门课的平均成绩,并存放到4列。对每个学生重复以上操作。最后,依次输出所有学生的学号、3门课的成绩和平均成绩。
#define N 5
main( )
{ int i,j;
float a[N][5];
for(i=0;i<N;i++) /* 输入第N个学生的数据 */
for(j=0;j<4;j++)
scanf("%f",&a[i][j]);
for(i=0;i<N;i++)
{ a[i][4]=0;
for(j=1;j<4;j++)
a[i][4]+=a[i][j];
a[i][4]/=3; /* 求第i个学生的平均成绩 */
}
for(i=0;i<N;i++)
{ printf("%-4.0f", a[i][0]); /* 输出第i个学生的学号 */
for(j=1;j<5;j++)
printf("%-6.1f", a[i][j]);/* 输出第i个学生的3门课成绩和平均成绩*/
printf("\n"); /* 每输出一行,立即换行 */
}
}
运行程序:
输入:201 67 78 51↙
202 69 98 74↙
203 87 69 73↙
204 39 68 76↙
205 44 67 82↙
输出:
201 67.0 78.0 51.0 65.3
202 69.0 98.0 74.0 80.3
203 87.0 69.0 73.0 76.3
204 39.0 68.0 76.0 61.0
205 44.0 67.0 82.0 64.3