专题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)。 学科网(北京)股份有限公司 学科网(北京)股份有限公司 $

资源预览图

专题9 二维数组的定义与引用(练习)-山东省(春季高考)软件与应用技术类《C语言程序设计知识》考纲讲练测-第1页
1
专题9 二维数组的定义与引用(练习)-山东省(春季高考)软件与应用技术类《C语言程序设计知识》考纲讲练测-第2页
2

由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。