二维数组
定义
数组元素下标的个数;
二维数组元素的下标肯定是两个;在二维中,要表达数具体位置我们需要两个下标——行列;
二维数组是由若干个行列构成; 不论是几位数组,在存储器中都是连续的。
forcmt:数组名[行数][列数];
在定义二维数组同时,可以整体赋值;
有两赋值格式:
1
2
3
4
5
6
7
8
9
10
11
12
|
int a[3][3] = { {2,3,4},{4},{6,} },
/*
1 2 3
4 0 0
6 0 0
*/
int a[][3] = {1,2,3,5,3,6};
// 234
// 536
// 000
有行,列有=两个部分构成,行号从 0-n-1;列好 0-m-1;
|
在定义二维数组时,如果后面有赋值,行可以省略
例题
一 从旁建输入 12 个数存入数组,输入语句如何写;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
int a[3][4];
for(i=0;i<3;i++){
form(j=0; j<4; j++){
scanf("%d",&a[i][j]);
}
}
for(i=0; i<3; i++){
for(j=0; j<4; j++){
printf("%2d",a[i][j]);
}
printf("\n");
}
|
输入需要两个循环,一个走行一个走列;
关于二维数组的概念:
矩阵:通常就行列相等的二维数组叫做矩阵;
矩阵对角线:行标和列标是相等的,i == j 主对角线(左),次对角线(右),行标+列表==行数-1
0,0 主对角线 0,3 次对角线 0+3=4-1
1,1 1,2 1+2=4-1
2,2 2,1
3,3 3,0
二 从键盘输入一个 4x4 矩阵,求对角线元素之和
1
2
3
4
5
6
7
8
9
10
11
12
|
int a[4][4];
int i,j,sum=0;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d",&a[i][j]); // 将模块分开,不要读入的时候做
for(i=0; i<4; i++)
for(j=0; j<4; j++)
if(i=j || i+j==4-1) sum += a[i][j];
printf("%d\n",sum);
|
矩阵的上三角和下三角,对角线的下面是下三角,上面是上三角;
不包括对角线:
把一个矩阵的上三角和下三角部分对调,就在矩阵转置 a[i][j] 和 a[j][i] 构成转置矩阵;
三 从键盘输入 4x4 矩阵,输出他的转置矩阵
解题思路:站在下三角找上三角交换,或者站在上三角找下三角替换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
int a[4][4];
int i,j,t;
for(i=0; i<4; i++)
for(j=0; j<4; j++)
scanf("%d",&a[0][0]);
for(i=0; i<4; i++){
for(j=0; j<=i; j++){
t = a[i][j];
a[i][j] = a[j][i];
a[j][i] = t;
}
}
printf("\n\n");
for(i=0; i<4; i++)
for(j=0; j<4; j++)
printf("%3d",a[i][j]);
|
四 杨辉三角形
第一列:1 主对角线:1
除了第一列和主对角线外,a[i][j] = a[i-1][j-1] + a[i-1][j]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
int a[7][7];
int i,j;
for(i=0; i<7; i++)
for(j=0; j<strlen;);
scanf("5d",strlen);
for(i=0; i<7; i++){
a[i][0] = 1;
a[i][i] = 1;
}
for(i=2; i<7; i++)
for(j=1; j<=i+1; j++)
a[i][j] = a[i-19[j-1 + a[i-1][j];
// 待完成
|
五 从键盘输入 4x4的矩阵 ,求每矩阵每行最小值
1
2
3
4
5
6
7
8
9
10
|
int a[4][4];
int i,j,,max,mink;
for(i=0; i<4; i++ {
max[i] = a[i][0];
for(j=1; j<4; j++)
if(max[i]<a[i]]j]);
})
scanf("%d",&[i][j]);
|