|
| 1 | +Tutorial |
| 2 | +-------- |
| 3 | + |
| 4 | +在前一节[数组](https://www.learn-c.org/zh/数组)教程中讲解了如何使用数组。这些数组都是一维的,但C语言可以创建和使用多维数组。下面是一个多维数组声明的一般形式。 |
| 5 | + |
| 6 | + type name[size1][size2]...[sizeN]; |
| 7 | + |
| 8 | +这里有一个基本示例参考—— |
| 9 | + |
| 10 | + int foo[1][2][3]; |
| 11 | + |
| 12 | +也可以这样—— |
| 13 | + |
| 14 | + char vowels[1][5] = { |
| 15 | + {'a', 'e', 'i', 'o', 'u'} |
| 16 | + }; |
| 17 | + |
| 18 | +### 二维数组 |
| 19 | + |
| 20 | +二维数组是最简单的多维数组。一个二维数组差不多是一个一维数组的列表。要声明一个大小为[ x ][ y ]的二维整数数组,你可以这样写—— |
| 21 | + |
| 22 | + type arrayName [x][y]; |
| 23 | + |
| 24 | +其中**type**可以是C语言的任何数据类型(int, char, long, long long, double, 等等),**arrayName**是一个有效的C语言标识符,或变量。一个二维数组可以被认为是一个表,它有[ x ]行和[ y ]列。可以这样想象一个包含三行四列的二维数组a—— |
| 25 | + |
| 26 | + |
| 27 | + |
| 28 | +像这样,数组a中的每个元素都由**a[i][j]**形式的元素名来识别,其中'a'是数组的名称,'i'和'j'是独一无二的索引,合起来也就是'a'中的一个元素的意思。 |
| 29 | + |
| 30 | +其实,不需要把[ x ]值真的放进去,因为如果这样做—— |
| 31 | + |
| 32 | + char vowels[][5] = { |
| 33 | + {'A', 'E', 'I', 'O', 'U'}, |
| 34 | + {'a', 'e', 'i', 'o', 'u'} |
| 35 | + }; |
| 36 | + |
| 37 | +编译器已经知道有两个 "维度",但是,**需要**一个[ y ]值!! 编译器很聪明,但是它*不会知道*你在维度中使用了多少个整数、字符、浮点数,或者其他。请牢记这一点。 |
| 38 | + |
| 39 | +### 初始化二维数组 |
| 40 | + |
| 41 | +多维数组中可以为每一行指定[]内的值。下面是一个3行4列的数组。为了方便,你可以不写3,不填写行数,它仍然可以工作。 |
| 42 | + |
| 43 | + int a[3][4] = { |
| 44 | + {0, 1, 2, 3} , /* 初始化索引为0的行 */ |
| 45 | + {4, 5, 6, 7} , /* 初始化索引为1的行 */ |
| 46 | + {8, 9, 10, 11} /* 初始化索引为2的行 */ |
| 47 | + }; |
| 48 | + |
| 49 | +里面的大括号表示想要的行,是可选的。下面的初始化效果与前面的例子相同—— |
| 50 | + |
| 51 | + int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11}; |
| 52 | + |
| 53 | +### 访问二维数组中的元素 |
| 54 | + |
| 55 | +通过使用下标来访问二维数组中的元素,即使用数组的行索引和列索引。例如—— |
| 56 | + |
| 57 | + int val = a[2][3]; |
| 58 | + |
| 59 | +上述语句将从数组中取出第3行第4个元素。 |
| 60 | + |
| 61 | +Exercise |
| 62 | +-------- |
| 63 | + |
| 64 | +尝试找出五名学生数学和物理两门学科的平均分。使用一个名为```grades```的二维数组去完成。数学对应的分数将被存储在第一行(``grades[0]``),物理对应的分数将被存储在第二行(``grades[1]``)。完成以下剩余步骤,执行这个程序。 |
| 65 | + |
| 66 | +- 将成绩声明为一个二维整数数组 |
| 67 | +- 通过指定终止条件来完成for循环 |
| 68 | +- 计算各科的平均分 |
| 69 | + |
| 70 | +Tutorial Code |
| 71 | +------------- |
| 72 | + |
| 73 | + #include <stdio.h> |
| 74 | + |
| 75 | + int main() { |
| 76 | + /* TODO:在此声明成绩二维数组 */ |
| 77 | + float average; |
| 78 | + int i; |
| 79 | + int j; |
| 80 | + |
| 81 | + grades[0][0] = 80; |
| 82 | + grades[0][1] = 70; |
| 83 | + grades[0][2] = 65; |
| 84 | + grades[0][3] = 89; |
| 85 | + grades[0][4] = 90; |
| 86 | + |
| 87 | + grades[1][0] = 85; |
| 88 | + grades[1][1] = 80; |
| 89 | + grades[1][2] = 80; |
| 90 | + grades[1][3] = 82; |
| 91 | + grades[1][4] = 87; |
| 92 | + |
| 93 | + /* TODO:通过指定终止条件来完成for循环 */ |
| 94 | + for (i = 0; i < ; i++) { |
| 95 | + average = 0; |
| 96 | + for (j = 0; j < ; j++) { |
| 97 | + average += grades[i][j]; |
| 98 | + } |
| 99 | + |
| 100 | + /* TODO:计算学科i的平均分 */ |
| 101 | + printf("The average marks obtained in subject %d is: %.2f\n", i, average); |
| 102 | + } |
| 103 | + |
| 104 | + return 0; |
| 105 | + } |
| 106 | + |
| 107 | + |
| 108 | +Expected Output |
| 109 | +--------------- |
| 110 | + |
| 111 | + The average marks obtained in subject 0 is: 78.80 |
| 112 | + The average marks obtained in subject 1 is: 82.80 |
| 113 | + |
| 114 | +Solution |
| 115 | +-------- |
| 116 | + |
| 117 | + #include <stdio.h> |
| 118 | + |
| 119 | + int main() { |
| 120 | + int grades[2][5]; |
| 121 | + float average; |
| 122 | + int i; |
| 123 | + int j; |
| 124 | + |
| 125 | + grades[0][0] = 80; |
| 126 | + grades[0][1] = 70; |
| 127 | + grades[0][2] = 65; |
| 128 | + grades[0][3] = 89; |
| 129 | + grades[0][4] = 90; |
| 130 | + |
| 131 | + grades[1][0] = 85; |
| 132 | + grades[1][1] = 80; |
| 133 | + grades[1][2] = 80; |
| 134 | + grades[1][3] = 82; |
| 135 | + grades[1][4] = 87; |
| 136 | + |
| 137 | + for (i = 0; i < 2; i++) { |
| 138 | + average = 0; |
| 139 | + |
| 140 | + for (j = 0; j < 5; j++) { |
| 141 | + average += grades[i][j]; |
| 142 | + } |
| 143 | + |
| 144 | + average /= 5.0; |
| 145 | + printf("The average marks obtained in subject %d is: %.2f\n", i, average); |
| 146 | + } |
| 147 | + |
| 148 | + return 0; |
| 149 | + } |
0 commit comments