2023年6月GESP C++ 二级试卷解析
一、单选题(每题2分,共30分)
1.高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。
A.编辑
B.保存
C.调试
D.编译
【答案】D
【考纲知识点】计算机基础(一级)
【解析】本题考察计算机基础知识中编译的概念;编译是把高级语言变成计算机可以识别的二进制语言的过程,所以本题正确答案为D。
2.能够实现下面流程图功能的伪代码是( )。
A. if 条件判断then语句块
B. if 条件判断then什么也不做else语句块
C. while 条件判断do语句块
D. while not 条件判断do语句块
【答案】D
【考纲知识点】流程图的概念与描述(二级),循环语句(一级)
【解析】本题考察对流程图的理解,以及循环结构中的while循环;观察流程图可知,当条件判断不成立时,会执行语句块,并重新进行条件判断,当条件判断成立时,则流程继续往下进行,所以本题正确答案为D。
3.下列关于C++语言的叙述,正确的是( )。
A. char类型变量不能赋值给int类型的变量。
B.两个int类型变量相乘,计算结果还是int类型。
C.计算两个int类型变量相乘时,如果乘积超出了int类型的取值范围,程序会报错崩溃。
D.计算两个double类型变量相除时,如果除数的值为0.0,程序会报错崩溃。
【答案】B
【考纲知识点】数据类型的转换(二级)
【解析】本题考察C++中数据类型转换的规则;A选项错误在于:char类型变量可以赋值给int类型的变量,赋值结果为char类型变量中存放的整数值;C选项错误在于:如果两个int类型变量相乘的乘积超出了int类型的取值范围,那么会发生溢出,得到错误的结果,但是程序不会崩溃;D选项错误在于:两个double类型变量相除时,如果除数的值为0.0,得到的结果是特殊的double类型值INF(被除数为正数时,正无穷)、-INF(被除数为负数时,负无穷)或NaN(被除数为0时,无意义),但是程序不会崩溃;所以本题正确答案为B。
4.下列关于C++语言的叙述,不正确的是( )。
A. if语句中的判断条件必须用小括号‘(’和‘)’括起来。
B. for语句中两个‘;’之间的循环条件可以省略,表示循环继续执行的条件一直满足。
C.循环体包含多条语句时,可以用缩进消除二义性。
D.除了“先乘除、后加减”,还有很多运算符优先级。
【答案】C
【考纲知识点】循环结构(一级)
【解析】本题考察循环语句的语法规则;C选项错误在于:循环体包含多条语句时,需要用花括号把循环体中的所有语句括起来;所以本题正确答案为C。
5.以下哪个是C++语言的关键字?( )
A. main
B. max
C. double
D. sqrt
【答案】C
【考纲知识点】计算机基础与编程环境(一级)
【解析】本题考察C++语言中“关键字”的概念;关键字就是预先定义好的标识符,C++编译器对其进行特殊处理,它们不能作为常量名、变量名或其他标识符名称;选项中只有double是关键字,其余均为函数名,所以本题正确答案为C。
6.以下哪个不是C++语言的运算符?( )
A. >=
B. /=
C. ||
D. <>
【答案】D
【考纲知识点】基本运算(一级)
【解析】本题考察C++语言中的运算符;选项A为比较运算符:大于等于;选项B为赋值运算符:除并赋值;选项C为逻辑运算符:逻辑或;选项D不是C++中的运算符;所以本题正确答案为D。
7.如果a为int类型的变量,b为char类型的变量,则下列哪个语句不符合C++语法?( )
A. a = a + 1.0;
B. a = (int)(b - '0');
C. b = (char)(a + '0');
D. (int)b = a;
【答案】D
【考纲知识点】数据类型的转换(二级)
【解析】本题主要考察C++中数据类型转换的规则;强制类型转换得到的是改变类型的值,不再是能被赋值的变量;所以本题正确答案为D。
8.如果用两个int类型的变量a和b分别表达平行四边形的两条边长,用int类型的变量h表达a边对应的高,则下列哪个表达式不能用来计算b边对应的高?( )
A. a / b * (0.0 + h)
B. (0.0 + a * h) / b
C. a * h / (b + 0.0)
D. (a + 0.0) * h / b
【答案】A
【考纲知识点】基本运算(一级),数据类型的转换(二级)
【解析】本题主要考察C++运算中除法的规则以及类型转换规则;在C++中,两个变量进行运算,如果两个变量都是int类型,那么结果仍然为int类型(除法向下取整),如果两个变量中至少一个是double类型,那么结果为double类型;在本题中,需要避免出现两个int类型变量相除,导致计算结果错误;只有A选项的除号两边都是int类型,所以本题正确答案为A。
9.以下哪个循环语句会无限次执行?( )
A. for (int a = 0; a; a++) ;
B. for (bool b = false; b <= true; b++) ;
C. for (char c = 'A'; c < 'z'; c++) ;
D. for (double d = 0.0; d < 10.0; d += 0.001) ;
【答案】B
【考纲知识点】基本数据类型(一级)
【解析】本题主要考察bool类型的运算规则;bool类型的取值范围是false和true,分别对应0和1;B选项中的b++会使得false变为true,true依然变为true,导致循环条件始终成立,所以本题正确答案为B。
10.如果a为char类型的变量,且a的值为'C'(已知'C'的ASCII码为67),则执行cout << (a + 2);会输出( )。
A. E
B. C+2
C. C2
D. 69
【答案】D
【考纲知识点】数据类型的转换(二级)
【解析】本题主要考察数据类型转换中的类型提升;两个不同类型的变量进行运算时,一般会把字节数较小(低精度)的类型自动转换为字节数较大(高精度)的类型,再进行运算;题目中a是char类型,2是int类型,那么a+2的结果是int类型,输出的结果是整数69,所以本题正确答案为D。
11.如果a和b均为int类型的变量,下列表达式能正确判断“a等于1且b等于1”的是( )。
A. (a == b) && (b == 1)
B. (a && b)
C. (a == b == 1)
D. (a * b == 1)
【答案】A
【考纲知识点】基本运算(一级)
【解析】本题主要考察C++条件判断的语法格式;判断两个条件是否同时成立时,需要把两个条件用&&符号连接起来;B选项只要a和b都非0即成立;C选项会将(a==b)的结果(0或1)与1判断相等,于是只要a和b相等,结果就为真;D选项a和b都是-1也满足条件;A选项符合语法规则,所以本题正确答案为A。
12.如果a为char类型的变量,下列哪个表达式可以正确判断“a是数字”?( )
A. '0' <= a && a <= '9'
B. '1' <= a && a <= '0'
C. '0' <= a <= '9'
D. '1' <= a <= '0'
【答案】A
【考纲知识点】ASCII编码(二级),基本运算(一级)
【解析】本题考察C++中的比较运算以及数字字符的ASCII码;判断两个条件是否同时成立时,需要把两个条件用&&符号连接起来,C、D选项不符合要求;数字字符的ASCII码最小的是'0',最大的是'9',所以本题正确答案为A。
13.在下列代码的横线处填写( ),使得输出是9。
A. (a + b)
B. (a + b - '0')
C. (char)(a + b)
D. (char)(a + b - '0')
【答案】D
【考纲知识点】ASCII编码、数据类型的转换(二级)
【解析】本题考察数据类型转换中的类型提升以及数字字符的ASCII码;字符变量a的值是'3',相当于'0'加3,字符变量b的值是'6',相当于'0'加6,因此a+b等于'0'+3+'0'+6,再减掉'0'的结果就是字符'9';由于加减法运算只能处理数值类型,而char不是数值类型,因此会把char转换成int进行计算,结果也是int类型,最终输出字符时需要强制转换成char类型,所以本题正确答案为D。
14.在下列代码的横线处填写( ),可以使得输出是42。
A. i % 3 == 0
B. 20 % i == 0
C. i <= 8
D. i >= 18
【答案】B
【考纲知识点】多层分支/循环结构(二级)
【解析】本题主要考察对循环语句和条件判断语句的理解;模拟程序执行过程可知,四个选项对应的输出结果分别是63、42、36和57,所以本题正确答案为B。
15.执行以下C++语言程序后,输出结果是( )。
A. A
B. B
C. C
D. D
【答案】C
【考纲知识点】多层分支/循环结构(二级),基本运算(一级)
【解析】本题主要考察对循环语句和条件判断语句的理解;括号内条件成立时结果为true,也就是1,否则为false,也就是0;字符x取字母A到D,取到C时,恰好满足四个条件中的三个,总和为3,所以本题正确答案为C。
二、判断题(每题2分,共20分)
1.诞生于1986年的中华学习机CEC-I入选了2021年的CCF计算机历史记忆(一类),它的内存只有64KB。当时的汉字编码字符集GB2312中共有6763个汉字,假如每个汉字用2个字节编码,将整个GB2312汉字字符集都放入CEC-I的内存,也只占用了不超过1/5的内存空间。
【答案】错
【考纲知识点】基本数据类型(一级)
【解析】本题考察数据类型与内存空间的计算;6763个汉字,占用6763×2=13526字节,除以1024约为13.21KB,超过了64KB的1/5。所以本题错误。
2.域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称,CCF编程能力等级认证官方网站的域名是gesp.ccf.org.cn,其中顶级域名是gesp。
【答案】错
【考纲知识点】计算机网络(二级)
【解析】本题考察计算机网络中的域名概念;顶级域名是指域名最右边的那个词,gesp.ccf.org.cn的顶级域名是.cn。所以本题错误。
3.在使用C++语言编写程序时,不能使用sqrt、abs等数学函数,包含<cmath>或<math.h>头文件后就能够使用了。
【答案】对
【考纲知识点】程序设计语言的特点(二级)
【解析】本题考察C++语言中的头文件;包含<cmath>或<math.h>头文件后,可以使用sqrt、abs等数学函数,所以本题正确。
4.在C++语言中,标识符中可以有下划线‘_’。同时,‘_’也是C++语言的运算符。
【答案】错
【考纲知识点】基本运算、变量的定义与使用(一级)
【解析】本题考察C++中标识符的命名规则,以及C++基本运算;C++的标识符中可以用下划线,但是下划线不是C++语言的运算符,所以本题错误。
5.如果a是double类型的变量,而且值为3.5,则表达式a * 10的计算结果为35,且结果类型为int。
【答案】错
【考纲知识点】基本运算(一级),数据类型的转换(二级)
【解析】本题考察C++运算中除法的规则以及类型转换规则;在C++中,两个变量进行运算,如果两个变量中至少一个是double类型,那么结果为double类型,所以本题错误。
6.在if语句中,如果条件成立时需要执行多条语句,可以使用大括号‘{’和‘}’将这些语句括起来。
【答案】对
【考纲知识点】选择结构(一级)
【解析】本题考察控制语句结构中的选择结构;如果条件成立时需要执行多条语句,可以使用大括号将这些语句括起来,所以本题正确。
7.循环语句的循环体有可能无限制地执行下去。
【答案】对
【考纲知识点】循环结构(一级)
【解析】本题考察控制语句结构中的循环结构;如果每次判断循环条件的结果都为真,那么循环体有可能无限地执行下去,所以本题正确。
8. ++和==都是C++语言的运算符,但+=不是。
【答案】错
【考纲知识点】基本运算(一级)
【解析】本题考察基本运算中的算术运算以及赋值语句;++是自增运算符,==是比较运算符,+=是复合加赋值运算符,三者都是C++语言的运算符,所以本题错误。
9.如果a为char类型的变量,且取值为大写字母'F',则执行语句a = a + 1;后,a的值会变为大写字母'G'。
【答案】对
【考纲知识点】ASCII编码(二级)
【解析】本题考察ASCII编码;大写字母'F'的ASCII码加1后,表示的是大写字母'G',所以本题正确。
10.表达式sqrt(9.0)的计算结果为3,且结果类型为int。
【答案】×
【考纲知识点】常用数学函数(二级)
【解析】本题考察常用数学函数中的sqrt函数,该函数的返回值类型为double,所以本题错误。
三、编程题(每题25分,共50分)
1.找素数
【问题描述】
小明刚刚学习了素数的概念:如果一个大于1的正整数,除了1和它自身外,不能被其他正整数整除,则这个正整数是素数。现在,小明想找到两个正整数 A 和 B 之间(包括A和B)有多少个素数?
【输入描述】
输入2行,第一行包含正整数A,第二行包含正整数B。约定 2<=A<=B<1000。
【输出描述】
输出一行,包含一个整数 C,表示找到C个素数。
【样例输入1】
2
10
【样例输出1】
4
【样例解释1】
在2和10之间有4个素数,分别为:2、3、5、7。
【样例输入2】
98
100
【样例输出2】
0
【题目大意】
统计整数A到B范围内的素数个数,数据范围不超过1000。
【考纲知识点】
多层分支/循环结构(二级)
【解题思路】
1. 枚举A到B,依次检查每个数是不是素数。
2. 用变量isPrime表示当前枚举的数n是否为素数,初始化为true,如果找到了除了1和n以外的因数,则把isPrime赋值为false。
3. 寻找n的因数时,只需要枚举2到根号n。因为如果n有一个大于根号n的因数k,那么就一定存在一个小于根号n的因数n/k。
4. 使用变量cnt记录素数的个数,最终输出即可。
【参考程序】
2.自幂数判断
【问题描述】
自幂数是指,一个 N 位数,满足各位数字 N 次方之和是本身。例如,153是3位数,其每位数的3次方之和等于153,因此153是自幂数;1634是4位数,其每位数的4次方之和等于1634,因此1634是自幂数。
现在,输入若干个正整数,请判断它们是否是自幂数。
【输入描述】
输入第一行是一个正整数 M,表示有 M 个待判断的正整数。约定 1<M<100。
从第2行开始的 M 行,每行一个待判断的正整数。约定这些正整数均小于 10的8次方。
【输出描述】
输出 M 行,如果对应的待判断正整数为自幂数,则输出英文大写字母'T',否则输出英文大写字母'F'。
提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
【样例输入1】
3
152
111
153
【样例输出1】
F
F
T
【样例输入2】
5
8208
548834
88593477
12345
5432
【样例输出2】
T
T
T
F
F
【题目大意】
判断M个给定的整数是否是自幂数。一个x位的整数n是自幂数的条件是:各位数字的x次方之和等于n。给定的正整数均小于 10的8次方。
【考纲知识点】
多层分支/循环结构(二级)
【解题思路】
1. 每次输入n之后,首先计算n的位数l。可以把n赋值给t,然后不断把t除以10,直到t等于0为止,每除一次就把变量l加1。
2. 得到位数l后,再次把t赋值为n,然后使用while循环,每次取t的个位,计算其l次方计入总和sum,然后把t除以10,直到t等于0为止。
3. 如果sum等于n,说明n是自幂数,按照题目要求输出即可。
【参考程序】