2023-06 GESP二级真题
题数:27
分数:100
测试时长:90min
一、单选题(每题 2 分,共 30 分)
1. 高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。(D)(2分)
A. 编辑
B. 保存
C. 调试
D. 编译
2. 能够实现下面流程图功能的伪代码是( D)。(2分)
A. if 条件判断 then 语句块
B. if 条件判断 then 什么也不做 else 语句块
C. while 条件判断 do 语句块
D. while not 条件判断 do 语句块
3. 下列关于 C++语言的叙述,正确的是(B )。(2分)
A. char 类型变量不能赋值给 int 类型的变量。
B. 两个 int 类型变量相乘,计算结果还是 int 类型。
C. 计算两个 int 类型变量相乘时,如果乘积超出了 int 类型的取值范围,程序会报错崩溃。
D. 计算两个 double 类型变量相除时,如果除数的值为 0.0,程序会报错崩溃。
4. 下列关于 C++语言的叙述,不正确的是(C )。(2分)
A. if 语句中的判断条件必须用小括号‘(’和‘)’括起来。
B. for 语句中两个‘;’之间的循环条件可以省略,表示循环继续执行的条件一直满足。
C. 循环体包含多条语句时,可以用缩进消除二义性。
D. 除了“先乘除、后加减”,还有很多运算符优先级。
5. 以下哪个是 C++语言的关键字?(C )(2分)
A. main
B. max
C. double
D. sqrt
6. 以下哪个不是 C++语言的运算符?(D )(2分)
A. >=
B. /=
C. ||
D. <>
7. 如果 a 为 int 类型的变量,b 为 char 类型的变量,则下列哪个语句不符合C++语法?(D )(2分)
A. a = a + 1.0;
B. a = (int)(b - '0');
C. b = (char)(a + '0');
D. (int)b = a;
8. 如果用两个 int 类型的变量 a 和 b 分别表达平行四边形的两条边长,用 int 类型的变量 h 表达 a 边对应的高,则下列哪个表达式不能用来计算 b 边对应的高?( A)(2分)
A. a / b * (0.0 + h)
B. (0.0 + a * h) / b
C. a * h / (b + 0.0)
D. (a + 0.0) * h / b
9. 以下哪个循环语句会无限次执行?(B )(2分)
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) ;
10. 如果 a 为 char 类型的变量,且 a 的值为'C'(已知'C'的 ASCII 码为 67), 则执行 cout << (a + 2);会输出( )。(D)(2分)
A. E
B. C+2
C. C2
D. 69
11. 如果 a 和 b 均为 int 类型的变量,下列表达式能正确判断“a 等于 1 且 b等于 1”的是(A)。(2分)
A. (a == b) && (b == 1)
B. (a && b)
C. (a == b == 1)
D. (a * b == 1)
12. 如果 a 为 char 类型的变量,下列哪个表达式可以正确判断“a 是数字”?(A)(2分)
A. '0' <= a && a <= '9'
B. '1' <= a && a <= '0'
C. '0' <= a <= '9'
D. '1' <= a <= '0'
13. 在下列代码的横线处填写( ),使得输出是 9。(D)(2分)
#include <iostream>
using namespace std;
int main(){
char a = '3',b = '6';
cout << __________;//在此处填入代码
return 0;
}
A. (a + b)
B. (a + b - '0')
C. (char)(a + b)
D. (char)(a + b - '0')
14. 在下列代码的横线处填写( ),可以使得输出是 42。(B)(2分)
#include <iostream>
using namespace std;
int main(){
int sum =0;
for(int i=1;i <=20; i++)
if(_______)//在此处填入代码
sum += i;
cout << sum << endl;
return 0;
}
A. i % 3 == 0
B. 20 % i == 0
C. i <= 8
D. i >= 18
15. 执行以下 C++语言程序后,输出结果是(C)。(2分)
#include <iostream>
using namespace std;
int main(){
for(char x = 'A'; x <= 'D';x++)
if((x != 'A')+(x == 'C')+(x == 'D') + (x != 'D') ==3)
cout << x;
return 0;
}
A. A
B. B
C. C
D. D
二、判断题(每题 2 分,共 20 分)
1. 诞生于 1986 年的中华学习机CEC-I 入选了 2021 年的CCF 计算机历史记忆(一类),它的内存只有 64KB。当时的汉字编码字符集 GB2312 中共有 6763 个汉字, 假如每个汉字用 2 个字节编码,将整个 GB2312 汉字字符集都放入 CEC-I 的内存, 也只占用了不超过 1/5 的内存空间。(错)
2. 域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称, CCF 编程能力等级认证官方网站的域名是 gesp.ccf.org.cn,其中顶级域名是gesp。(错)
3. 在使用 C++语言编写程序时,不能使用 sqrt、abs 等数学函数,包含<cmath> 或<math.h>头文件后就能够使用了。(对)
4. 在 C++语言中,标识符中可以有下划线‘_’。同时,‘_’也是 C++语言的运算符。(错)
5. 如果 a 是 double 类型的变量,而且值为 3.5,则表达式 a * 10 的计算结果为 35,且结果类型为 int。(错)
6. 在 if 语句中,如果条件成立时需要执行多条语句,可以使用大括号‘{’和‘}’将这些语句括起来。(对)
7. 循环语句的循环体有可能无限制地执行下去。(对)
8. ++和==都是 C++语言的运算符,但+=不是。(错)
9. 如果 a 为 char 类型的变量,且取值为大写字母'F',则执行语句 a = a + 1;后,a 的值会变为大写字母'G'。(对)
10. 表达式 sqrt(9.0)的计算结果为 3,且结果类型为 int。(错)
三、编程题(每题 25 分,共 50 分)
1. 找素数
【问题描述】
小明刚刚学习了素数的概念:如果一个大于 1 的正整数,除了 1 和它自身外, 不能被其他正整数整除,则这个正整数是素数。现在,小明想找到两个正整数 和之间(包括和)有多少个素数?
【输入描述】
输入 2 行,第一行包含正整数,第二行包含正整数。约定 2 ≤ ≤ ≤ 1000。
【输出描述】
输出一行,包含一个整数,表示找到个素数。
【样例输入 1】
2
10
【样例输出 1】
4
【样例解释 1】
在 2 和 10 之间有 4 个素数,分别为:2、3、5、7。
【样例输入 2】
98
100
【样例输出 2】
0
【参考程序】
#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;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
if (isPrime)
cnt++;
}
cout << cnt << endl;
return 0;
}
2. 自幂数判断
【问题描述】
自幂数是指,一个位数,满足各位数字次方之和是本身。例如,153 是 3
位数,其每位数的 3 次方之和,13 + 53 + 33 = 153,因此 153 是自幂数;1634是 4 位数,其每位数的 4 次方之和,14 + 64 + 34 + 44 = 1634,因此 1634 是自幂数。
现在,输入若干个正整数,请判断它们是否是自幂数。
【输入描述】
输入第一行是一个正整数,表示有个待判断的正整数。约定 1 ≤ ≤ 100。从第 2 行开始的行,每行一个待判断的正整数。约定这些正整数均小于108。
【输出描述】
输出行,如果对应的待判断正整数为自幂数,则输出英文大写字母'T', 否则输出英文大写字母'F'。
提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
【样例输入 1】
3
152
111
153
【样例输出 1】
F
F
T
【样例输入 2】
5
8208
548834
88593477
12345
5432
【样例输出 2】
T
T
T
F
F
【参考程序】
#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;
}