专题9 二维数组的定义与引用(练习)-山东省(春季高考)软件与应用技术类《C语言程序设计知识》考纲讲练测
|
2份
|
13页
|
1人阅读
|
0人下载
内容正文:
编写说明:本专辑为山东省(春季高考)软件与应用技术类《C语言程序设计知识考纲讲练测》,严格依据山东省春季高考软件与应用技术类专业考试大纲(C语言程序设计部分)编写,精准对标考纲,兼顾考点覆盖与实战应用。每套讲练测提供讲义、课件、练习三大配套教学文件,贯穿九大核心环节:考点解读、思维导图、知识梳理、背诵环节、常考题、模拟题、课堂练习、课堂小结及课后测验,形成“讲-练-测-评”闭环式教学与复习逻辑,助力考生夯实基础、突破重难点。
山东省软件与应用技术类
《C语言程序设计知识考纲讲练测》
专题9 二维数组的定义与引用
班级 姓名 学号 成绩
一、单项选择题(本题共15小题,每小题4分,共60分)
1.二维数组的定义形式是( )。
A、数组名[常量表达式][常量表达式] 类型说明符;
B、类型说明符[常量表达式][常量表达式] 数组名;
C、类型说明符 数组名[常量表达式][常量表达式];
D、类型说明符 数组名(常量表达式)(常量表达式);
2.若已定义 int a[5][4];,则该数组的元素共有( )。
A、9 个 B、20 个 C、45 个 D、5 个
3.若有 int a[2][5];,则该数组占用的字节数是( )。
A、40 B、7 C、10 D、20
4.在按行优先存储的数组中,紧跟 a[0][2] 后面的是( )。
A、a[0][1] B、a[0][3] C、a[1][0] D、a[2][0]
5.下列二维数组元素的写法中,正确的是( )。
A、a[2,3] B、a(2)(3) C、a[2][3] D、a[2]3
6.下列属于分行全部赋值写法的是( )。
A、int a[2][3]={{1,2,3},{4,5,6}}; B、int a[2][3]={1,2,3,4,5,6};
C、int a[2][3]={1,2,3}; D、int a[2][3];
7.执行 int a[3][3]={{1,2},{3}}; 后,a[1][2] 的值是( )。
A、3 B、2 C、不确定 D、0
8.执行 int a[2][3]={0}; 之后,数组中的元素( )。
A、只有 a[0][0] 为 0 B、第一行全为 0 C、全部元素为 0 D、元素值不确定
9.执行 int a[][3]={{1,2,3},{4,5,6}}; 后,数组的行数是( )。
A、2 行 B、1 行 C、3 行 D、无法确定
10.若已定义 int a[3][4];,下列引用会越界的是( )。
A、a[0][0] B、a[2][3] C、a[1][2] D、a[3][0]
11.求 3×4 数组全部元素之和,正确的双重循环是( )。
A、for(i=0;i<3;i++) for(j=0;j<4;j++) sum+=a[i][j];
B、for(i=0;i<=3;i++) for(j=0;j<=4;j++) sum+=a[i][j];
C、for(i=0;i<3;i++) sum+=a[i][i];
D、for(j=0;j<4;j++) sum+=a[j][j];
12.求 3 行 4 列数组每一列之和,外层循环应控制( )。
A、行标 i,内层控制列标 j B、列标 j,内层控制行标 i
C、两个都用行标 i D、两个都用列标 j
13.4 阶方阵中,副对角线上元素的下标满足( )。
A、i == j B、i > j C、i + j == 4 D、i + j == 3
14.把 3 阶方阵就地转置,内层循环的初值应写成( )。
A、j = 0 B、j = i + 1 C、j = i D、j = 2
15.下表列出5段定义或语句及 a[0][1] 的值,根据表内容判断说法正确的是( )。
序号
定义或语句
a[0][1] 的值
1
int a[2][3]={{1,2,3},{4,5,6}};
2
2
int a[2][3]={7,8,9};
8
3
int a[2][3]={{9},{4}};
0
4
int a[][2]={1,2,3,4};
2
5
int a[2][3]={0};
0
A、序号2的 a[0][1] 是 9 B、序号4的 a[0][1] 是 3
C、序号1的 a[0][1] 是 2 D、序号3与序号5的 a[0][1] 不同
二、简答题(本大题共2小题,每题10分,共20分)
1.阅读下面的程序,写出程序运行后的输出结果,并回答问题。
#include <stdio.h>
int main(void)
{
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i, j, s1 = 0, s2 = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
if (i == j) s1 += a[i][j];
s2 += a[i][2-i];
}
printf("s1=%d, s2=%d
", s1, s2);
return 0;
}
(1)语句 if (i == j) 选出的是哪些元素?一共几个?(4分)
(2)写出程序运行后的完整输出结果。(6分)
2.下面的程序要读入一个 3 行 4 列的矩阵,求出每一行元素之和并输出,但程序中存在三处错误,请指出错误之处、说明原因并给出正确写法。
#include <stdio.h>
int main(void)
{
int a[3][4];
int i, j, s;
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++)
s += a[i][j];
printf("%d ", s);
}
return 0;
}
三、案例分析题(本大题共1小题,每题10分,共10分)
1.以下程序的功能是:输入一个 3×4 的整数矩阵,先求出全部元素中的最大值及其所在的行标与列标,再统计小于 0 的元素个数并输出。请在程序的下划线处填入正确的内容,使程序完整并能正确运行。
#include <stdio.h>
int main(void)
{
int a[3][4], i, j, max, mi = 0, mj = 0, count = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
scanf("%d", &a[i][j]);
____1____
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
{
if (____2____)
{ max = a[i][j]; mi = i; mj = j; }
if (____3____) ____4____
}
printf("max=%d, 行=%d, 列=%d, 负数个数=%d
", max, mi, mj, count);
return 0;
}
四、综合应用题(本大题共2小题,每题5分,共10分)
1.编写一个C语言程序:从键盘输入一个 3 行 4 列的整数矩阵,先按矩阵的形状输出(每行 4 个数、行末换行),再求出全部元素之和并输出。
2.编写一个C语言程序:用二维数组存放 4 个学生 2 门课程的成绩(成绩由键盘输入),分别输出每个学生的平均分和每门课程的平均分。
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:本专辑为山东省(春季高考)软件与应用技术类《C语言程序设计知识考纲讲练测》,严格依据山东省春季高考软件与应用技术类专业考试大纲(C语言程序设计部分)编写,精准对标考纲,兼顾考点覆盖与实战应用。每套讲练测提供讲义、课件、练习三大配套教学文件,贯穿九大核心环节:考点解读、思维导图、知识梳理、背诵环节、常考题、模拟题、课堂练习、课堂小结及课后测验,形成“讲-练-测-评”闭环式教学与复习逻辑,助力考生夯实基础、突破重难点。
山东省软件与应用技术类
《C语言程序设计知识考纲讲练测》
专题9 二维数组的定义与引用
班级 姓名 学号 成绩
一、单项选择题(本题共15小题,每小题4分,共60分)
1.二维数组的定义形式是( )。
A、数组名[常量表达式][常量表达式] 类型说明符;
B、类型说明符[常量表达式][常量表达式] 数组名;
C、类型说明符 数组名[常量表达式][常量表达式];
D、类型说明符 数组名(常量表达式)(常量表达式);
【答案】C
【解析】二维数组的标准定义形式是“类型说明符 数组名[常量表达式1][常量表达式2];”,三部分顺序固定:先写元素类型,再写数组名,最后用两对中括号依次写行数和列数。用圆括号会被当成函数调用,不是数组定义。
2.若已定义 int a[5][4];,则该数组的元素共有( )。
A、9 个 B、20 个 C、45 个 D、5 个
【答案】B
【解析】元素个数等于行数乘列数,5×4=20 个,不是把两个长度相加得 9。这 20 个元素的行标是 0~4、列标是 0~3,最后一个元素是 a[4][3]。
3.若有 int a[2][5];,则该数组占用的字节数是( )。
A、40 B、7 C、10 D、20
【答案】A
【解析】元素个数是 2×5=10 个,int 型每个元素占 4 个字节,总字节数=10×4=40。占用空间只与元素个数和每个元素的字节数有关,与元素中存放的数值无关。
4.在按行优先存储的数组中,紧跟 a[0][2] 后面的是( )。
A、a[0][1] B、a[0][3] C、a[1][0] D、a[2][0]
【答案】B
【解析】行优先的意思是先把同一行的元素按列标顺序存完,再存下一行。a[0][2] 是第 0 行的第 3 个元素,它后面紧跟着同一行的 a[0][3],然后才是 a[1][0]。
5.下列二维数组元素的写法中,正确的是( )。
A、a[2,3] B、a(2)(3) C、a[2][3] D、a[2]3
【答案】C
【解析】元素引用必须是“数组名[行标][列标]”,两个下标各用一对方括号。a[2,3] 把两个下标写成一个逗号表达式,a(2)(3) 用的是圆括号,a[2]3 缺少第二对括号,都不符合语法。
6.下列属于分行全部赋值写法的是( )。
A、int a[2][3]={{1,2,3},{4,5,6}}; B、int a[2][3]={1,2,3,4,5,6};
C、int a[2][3]={1,2,3}; D、int a[2][3];
【答案】A
【解析】分行赋值用两层花括号:外层一对表示整张表,里面每对表示一行,所以 {{1,2,3},{4,5,6}} 是分行全部赋值。只有一层花括号的是按一维形式赋值,没有花括号的只是定义、没有初始化。
7.执行 int a[3][3]={{1,2},{3}}; 后,a[1][2] 的值是( )。
A、3 B、2 C、不确定 D、0
【答案】D
【解析】第一行给了 1、2,第二行只给了 3,其余元素都没给初值。分行部分赋值时未赋值的元素一律自动为 0,所以 a[1][1]、a[1][2] 以及第三行全部为 0。
8.执行 int a[2][3]={0}; 之后,数组中的元素( )。
A、只有 a[0][0] 为 0 B、第一行全为 0 C、全部元素为 0 D、元素值不确定
【答案】C
【解析】花括号里只有一个 0,它送给 a[0][0],其余 5 个元素没有初值、自动为 0,所以 6 个元素全为 0。这正是二维数组清零最省事的写法;若定义为 int a[2][3]; 且不给初值,元素值才是不确定的。
9.执行 int a[][3]={{1,2,3},{4,5,6}}; 后,数组的行数是( )。
A、2 行 B、1 行 C、3 行 D、无法确定
【答案】A
【解析】省略第一维长度时,系统按数据定行数:这里给出两对花括号、共 6 个数据,每行 3 列,所以是 2 行 3 列。第二维长度必须写出,否则系统无从确定每行几个元素。
10.若已定义 int a[3][4];,下列引用会越界的是( )。
A、a[0][0] B、a[2][3] C、a[1][2] D、a[3][0]
【答案】D
【解析】3 行 4 列数组的行标是 0~2、列标是 0~3,a[3][0] 的行标 3 已超出范围。a[2][3] 是最后一个元素,a[0][0] 是第一个元素,a[1][2] 在范围内,三者都合法。
11.求 3×4 数组全部元素之和,正确的双重循环是( )。
A、for(i=0;i<3;i++) for(j=0;j<4;j++) sum+=a[i][j];
B、for(i=0;i<=3;i++) for(j=0;j<=4;j++) sum+=a[i][j];
C、for(i=0;i<3;i++) sum+=a[i][i];
D、for(j=0;j<4;j++) sum+=a[j][j];
【答案】A
【解析】求全部元素之和要把每一行每一列都走到,条件是 i<3、j<4。写成 i<=3、j<=4 会多走一轮并访问越界元素;只写一个循环用同一个变量作两个下标,加到的是对角线元素,不是全部元素。
12.求 3 行 4 列数组每一列之和,外层循环应控制( )。
A、行标 i,内层控制列标 j B、列标 j,内层控制行标 i
C、两个都用行标 i D、两个都用列标 j
【答案】B
【解析】求“每一列之和”意味着外层每换一列求一次和,所以外层用列标 j,内层用行标 i 把这一列的 3 个元素累加起来,并且每列开始前把累加变量清零。外层用行标求出来的就是每一行之和。
13.4 阶方阵中,副对角线上元素的下标满足( )。
A、i == j B、i > j C、i + j == 4 D、i + j == 3
【答案】D
【解析】n 阶方阵副对角线从右上到左下,元素的行标与列标之和恒等于 n-1,4 阶时即 i+j==3,如 a[0][3]、a[1][2]、a[2][1]、a[3][0]。i==j 描述的是主对角线。
14.把 3 阶方阵就地转置,内层循环的初值应写成( )。
A、j = 0 B、j = i + 1 C、j = i D、j = 2
【答案】B
【解析】就地转置要交换 a[i][j] 与 a[j][i],每对元素只能换一次。若内层从 j=0 开始,同一对元素会被换两次、又换回原样;从 j=i+1 开始只处理上三角,每对恰好换一次。
15.下表列出5段定义或语句及 a[0][1] 的值,根据表内容判断说法正确的是( )。
序号
定义或语句
a[0][1] 的值
1
int a[2][3]={{1,2,3},{4,5,6}};
2
2
int a[2][3]={7,8,9};
8
3
int a[2][3]={{9},{4}};
0
4
int a[][2]={1,2,3,4};
2
5
int a[2][3]={0};
0
A、序号2的 a[0][1] 是 9 B、序号4的 a[0][1] 是 3
C、序号1的 a[0][1] 是 2 D、序号3与序号5的 a[0][1] 不同
【答案】C
【解析】序号1 分行全部赋值,第一行是 1、2、3,a[0][1] 是 2;序号2 按一维形式填,第一行是 7、8、9,a[0][1] 是 8;序号3 第一行只给 9,a[0][1] 自动为 0;序号4 省略第一维,第一行是 1、2,a[0][1] 是 2;序号5 用 {0} 使全部元素为 0。所以“序号1 的 a[0][1] 是 2”成立,序号2 的是 8、序号4 的是 2、序号3 与序号5 的值其实都是 0。
二、简答题(本大题共2小题,每题10分,共20分)
1.阅读下面的程序,写出程序运行后的输出结果,并回答问题。
#include <stdio.h>
int main(void)
{
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i, j, s1 = 0, s2 = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
if (i == j) s1 += a[i][j];
s2 += a[i][2-i];
}
printf("s1=%d, s2=%d
", s1, s2);
return 0;
}
(1)语句 if (i == j) 选出的是哪些元素?一共几个?(4分)
(2)写出程序运行后的完整输出结果。(6分)
【答案】(1)选出的是主对角线上的元素 a[0][0]、a[1][1]、a[2][2],共 3 个。(2)输出结果为:s1=15, s2=15
【解析】外层循环让 i 取值 0、1、2,内层把整行走一遍,但只有 i==j 时才累加,所以 s1 累加的是主对角线 1+5+9=15。s2 写在内层循环之外、每次外层循环累加一次,加的是 a[i][2-i],即 a[0][2]、a[1][1]、a[2][0],也就是副对角线 3+5+7=15。两条对角线在中心元素 a[1][1] 处相交,各自都把它算了一次。易错点:把 s2 写进内层循环(会重复加三遍)、把 a[i][2-i] 写成 a[i][i](两条线混为一谈)、把内层循环写成 j<=3(越界)。
2.下面的程序要读入一个 3 行 4 列的矩阵,求出每一行元素之和并输出,但程序中存在三处错误,请指出错误之处、说明原因并给出正确写法。
#include <stdio.h>
int main(void)
{
int a[3][4];
int i, j, s;
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++)
s += a[i][j];
printf("%d ", s);
}
return 0;
}
【答案】错误一:输入循环的条件写成 i<=3,i 取到 3 时 a[3][j] 行越界(合法行标只有 0~2),应改为 i<3。错误二:内层循环之前没有给 s 清零,第一行之后 s 一直带着前面各行的和,应在内层循环前加 s = 0;(或在定义处写成 int s = 0;)。错误三:s 在定义时未赋初值就直接参与累加,读到的是不确定的值,必须在使用前赋初值 0。
【解析】第一处错在循环边界:3 行 4 列的数组行标只能取 0、1、2,条件写 i<=3 会多走一轮,向 a[3][j] 写入数据,而 C 语言不做越界检查、编译器不报错,被改坏的是数组之外的空间。第二处和第三处其实是同一个问题的两种表现:累加变量必须先有确定的初值,并且“每一行”的统计要在每行开始前重新清零,否则第二行输出的是第一、二行之和,第三行输出的是三行之和——结果看起来只是偏大,很容易被当成正确。检查这类题的方法:先核对每个循环的上下界,再逐个确认累加、计数变量在哪里清零。
三、案例分析题(本大题共1小题,每题10分,共10分)
1.以下程序的功能是:输入一个 3×4 的整数矩阵,先求出全部元素中的最大值及其所在的行标与列标,再统计小于 0 的元素个数并输出。请在程序的下划线处填入正确的内容,使程序完整并能正确运行。
#include <stdio.h>
int main(void)
{
int a[3][4], i, j, max, mi = 0, mj = 0, count = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
scanf("%d", &a[i][j]);
____1____
for (i = 0; i < 3; i++)
for (j = 0; j < 4; j++)
{
if (____2____)
{ max = a[i][j]; mi = i; mj = j; }
if (____3____) ____4____
}
printf("max=%d, 行=%d, 列=%d, 负数个数=%d
", max, mi, mj, count);
return 0;
}
【答案】1.max = a[0][0]; 2.a[i][j] > max 3.a[i][j] < 0 4.count++;
【解析】本题按“先取擂主、再逐个比较、顺便统计”三步填空。①第一空在两重循环之前,要给最大值一个合理的初值,最稳妥的是把第一个元素赋给它,故填 max = a[0][0];,写成 max = 0 遇到全负矩阵就会错。②第二空是求最大值的比较条件,当前元素比 max 大就替换,故填 a[i][j] > max,替换时同时更新 mi、mj 两个下标。③第四空是计数,条件为“小于 0”,故第三空填 a[i][j] < 0,第四空填 count++;。易错点:第二空写成 a[i][j] < max(方向反了);把 mi、mj 只更新一个;第三空写成 a[i][j] <= 0(把 0 也算成负数);第四空写成 count += a[i][j](把个数与数值混在一起)。
四、综合应用题(本大题共2小题,每题5分,共10分)
1.编写一个C语言程序:从键盘输入一个 3 行 4 列的整数矩阵,先按矩阵的形状输出(每行 4 个数、行末换行),再求出全部元素之和并输出。
【答案】#include <stdio.h>
int main(void)
{
int a[3][4], i, j, sum = 0;
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("%5d", a[i][j]);
sum += a[i][j];
}
printf("
");
}
printf("sum=%d
", sum);
return 0;
}
【解析】评分要点:①定义一个 3 行 4 列的二维数组,用两重循环把 12 个数按下标读入,输入时元素前必须写取地址符 &;②输出同样用两重循环,内层输出一行 4 个元素,内层循环结束后加一个 printf("
") 换行,屏幕上才是矩阵的形状;③累加变量要在循环之前赋初值 0,可以在输入时顺便累加,也可以在输出时累加,但不能两处都加,否则和会翻倍。易错点:外层循环写成 i<=3 或内层写成 j<=4(越界)、忘记换行导致 12 个数挤成一行、sum 未清零、求和写在内层循环外但漏掉某一列。
2.编写一个C语言程序:用二维数组存放 4 个学生 2 门课程的成绩(成绩由键盘输入),分别输出每个学生的平均分和每门课程的平均分。
【答案】#include <stdio.h>
int main(void)
{
float s[4][2], sum;
int i, j;
for (i = 0; i < 4; i++)
for (j = 0; j < 2; j++)
scanf("%f", &s[i][j]);
for (i = 0; i < 4; i++)
{
sum = 0;
for (j = 0; j < 2; j++)
sum += s[i][j];
printf("第%d个学生平均分=%.2f
", i + 1, sum / 2);
}
for (j = 0; j < 2; j++)
{
sum = 0;
for (i = 0; i < 4; i++)
sum += s[i][j];
printf("第%d门课平均分=%.2f
", j + 1, sum / 4);
}
return 0;
}
【解析】评分要点:①成绩要能被 2.5 这样的数接受,数组元素类型用 float,输入用 %f;②“每个学生的平均分”外层走行、内层走列,每行开始前 sum 清零,除以课程数 2;③“每门课程的平均分”外层走列、内层走行,每列开始前 sum 清零,除以学生数 4。两段循环只是把两层循环对调,累加对象仍是 a[i][j],不要为了“按列”写成 a[j][i]。易错点:sum 只在定义处清零一次(后面的行、列都带着前面的和)、两段的除数用反(学生段除以 4、课程段除以 2)、成绩用整型导致小数被截断、输出时把 i 或 j 当成人数输出(应为 i+1、j+1)。
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$