内容正文:
6.2节:二维数组的定义与引用
一、单项选择题
1.若有定义 int a[3][4];,则数组 a 中包含的元素个数是( )
A. 7 B. 12 C. 34 D. 64
2.设有定义 int a[2][3] = {{1, 2}, {3, 4, 5}};,则 a[1][1] 的值是()
A. 2 B. 3 C. 4 D. 5
3.若定义 int a[][3]={1, 2, 3, 4, 5, 6, 7};,则数组 a 的第一维长度(行数)为()
A. 2 B. 3 C. 4 D. 7
4.在C语言中,二维数组在内存中的存储顺序是()
A. 按列优先存储 B. 按行优先存储
C. 随机存储 D. 按元素值大小存储
5.设有定义 int a[2][3] = {1, 2, 3, 4, 5, 6};,则 a[0][2] 的值是()
A. 2 B. 3 C. 4 D. 5
6.执行一下代码的输出结果是()
int a[2][2] = {{1}, {2}};
printf("%d", a[1][0]);
A. 1 B. 2 C. 0 D. 随机值
7.若二维数组a有m行n列,则计算任意元素a[i][j]在数组中位置的公式是()
A. i*n + j B. j*m + i C. i*m + j D. j*n + i
8.若有定义 int a[4][4];,则以下能正确引用数组元素的是()
A. a[4][4] B. a[0][4] C. a[3][3] D. a[-1][0]
9.以下代码执行后,sum 的值是()
int a[2][2] = {{1, 2}, {3, 4}};
int i, j, sum = 0;
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
sum += a[i][j];
A. 6 B. 8 C. 10 D. 12
10.下列二维数组定义中,正确的是()
A. int a[ ][ ] = {1,2,3,4,5,6}; B. int a[2,3];
C. int a[2][3] = {{1,2},{3,4},{5,6}}; D. int a[][3] = {{1,2,3},{4,5,6}};
二、填空题。
1.已知int a[][3] = {{1,2,3},{4,5}};,则数组a的行数为___________。
2.若有定义int a[2][3] = {{1},{2,3}};,则a[0][2]的值为___________。
3.若有int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,则a[1][2]的值为___________。
4.若二维数组a有m行n列,则在内存中,a[i][j]之前有__________个元素。
5.若有int a[2][3] = {1,2,3,4,5,6};,则a[1][0]的值为___________。
6.以下代码段的输出是___________。
int a[2][2] = {{1,2},{3,4}};
printf("%d", a[0][1] + a[1][0]);
7.二维数组a[M][N]中,若行下标 i、列下标 j 均合法,则元素a[i][j]的前一个元素是___________。
8.定义一个 3 行 4 列的整型二维数组,语句为___________。
9.int k[2][3] = {1,2,3,4};,k[1][2]的值为___________。
10.定义int g[2][3] = {1,2,3,4,5,6};,g[1][1]的值为___________。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {{1, 2}, {3, 4}};
printf("%d", a[1][0]);
}
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][3] = {1, 2, 3, 4, 5, 6};
int i, j;
for(i = 0; i < 2; i++) {
for(j = 0; j < 3; j++)
printf("%d ", a[i][j]);
printf("
"); }}
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {{1}, {2}};
printf("%d", a[0][1] + a[1][0]);}
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][3], i, j;
for(i = 0; i < 2; i++)
for(j = 0; j < 3; j++)
a[i][j] = i + j;
printf("%d", a[1][2]);}
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {1,2,3,4};
int i, s = 0;
for(i=0; i<2; i++) s += a[i][i];
printf("%d", s);}
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][3] = {1,2,3,4,5,6};
int i, s = 0;
for(i=0; i<2; i++) s += a[i][1];
printf("%d", s);}
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int i, s = 0;
for(i=0; i<3; i++) s += a[i][2-i];
printf("%d", s);}
8.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {1,2,3,4};
int t = a[0][0];
a[0][0] = a[1][1];
a[1][1] = t;
printf("%d", a[0][0] + a[1][1]);}
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int i, s = 0;
for(i=0; i<3; i++) s += a[0][i];
printf("%d", s);}
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {1,2,3,4};
int i, s = 0;
for(i=0; i<2; i++) s += a[i][1-i];
printf("%d", s);}
四、程序填空题(根据题意,将空缺的语句补上)
1.以下程序将二维数组a的行和列互换后存入数组b中(即矩阵转置)。
#include <stdio.h>
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int b[3][2];
int i, j;
for(i=0; i<2; i++) {
for(j=0; j<3; j++)
___________________; }
for(i=0; i<3; i++) {
for(j=0; j<2; j++)
printf("%d ", b[i][j]);
printf("
"); }}
2.以下程序查找二维数组a中的最大值。
#include <stdio.h>
main() {
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i, j, max;
max = a[0][0];
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
if(__________)
max = a[i][j]; }
}
printf("%d", max);}
3.以下程序将二维数组a的每一行元素之和分别输出。
#include <stdio.h>
main() {
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i, j, rowSum;
for(i=0; i<3; i++) {
_________________;
for(j=0; j<3; j++)
rowSum +=a[i][j];
printf("%d ", rowSum); }
}
4.以下程序输出二维数组a的反对角线(从右上到左下)上的元素。
#include <stdio.h>
main() {
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i;
for(i=0; i<3; i++) {
printf("%d ", __________); }
}
5.以下程序将二维数组a的所有元素乘以2后输出。
#include <stdio.h>
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int i, j;
for(i=0; i<2; i++) {
for(j=0; j<3; j++) {
___________________;
printf("%d ", a[i][j]); }
printf("
"); }
}
五、编程题。
1. 编写程序,定义一个3行4列的二维整型数组,从键盘输入所有元素的值,然后输出这个数组的所有元素(按行列格式输出)。
2.编写程序,定义一个3行3列的二维数组,从键盘输入所有元素的值,然后找出其中的最大值并输出。
3.编写程序,定义一个2行3列的二维数组,从键盘输入所有元素的值,然后计算并输出所有元素的平均值。
4.编写程序,定义一个3行3列的二维数组,并初始化为{{1,2,3},{4,5,6},{7,8,9}},然后输出其转置矩阵(行列互换)。
5.编写程序,定义一个4行4列的二维数组,从键盘输入所有元素的值,然后计算并输出两条对角线元素之和。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
6.2节:二维数组的定义与引用
一、单项选择题
1.若有定义 int a[3][4];,则数组 a 中包含的元素个数是( )
A. 7 B. 12 C. 34 D. 64
【答案】B
【解析】二维数组的元素总数等于第一维长度乘以第二维长度。此处为3×4=12 个整型元素。
2.设有定义 int a[2][3] = {{1, 2}, {3, 4, 5}};,则 a[1][1] 的值是( )
A. 2 B. 3 C. 4 D. 5
【答案】C
【解析】数组 a 有2行3列。第一行初始化为 {1, 2, 0}(不足补0),第二行初始化为 {3, 4, 5}。a[1][1] 指向第二行第二列的元素,即 4。
3.若定义 int a[][3] = {1, 2, 3, 4, 5, 6, 7};,则数组 a 的第一维长度(行数)为( )
A. 2 B. 3 C. 4 D. 7
【答案】B
【解析】列宽固定为3。初始化列表中有7个元素。第一行填3个(1,2,3),第二行填3个(4,5,6),第三行填1个(7),共需要3行。
4.在C语言中,二维数组在内存中的存储顺序是( )
A. 按列优先存储 B. 按行优先存储
C. 随机存储 D. 按元素值大小存储
【答案】B
【解析】C语言采用“行优先”顺序存储二维数组,即先存放第0行的所有元素,再存放第1行的所有元素,以此类推。
5.设有定义 int a[2][3] = {1, 2, 3, 4, 5, 6};,则 a[0][2] 的值是( )
A. 2 B. 3 C. 4 D. 5
【答案】B
【解析】数据按行填充。第一行(下标0)依次为 1, 2, 3。a[0][2] 即第一行第三个元素,值为3。
6.执行一下代码的输出结果是( )
int a[2][2] = {{1}, {2}};
printf("%d", a[1][0]);
A. 1 B. 2 C. 0 D. 随机值
【答案】B
【解析】a[1] 对应第二行,初始化为 {2},即 {2, 0}。a[1][0] 是该行第一个元素,值为2。
7.若二维数组a有m行n列,则计算任意元素a[i][j]在数组中位置的公式是( )
A. i*n + j B. j*m + i C. i*m + j D. j*n + i
【答案】A
【解析】按行存储,前i行共有i*n个元素,加上本行的j个位置,位置为i*n + j(相对基地址的偏移)。
8.若有定义 int a[4][4];,则以下能正确引用数组元素的是( )
A. a[4][4] B. a[0][4] C. a[3][3] D. a[-1][0]
【答案】C
【解析】 下标范围是0~3。A、B、D均发生数组越界。
9.以下代码执行后,sum 的值是( )
int a[2][2] = {{1, 2}, {3, 4}};
int i, j, sum = 0;
for(i = 0; i < 2; i++)
for(j = 0; j < 2; j++)
sum += a[i][j];
A. 6 B. 8 C. 10 D. 12
【答案】C
【解析】代码计算数组所有元素之和:1+2+3+4=10 。
10.下列二维数组定义中,正确的是( )
A. int a[ ][ ] = {1,2,3,4,5,6}; B. int a[2,3];
C. int a[2][3] = {{1,2},{3,4},{5,6}}; D. int a[][3] = {{1,2,3},{4,5,6}};
【答案】D
【解析】A选项必须指定列数或给出完整的初始化列表;B选项下标应用[2][3];C初始化行数超过定义的行数2。
二、填空题。
1.已知int a[][3] = {{1,2,3},{4,5}};,则数组a的行数为___________。
【答案】2
【解析】列数为3,初始化列表给出了两行(第二行不足补0),故为2行。
2.若有定义int a[2][3] = {{1},{2,3}};,则a[0][2]的值为___________。
【答案】0
【解析】第一行:1,0,0;第二行:2,3,0。a[0][2]是第一行第三列,值为0。
3.若有int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};,则a[1][2]的值为___________。
【答案】6
4.若二维数组a有m行n列,则在内存中,a[i][j]之前有__________个元素。
【答案】i*n+j
【解析】按行存储,前i行有i*n个元素,本行前j个元素,共i*n+j个。
5.若有int a[2][3] = {1,2,3,4,5,6};,则a[1][0]的值为___________。
【答案】4
6.以下代码段的输出是___________。
int a[2][2] = {{1,2},{3,4}};
printf("%d", a[0][1] + a[1][0]);
【答案】5
【解析】a[0][1]=2, a[1][0]=3, 和为5。
7.二维数组a[M][N]中,若行下标 i、列下标 j 均合法,则元素a[i][j]的前一个元素是___________。
【答案】a [i][j-1]
【解析】行优先存储,同一行内前一个元素列下标减 1。
8.定义一个 3 行 4 列的整型二维数组,语句为___________。
【答案】int a[3][4];
【解析】二维数组定义格式:类型 数组名 [行数][列数];
9.int k[2][3] = {1,2,3,4};,k[1][2]的值为___________。
【答案】0
【解析】未赋值元素补 0。
10.定义int g[2][3] = {1,2,3,4,5,6};,g[1][1]的值为___________。
【答案】5
【解析】第 2 行第 2 列元素为 5。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {{1, 2}, {3, 4}};
printf("%d", a[1][0]);
}
【答案】3
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][3] = {1, 2, 3, 4, 5, 6};
int i, j;
for(i = 0; i < 2; i++) {
for(j = 0; j < 3; j++)
printf("%d ", a[i][j]);
printf("
");
}
}
【答案】
1 2 3
4 5 6
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {{1}, {2}};
printf("%d", a[0][1] + a[1][0]);
}
【答案】2
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][3], i, j;
for(i = 0; i < 2; i++)
for(j = 0; j < 3; j++)
a[i][j] = i + j;
printf("%d", a[1][2]);
}
【答案】3
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {1,2,3,4};
int i, s = 0;
for(i=0; i<2; i++) s += a[i][i];
printf("%d", s);
}
【答案】5
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][3] = {1,2,3,4,5,6};
int i, s = 0;
for(i=0; i<2; i++) s += a[i][1];
printf("%d", s);
}
【答案】7
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[3][3] = {1,2,3,4,5,6,7,8,9};
int i, s = 0;
for(i=0; i<3; i++) s += a[i][2-i];
printf("%d", s);
}
【答案】15
8.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {1,2,3,4};
int t = a[0][0];
a[0][0] = a[1][1];
a[1][1] = t;
printf("%d", a[0][0] + a[1][1]);
}
【答案】5
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int i, s = 0;
for(i=0; i<3; i++) s += a[0][i];
printf("%d", s);
}
【答案】6
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
main() {
int a[2][2] = {1,2,3,4};
int i, s = 0;
for(i=0; i<2; i++) s += a[i][1-i];
printf("%d", s);
}
【答案】5
四、程序填空题(根据题意,将空缺的语句补上)
1.以下程序将二维数组a的行和列互换后存入数组b中(即矩阵转置)。
#include <stdio.h>
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int b[3][2];
int i, j;
for(i=0; i<2; i++) {
for(j=0; j<3; j++)
___________________;
}
for(i=0; i<3; i++) {
for(j=0; j<2; j++)
printf("%d ", b[i][j]);
printf("
"); }
}
【答案】b[j][i] = a[i][j]
2.以下程序查找二维数组a中的最大值。
#include <stdio.h>
main() {
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i, j, max;
max = a[0][0];
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
if(__________)
max = a[i][j];
}
}
printf("%d", max);
}
【答案】a[i][j] > max
3.以下程序将二维数组a的每一行元素之和分别输出。
#include <stdio.h>
main() {
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i, j, rowSum;
for(i=0; i<3; i++) {
_________________;
for(j=0; j<3; j++)
rowSum +=a[i][j];
printf("%d ", rowSum);
}
}
【答案】rowSum = 0
4.以下程序输出二维数组a的反对角线(从右上到左下)上的元素。
#include <stdio.h>
main() {
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i;
for(i=0; i<3; i++) {
printf("%d ", __________);
}
}
【答案】a[i][2-i]
5.以下程序将二维数组a的所有元素乘以2后输出。
#include <stdio.h>
main() {
int a[2][3] = {{1,2,3},{4,5,6}};
int i, j;
for(i=0; i<2; i++) {
for(j=0; j<3; j++) {
___________________;
printf("%d ", a[i][j]);
}
printf("
");
}
}
【答案】a[i][j] = a[i][j] * 2
五、编程题。
1. 编写程序,定义一个3行4列的二维整型数组,从键盘输入所有元素的值,然后输出这个数组的所有元素(按行列格式输出)。
【参考代码】
#include <stdio.h>
main() {
int a[3][4];
int i, j;
// 输入
for(i=0; i<3; i++) {
for(j=0; j<4; j++) {
scanf("%d", &a[i][j]);
}
}
// 输出
for(i=0; i<3; i++) {
for(j=0; j<4; j++) {
printf("%d ", a[i][j]);
}
printf("
");
}
}
2.编写程序,定义一个3行3列的二维数组,从键盘输入所有元素的值,然后找出其中的最大值并输出。
【参考代码】
#include <stdio.h>
main() {
int a[3][3];
int i, j, max;
// 输入
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
scanf("%d", &a[i][j]);
}
}
// 找最大值
max = a[0][0];
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
if(a[i][j] > max) {
max = a[i][j];
}
}
}
printf("%d", max);
}
3.编写程序,定义一个2行3列的二维数组,从键盘输入所有元素的值,然后计算并输出所有元素的平均值。
【参考代码】
#include <stdio.h>
main() {
int a[2][3];
int i, j, sum = 0;
float avg;
// 输入并求和
for(i=0; i<2; i++) {
for(j=0; j<3; j++) {
scanf("%d", &a[i][j]);
sum += a[i][j];
}
}
avg = sum / 6.0;
printf("%.2f", avg);
}
4.编写程序,定义一个3行3列的二维数组,并初始化为{{1,2,3},{4,5,6},{7,8,9}},然后输出其转置矩阵(行列互换)。
【参考代码】
#include <stdio.h>
main() {
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i, j;
for(i=0; i<3; i++) {
for(j=0; j<3; j++) {
printf("%d ", a[j][i]); // 行变列
}
printf("
");
}
}
5.编写程序,定义一个4行4列的二维数组,从键盘输入所有元素的值,然后计算并输出两条对角线元素之和。
【参考代码】
#include <stdio.h>
main() {
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++) {
sum += a[i][i]; // 主对角线
sum += a[i][3-i]; // 副对角线
}
// 如果矩阵阶数为奇数,中心元素会被加两次,但本题是4阶,没有中心元素重复问题
printf("%d", sum);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$