Cprogramming 简明教程
Multi-dimensional Arrays in C
在方括号中用一个值声明数组,称为一维数组。在一维数组中,每个元素由其索引或下标标识。在 C 中,你可以声明更多的索引来模拟二维、三维或多维数组。
Multidimensional Arrays in C
多维数组可以称为嵌套数组。在这种情况下,外部数组中的每个元素本身都是一个数组。此类嵌套可以达到任何级别。如果外部数组中的每个元素都是另一个一维数组,则它形成一个二维数组。反过来,内部数组是另一组一维数组的数组,它是一个三维数组,依此类推。
Two-dimensional Array in C
一个双维数组,一个 one-dimensional arrays 的数组。双维数组的每个元素本身都是一个数组。它就像一张表或矩阵。这些元素可以被认为在逻辑上有序地排列在行和列中。因此,任何元素的位置由其行号和列号表征。行号和列号都从 0 开始。
Declaration and Initialization of Two-dimensional Array
以下语句声明并初始化了一个双维数组 -
int arr[3][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25};
arr 数组有 3 行和 5 列。在 C 语言中,一个二维数组是一个行优先数组。第一个方括号总是代表行的维度大小,第二个则表示列数。很显然,此数组具有 3 X 5 = 15 个元素。数组用放在花括号内的 15 个逗号分隔的值进行初始化。
元素按照行的方式被读入数组,这意味着前 5 个元素存储在第一行,依此类推。因此,第 1 个维度在数组声明中是可选的。
int arr[ ][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25};
为了提高可读性,每个行的元素可以按照以下方式放在花括号中(可选)-
int arr[ ][5] = {
{1,2,3,4,5},
{10,20,30,40,50},
{5,10,15,20,25}
};
这些数字以表格方式按逻辑进行了排列,如下所示 -
1 |
2 |
3 |
4 |
5 |
10 |
20 |
30 |
40 |
50 |
5 |
10 |
15 |
20 |
25 |
行索引为 1 和列索引为 2 的单元格中包含 30。
Example of Printing Elements of Two-dimensional Array
下面的程序显示了 2D 数组中每个元素的行索引和列索引 -
#include <stdio.h>
int main () {
/* an array with 5 rows and 2 columns*/
int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}};
int i, j;
/* output each array element's value */
for ( i = 0; i < 5; i++ ) {
for ( j = 0; j < 2; j++ ) {
printf("a[%d][%d] = %d\n", i,j, a[i][j] );
}
}
return 0;
}
a[0][0] = 0
a[0][1] = 0
a[1][0] = 1
a[1][1] = 2
a[2][0] = 2
a[2][1] = 4
a[3][0] = 3
a[3][1] = 6
a[4][0] = 4
a[4][1] = 8
对于二或多维数组,编译器分配一个内存块,其大小是由维度乘以 data type 的大小得到的乘积。在这种情况下,大小为 3 X 5 X 4 = 60 字节,4 为 int 数据类型的字节大小。
即使所有元素都存储在连续的内存位置中,我们也可以使用嵌套循环以行和列的格式打印元素。
Example of Printing Two-dimensional Array as Matrix in Row and Columns
以下程序以行和列的格式打印一个二维数组。
#include <stdio.h>
int main() {
int arr[3][5] = {1,2,3,4,5, 10,20,30,40,50, 5,10,15,20,25};
int i, j;
for (i=0; i<3; i++){
for (j=0; j<5; j++){
printf("%4d", arr[i][j]);
}
printf("\n");
}
return 0;
}
1 2 3 4 5
10 20 30 40 50
5 10 15 20 25
Three-dimensional Array in C
一个三维数组是一个二维数组的数组,其中每个元素都是一个二维数组。3D 数组需要三个下标来定义深度、行和列。
想象一下学生们参加考试时坐在五个考场中,每个考场有 20 行课桌,每行有 5 张桌子。这样的安排由一个三维数组表示,例如 -
Students[hall][row][column]
要定位每个学生,您需要有三个索引,即考场编号、学生所在考场中的行数和列数。
Example of Three-dimensional Array
以下程序将数字存储在一个 3 X 3 X 3 数组中 -
#include<stdio.h>
int main(){
int i, j, k;
int arr[3][3][3]= {
{
{11, 12, 13},
{14, 15, 16},
{17, 18, 19}
},
{
{21, 22, 23},
{24, 25, 26},
{27, 28, 29}
},
{
{31, 32, 33},
{34, 35, 36},
{37, 38, 39}
},
};
printf("Printing 3D Array Elements\n");
for(i=0;i<3;i++) {
for(j=0;j<3;j++){
for(k=0;k<3;k++){
printf("%4d",arr[i][j][k]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
Printing 3D Array Elements
11 12 13
14 15 16
17 18 19
21 22 23
24 25 26
27 28 29
31 32 33
34 35 36
37 38 39
Row-wise Sum of Multidimensional Array’s Elements
您可以通过使用索引访问元素,按行或按列找到所有元素的和。对于三维数组,您需要使用深度、行和列索引。对于二维数组,您需要使用行和列索引。在这里,我们使用二维数组。
Matrix Multiplication
矩阵代数是数学的一个分支,其中矩阵是按行和列排列的二维数字数组。只有当第一个矩阵的列数等于第二个矩阵的行数时,才能对两个矩阵进行乘法。两个兼容矩阵的乘积等于第一个矩阵的行与第二个矩阵的列之间的点积。
如果这两个矩阵的大小分别为 a[m][n] 和 b[p][q],那么它们的乘积结果是一个大小为(仅当 n 等于 p 时才有可能进行乘法)的矩阵 c[m][q]。
两个矩阵的乘积是在矩阵 A 的某个行与矩阵 B 的某个列中的对应项进行乘积求和的结果。
Example of Multiplication of Two-dimensional Array (Matrix)
以下程序执行两个矩阵的乘法运算。
#include<stdio.h>
int main(){
int mat1[3][3] = { {2, 4, 1} , {2, 3, 9} , {3, 1, 8} };
int mat2[3][3] = { {1, 2, 3} , {3, 6, 1} , {2, 4, 7} };
int mat3[3][3], sum=0, i, j, k;
for(i=0; i<3; i++){
for(j=0; j<3; j++){
sum=0;
for(k=0; k<3; k++)
sum = sum + mat1[i][k] * mat2[k][j];
mat3[i][j] = sum;
}
}
printf("\nMatrix 1 ...\n");
for(i=0; i<3; i++){
for(j=0; j<3; j++)
printf("%d\t", mat1[i][j]);
printf("\n");
}
printf("\nMatrix 2 ...\n");
for(i=0; i<3; i++){
for(j=0; j<3; j++)
printf("%d\t", mat2[i][j]);
printf("\n");
}
printf("\nMultiplication of the two given Matrices: \n");
for(i=0; i<3; i++){
for(j=0; j<3; j++)
printf("%d\t", mat3[i][j]);
printf("\n");
}
return 0;
}
Matrix 1 ...
2 4 1
2 3 9
3 1 8
Matrix 2 ...
1 2 3
3 6 1
2 4 7
Multiplication of the two given Matrices:
16 32 17
29 58 72
22 44 66