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 记录素数的个数,最终输出即可。
  
【参考程序】
#include <iostream>
using namespace std;
int main() {
	int a = 0, b = 0, cnt = 0;
	cin >> a >> b;
	for (int n = a; n <= b; n++) {
		bool isPrime = true; // 假设初始 isPrime 的值为 true
		// 利用因数成对存在的性质,遍历较小的因数,判断 n 是否为素数
		for (int i = 2; i * i <= n; i++) {
			if (n % i == 0) {
				//若发现 n 存在因数,更改标记 isPrime 并跳出循环
				isPrime = false;
				break;
			}
		}
		if (isPrime)
		cnt++; //统计素数个数
	}
	cout << cnt << endl;
	return 0;
}
2. 自幂数判断
【问题描述】
自幂数是指,一个N 位数,满足各位数字N 次方之和是本身。例如,153 是 3 位数,其每位数的 3 次方之和, 1^3 + 5^3 + 3 ^3 = 153 ,因此 153 是自幂数;1634 是 4 位数,其每位数的 4 次方之和, 1^  4 + 6^  4 + 3^  4 + 4^  4 = 163^4 ,因此 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 是自幂数,按照题目要求输出即可。
  
  
【参考程序】
#include <iostream>
using namespace std;
int main() {
	int m = 0;
	cin >> m;
	for (int i = 0; i < m; i++) {
		int n = 0;
		cin >> n;
		// 数一下 n 有多少位数,记为 l
		int t = n, l = 0;
		while (t > 0) {
			t /= 10;
			l++;
		}
		// 每位数 l 次方求和,记为 sum
		int sum = 0;
		t = n;
		while (t > 0) {
			int d = t % 10;
			t /= 10;
			int mul = 1;
			for (int j = 0; j < l; j++)
				mul *= d;
			sum += mul;
		}
		// 根据 sum 和 n 是否相等,判断是否为自幂数
		if (sum == n)
			cout << "T" << endl;
		else
			cout << "F" << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值