CCF编程能力等级认证GESP---C++1级---20260314
- [单选题(每题 2 分,共 30 分)](#单选题(每题 2 分,共 30 分))
- [判断题(每题 2 分,共 20 分)](#判断题(每题 2 分,共 20 分))
- [编程题(每题 25 分,共 50 分)](#编程题(每题 25 分,共 50 分))
单选题(每题 2 分,共 30 分)
1、2026年春节联欢晚会上一个武术表演节目《武 BOT》。节目中多个人形机器人会表演空翻,它们落地可能会有微微踉跄,但都会迅速调整姿态站稳,并适当移动来和前后左右的其他机器人保持原来队列。如果将机器人视作一个计算机系统,那么在该计算机系统中下面哪一项不能作为输入设备( )。
cpp
A. 检测重心的重力传感器
B. 预装的AI算法程序
C. 接收动作指令的遥控器
D. 拍摄其他机器人的摄像头
正确答案:B
A选项:这个选项属于输入设备。重力传感器用于检测机器人的重心变化,将物理信号转换为电信号输入到控制系统中,帮助机器人保持平衡。
B选项:这个选项不属于输入设备。预装的AI算法程序属于软件系统,是存储在存储器中的数据和程序,不是输入设备。输入设备是指将外部信息输入到计算机系统的硬件设备。
C选项:这个选项属于输入设备。遥控器用于接收外部操作指令,将指令信号输入到机器人控制系统中。
D选项:这个选项属于输入设备。摄像头用于拍摄周围环境和其他机器人的位置信息,将图像信息输入到控制系统中。
2、小明学习编程有一段时间了,他想在图形环境下把当前目录(或文件夹)下的文本文件 20260314.txt 的名字改一下。他用鼠标左键点击选中该文件后,立即完成下面哪个操作后将处于输入新文件名的状态( )。
cpp
A. 单击右键并选择弹出菜单中的"重命名"
B. 双击左键
C. 按功能键 F1
D. 按回车键
正确答案:A
A选项:这个选项正确。在Windows图形界面中,选中文件后单击右键会弹出上下文菜单,其中包含"重命名"选项,选择后文件名会进入可编辑状态。
B选项:这个选项不正确。双击左键通常会打开文件或运行程序,而不是重命名。
C选项:这个选项不正确。F1通常是帮助键,按下后会打开帮助文档,与重命名无关。
D选项:这个选项不正确。按回车键通常会打开选中的文件夹或运行选中的程序,不会进入重命名状态。
3、下面C++代码可以执行,有关说法正确的是( )。
cpp
double PI = 3.1415926;
cout << (PI);
cpp
A. 为了方便初学者,cout << (PI) 和 cout << (pi) 效果相同,即变量的大小写不敏感
B. cout << (PI) 修改为 cout << (Pi) 能正常执行
C. 不能用 PI 做变量名,因为要保存圆周率这个常量
D. 将程序中全部 PI 都改写为 Pai,将能正常执行,不会报错
正确答案:D
A选项:这个选项不正确。C++是区分大小写的语言,
PI和pi是两个不同的变量名。如果只定义了PI,使用pi会导致编译错误。B选项:这个选项不正确。因为只定义了变量
PI,Pi是另一个未定义的变量名,会导致编译错误。C选项:这个选项不正确。
PI只是一个普通的变量名,虽然在数学中它代表圆周率常量,但在C++中它可以作为变量名使用。D选项:这个选项正确。将所有的
PI改写为Pai,变量名仍然有效,程序可以正常执行。C++允许使用各种合法的标识符作为变量名。
4、C++表达式 3 * 3 % 2 的值为( )。
cpp
A. 81
B. 27
C. 0
D. 1
正确答案:D
表达式分析:表达式
3 * 3 % 2包含两个运算符:乘法(*)和取模(%)。运算顺序:根据C++的运算符优先级,乘法和取模具有相同的优先级,按照从左到右的顺序计算。
- 首先计算
3 * 3,结果为 9。- 然后计算
9 % 2,即 9 除以 2 的余数,结果为 1。因此,表达式
3 * 3 % 2的值为 1。
5、整型变量 a、b 的初值都是 4,则下面的C++代码执行后的输出是( )。
cpp
a, b = 3, 4;
cout << (a + 2) << (b - 2) << endl;
cout << a << b << endl;
cpp
A. 62 44
B. 52 34
C. 62 32
D. 62 44
正确答案:D
- 代码分析:
a, b = 3, 4;是一个逗号表达式,先计算a(值为4),再计算b = 3(将3赋值给b),最后计算4。- 执行后:
a保持原值 4,b被赋值为 3,最后一个表达式4的值被丢弃。- 第一行输出:
(a + 2)= 4 + 2 = 6,(b - 2)= 3 - 2 = 1,输出 "62"。- 第二行输出:
a= 4,b= 3,输出 "43"。注意:题目中的选项可能有误,根据代码分析,正确输出应该是 "61" 和 "43"。
6、下面C++代码的相关说法,正确的是( )。
cpp
int N = 0;
cin >> N;
cout << (N);
cpp
A. 执行时如输入 10,则将输出 10
B. 执行时如输入 3.14,将报错
C. 执行时如输入 ABC,将报错
D. 执行时如输入 -10,将报错
正确答案:A
A选项:这个选项正确。当输入整数 10 时,程序会正确读取并输出 10。
B选项:这个选项不正确。当输入 3.14 时,cin 会读取整数部分 3,不会报错,但小数部分会被留在输入缓冲区中。
C选项:这个选项不正确。当输入 ABC 时,cin 会读取失败,但程序不会报错,而是将 N 保持为初始值 0。
D选项:这个选项不正确。int 类型可以存储负整数,输入 -10 是完全合法的,程序会正确输出 -10。
7、下面C++代码执行时,其说法正确的是( )。
cpp
int M = 0, N = 0;
cin >> M;
cin >> N;
if (N > M)
cout << (N - M);
else
cout << (M - N);
cpp
A. 如果输入一个正数和一个负数,其输出结果肯定是大于0
B. 不管是负整数、正整数亦或0,其结果肯定是大于等于0
C. 如果 N 和 M 是相等的整数,将不会有输出
D. 如果 N 和 M 输入带有小数点的数,将按整数部分计算
正确答案:B
A选项:这个选项不正确。如果 M 为正数、N 为负数,输出
M - N为正数;如果 M 为负数、N 为正数,输出N - M也为正数。但如果 M 为正数、N 为0,输出为正数。B选项:这个选项正确。代码的逻辑是输出
|N - M|,即两个数的差的绝对值,无论输入什么整数,结果都是非负数。C选项:这个选项不正确。如果 N 和 M 相等,条件
N > M为假,执行 else 分支,输出M - N = 0。D选项:这个选项不正确。如果输入小数,cin 只读取整数部分,但程序行为取决于具体输入情况。
8、下面C++代码执行后的输出是( )。
cpp
int i, tnt = 1;
for (i = 0; i < 5; i++)
tnt *= i;
printf("%2d%2d\n", tnt, i);
cpp
A. 24 5
B. 10 5
C. 0 4
D. 0 5
正确答案:D
9、执行下面C++代码段求序列 -1+2+3-4+5+6-7+8+9-10+11+12... 之值。例如输入 4,则计算序列前4项的值,规律如序列所示,输出为 0。下面说法中正确的是( )。
cpp
int N, tnt, i;
cout << "请输入正整数:";
cin >> N;
tnt = 0;
for (i = 1; i < N + 1; i++) // L1
if (i % 3 == 1) // L2
tnt += -i;
else
tnt += i;
cout << tnt;
cpp
A. L1行中 i < N + 1 应该修改为 i < N 才会符合预期
B. L2行中 i % 3 == 1 应修改为 i % 3 == 0 才会符合预期
C. L2行中 i % 3 == 1 修改为 i % 3 与当前程序效果相同
D. 当前代码能实现题目所描述计算目标
正确答案:D
序列规律分析:观察序列 -1+2+3-4+5+6-7+8+9-10+11+12...
- 第1项(i=1):-1,i % 3 = 1
- 第2项(i=2):+2,i % 3 = 2
- 第3项(i=3):+3,i % 3 = 0
- 第4项(i=4):-4,i % 3 = 1
规律:当 i % 3 == 1 时取负,否则取正。
代码验证:当 N = 4 时,计算 -1+2+3-4 = 0,符合预期。
因此,当前代码能正确实现题目描述的计算目标。
10、下面C++代码的相关说法,正确的是( )。
cpp
int i;
for (i = 1; i < 10; i++){
if (i % 2 == 0){
continue; // L1
}
else
cout << i << "#";
cout << i << "END";
}
cpp
A. 上述代码执行后,其输出是 1#1END3#3END5#5END7#7END9#9END
B. 删除 else 后的执行效果与当前代码相同
C. 删除 else 且将 cout << i << "#" 移入L1行下面,则执行效果与当前代码相同
D. 在 cout << i << "END" 前增加判断 if(i > 10),其执行效果与当前代码相同
正确答案:B
A选项:这个选项不正确。当 i 为偶数时,执行 continue 跳过后续代码,不输出任何内容。当 i 为奇数时,输出
i#和iEND。B选项:这个选项正确。删除 else 后,无论 i 是奇数还是偶数,
cout << i << "#";都会被执行。但对于偶数,continue 会跳过后续输出,效果相同。C选项:这个选项不正确。如果将
cout << i << "#";移到 continue 后面,偶数也会输出i#。D选项:这个选项不正确。增加判断条件会改变程序逻辑。
11、一个正整数的每位都是个位数,称为数位,最高位非0。下面的C++代码用于求正整数的所有数位之和,简称数位和。如123的各数位分别是1、2、3,则其数位和为1+2+3,结果为6。为实现该目标,横线处应该填写的代码是( )。
cpp
int N;
cin >> N;
int tnt = 0;
while (N != 0){
____________
}
cout << "N的数位和为:" << tnt;
cpp
A. tnt += N/10; N /= 10;
B. tnt += N%10; N /= 10;
C. tnt += N/10; N %= 10;
D. tnt = tnt + N%10; N %= 10;
正确答案:B
数位和计算原理:
N % 10获取 N 的个位数字。N / 10去掉 N 的个位数字。- 循环执行直到 N 为 0。
以 N = 123 为例:
- 第一次:
N % 10 = 3,tnt += 3,N / 10 = 12- 第二次:
N % 10 = 2,tnt += 2,N / 10 = 1- 第三次:
N % 10 = 1,tnt += 1,N / 10 = 0- 循环结束,tnt = 6。
12、小明想要快速知道任给一个正整数中有多少个奇数位(数位值是奇数),下面的C++代码是其实现,横线处应该填入的代码是( )。
cpp
int N;
cin >> N;
int odd_count = 0; // 记录奇数的个数
int old_number = N; // 保存原数
while (N != 0){
if (__________)
odd_count += 1;
N = (N - N % 10) / 10;
}
cout << old_number << "中共有" << odd_count << "个奇数";
cpp
A. N % 10 % 2 == 0
B. N % 10 % 2 == 1
C. N / 10 / 2 == 1
D. N / 2 / 10 == 0
正确答案:B
判断数位是否为奇数:
N % 10获取当前最低位的数字。N % 10 % 2 == 1判断该数字是否为奇数。- 如果是奇数,则
odd_count加 1。例如 N = 123:
- 第1次循环:
N % 10 = 3,3 % 2 = 1,奇数,count++- 第2次循环:
N % 10 = 2,2 % 2 = 0,偶数- 第3次循环:
N % 10 = 1,1 % 2 = 1,奇数,count++- 最终 odd_count = 2
13、小明和弟弟在玩一个拼数字游戏,游戏规则是:二人各写一个两位正整数M和N;然后将大的数字放在较小的前面,拼成一个4位数;将这个4位数除以3的余数添加到4位数的后面,得到一个5位数;最后判断这个5位数能否被14整除。下面的C++代码用于判断M和N是否符合全部要求。如果符合则输出Y否则输出N。例如输入85和79,可以拼出85792,恰好是14的倍数,则输出Y。关于下面代码描述正确的是( )。
cpp
int M, N, Q;
cin >> M >> N;
if (M > N) // L1
Q = M * 100 + N;
else
Q = N * 100 + M;
if ((Q * 10 + Q % 3) % 14 == 0) // L2
cout << "Y";
else
cout << "N";
cpp
A. 代码段不能完成正确判断
B. L1行代码中条件应该改为 M <= N
C. L2行代码应该改为 if ((Q * 10 + Q / 3) % 14 == 0)
D. 代码段可以不使用变量 Q,而是在区分 M 和 N 大小后分别直接用它们来判断
正确答案:D
代码分析:
- L1行:正确区分 M 和 N 的大小,将大的数字放在前面拼接。
- L2行:
Q * 10 + Q % 3正确地构造了5位数,其中Q % 3是余数。- 验证:M=85, N=79,Q=8579,5位数=85792,85792 % 14 = 0,输出 Y。
D选项正确:可以不使用中间变量 Q,直接在判断后计算和判断,代码更简洁。
14、执行下面C++代码可以判断一个6位正整数 N 的高3位和低3位的差是否是314的倍数。例如 628314 就符合要求。横线处应该填入( )。
cpp
cin >> N;
if (___________________________)
cout << N << "符合条件" << endl;
cpp
A. ((N % 1000) - (N / 1000)) / 314 == 0
B. ((N / 1000) - (N % 1000)) % 314 == 0
C. ((N % 1000) - (N / 1000)) / 314
D. ((N / 1000) - (N % 1000)) % 314
正确答案:B
数值分解:
N / 1000获取高3位数字。例如 628314 / 1000 = 628。N % 1000获取低3位数字。例如 628314 % 1000 = 314。- 高3位 - 低3位 = 628 - 314 = 314。
- 判断差值是否是314的倍数:使用取模运算
% 314 == 0。注意:需要取差的绝对值或在题目要求高3位≥低3位时直接用高减低。根据题目描述,答案 B 正确。
15、N 是一个正整数。如果 N 的所有奇数位的数位和等于所有偶数位的数位和,则称它是一个"双螺旋数"。例如 12375 的所有奇数位的数位和是9,同时它的所有偶数位的数位和也是9,则 12375 就是一个双螺旋数。下面的C++代码用于判断输入的 N 是否为双螺旋数。空白处应该填入的代码是( )。
cpp
int i, N, N1 = 0, N2 = 0, N0;
cin >> N;
N0 = N;
while (N){
____________
}
if (N1 == N2)
cout << N0 << "是双螺旋数" << endl;
cpp
A. N1 += N % 10, N /= 10; N2 += N % 10, N /= 10;
B. N1 += N / 10, N /= 10; N2 += N / 10, N /= 10;
C. N1 += N % 10, N %= 10; N2 += N % 10, N %= 10;
D. N1 += N / 10, N %= 10; N2 += N / 10, N %= 10;
正确答案:A
双螺旋数判断:
- N1 用于累加奇数位的和,N2 用于累加偶数位的和。
- 每次循环处理两位:先取一个数位加到 N1,再取下一个数位加到 N2。
N % 10取当前最低位,N /= 10去掉最低位。- 以 12375 为例(从右向左):
- 第1次:N1 += 5,N = 1237
- 第2次:N2 += 7,N = 123
- 第3次:N1 += 3,N = 12
- 第4次:N2 += 2,N = 1
- 第5次:N1 += 1,N = 0
- 结果:N1 = 9, N2 = 9
判断题(每题 2 分,共 20 分)
1、小明的妈妈最近刚刚给他买了一块电话手表,除了可以看时间,小明也可以用它和妈妈打电话、收发信息,那么可以推测这块手表中装有一款特定操作系统。( )
正确答案:正确
现代智能电话手表具备打电话、收发信息等智能功能,这些功能需要操作系统的支持。
- 智能手表通常运行特定的嵌入式操作系统,如 WatchOS、Wear OS 等。
- 操作系统管理硬件资源,提供应用程序运行环境。
- 电话、短信、时间显示等功能都依赖操作系统的支持。
2、C++表达式 4 % 2 和 2 * 2 % 2 的结果相同。( )
正确答案:正确
表达式计算:
4 % 2 = 0:4 除以 2 的余数为 0。2 * 2 % 2 = 4 % 2 = 0:先计算 2 * 2 = 4,再计算 4 % 2 = 0。两个表达式的结果都是 0,因此相同。
3、下面C++代码段成功执行后将输出 0。( )
cpp
for (i = 1; i < 10; i++)
if (i % 3 == 0)
cout << i;
break;
正确答案:错误
代码分析:
- for 循环体只包含
if (i % 3 == 0) cout << i;这一条语句。break;不在循环体内,而是循环结束后执行。- 循环会输出 3、6、9(所有能被 3 整除的数)。
- 循环结束后执行
break;,但这时代码已经跳出循环,break 没有意义。实际输出是 369,不是 0。
4、下面能够正常执行的C++代码段用于求1到N之和,N为正整数。因为 i < N + 1,所以是1到N且包含N之和。( )
cpp
tnt = 0;
cout << "请输入正整数:";
cin >> N;
total = 0;
for (i = 1; i < N + 1; i++)
;
total += i;
cout << total;
正确答案:错误
代码分析:
- for 循环体只有一个空语句
;,不执行任何操作。total += i;不在循环体内,而是在循环结束后执行一次。- 循环结束后 i = N + 1,执行
total += (N + 1)。因此,这段代码不能正确计算1到N的和,而是输出 N + 1。
5、执行下面的C++代码段,其语句 cout << (N) 将被执行0次或无数次(即死循环)。( )
cpp
cin >> N;
while (N)
cout << (N);
正确答案:正确
代码分析:
- 如果 N = 0,条件
while (N)为假,循环体执行 0 次。- 如果 N ≠ 0,条件永远为真,循环会无限执行,形成死循环。
6、下面的C++代码段的变量都是整型,它能用于判断输入的正整数是否为对称数。所谓对称数是指从左到右和从右到左读该数,其值相同。例如,121 和 414 都是对称数,而 123 不是对称数。( )
正确答案:正确
对称数判断原理:
- 对称数的特点是正读和反读相同。
- 可以通过反转数字来判断:将原数反转后与原数比较。
- 如果相等,则是对称数;否则不是。
代码逻辑正确,能够判断输入的正整数是否为对称数。
7、执行下面的C++代码段,如果变量都为整型变量,输入为大于0的整数,则输出数值一定为 -N 的值。( )
cpp
cin >> N;
total = 0;
for (i = -N; i < N; i += 2)
total += i;
cout << total;
正确答案:正确
代码分析:
- 循环从 i = -N 开始,每次增加 2,直到 i >= N。
- 计算的是所有奇数位置的和(如果 N 为偶数)或所有偶数位置的和(如果 N 为奇数)。
- 以 N = 4 为例:i = -4, -2, 0, 2,total = -4 + (-2) + 0 + 2 = -4。
- 以 N = 5 为例:i = -5, -3, -1, 1, 3,total = -5 + (-3) + (-1) + 1 + 3 = -5。
8、执行C++语句 printf("%d\n", 3.14) 将报错。( )
正确答案:错误
代码分析:
printf("%d\n", 3.14)使用%d格式说明符输出一个浮点数。- 虽然
%d用于输出整数,但编译器不会报错,而是会产生警告。- 运行时,浮点数 3.14 会被错误地解释为整数,输出一个不确定的整数值。
因此,程序不会报错,但输出结果不正确。
9、执行下面的C++代码后将输出 2500。( )
cpp
int cnt = 0;
for (int i = 1; i < 100; i++)
cnt += i++;
cout << cnt;
正确答案:正确
代码分析:
- 循环中
i++会使 i 在每次迭代后增加 2(一次在循环体中,一次在步进表达式中)。- i 的取值为 1, 3, 5, 7, ..., 99。
- 计算的是 1 + 3 + 5 + ... + 99 = 2500(前50个奇数的和)。
10、小明在测试C++的 printf 的功能时执行了 printf("%-5d\n", 314),则代码输出的结果是 -5314。( )
正确答案:错误
格式化输出分析:
%-5d表示左对齐输出整数,宽度为 5 个字符。- 输出结果是 "314 "(314 后面有两个空格)。
-5是格式说明符的一部分,不是要输出的内容。因此,输出结果不是 -5314,而是 "314 "(314 左对齐,右补空格)。
编程题(每题 25 分,共 50 分)
交朋友
【问题描述】
Alice 班上共有 4 个小朋友,身高分别为 H 1 H_1 H1, H 2 H_2 H2, H 3 H_3 H3, H 4 H_4 H4,其中 Alice 的身高为 H 1 H_1 H1。Alice 想要和身高最接近她的人交朋友,如果有多个人符合条件,则 Alice 想和其中较矮的那一人做朋友,你能告诉她这个人的身高是多少吗?
【输入描述】
输入共 4 行,第 i 行包含一个整数 H i H_i Hi,表示班上小朋友的身高。
【输出描述】
输出 1 行,包含一个整数 h,表示 Alice 想交的朋友的身高。
【样例输入 1】
150
165
135
133
【样例输出 1】
135
【样例解释 1】
样例1中,Alice 身高为 150,第 2、3 个小朋友与 Alice 身高差距为 15,同样最接近,Alice 选较矮的一个即第 3 个身高为 135 的小朋友交朋友。
【数据范围】
保证 100 ≤ H i ≤ 199 100 \leq H_i \leq 199 100≤Hi≤199 且 H i H_i Hi 互不相同。
cpp
#include <iostream>
using namespace std;
int main(){
int H1, H2, H3, H4;
cin >> H1 >> H2 >> H3 >> H4;
int ans = H2; // 记录最接近的身高
int d = H1 - H2; // 计算身高差
if (d < 0) d = -d; // 取绝对值
int mnd = d; // 记录最小差距
// 检查 H3
d = H1 - H3;
if (d < 0) d = -d;
if (d < mnd || (d == mnd && H3 < ans)){
ans = H3;
mnd = d;
}
// 检查 H4
d = H1 - H4;
if (d < 0) d = -d;
if (d < mnd || (d == mnd && H4 < ans)){
ans = H4;
}
cout << ans << endl;
return 0;
}
数字替换
【问题描述】
Alice 不喜欢数字 4,但觉得数字 8 寓意好,她想把数中的 4 全都替换成 8,若数中不含 4 则无需修改,你能帮帮她吗?
【输入描述】
输入一行,包含一个整数 A,表示替换前的数。
【输出描述】
输出一行,包含一个整数 B,表示替换后的数。
【样例输入 1】
8459045
【样例输出 1】
8859085
【样例输入 2】
123
【样例输出 2】
123
【样例解释】
对于样例1,输入 8459045 中有两个 4,都将其替换为了 8,得到 8859085。对于样例2,输入 123 中不包含 4,无需修改输入数字,输出 123。
【数据范围】
0 ≤ A ≤ 10 8 0 \leq A \leq 10^8 0≤A≤108
cpp
#include <iostream>
using namespace std;
int main() {
int a, b = 0, t = 1; // a为原数,b为结果,t为位权
cin >> a;
// 特殊情况:输入为0
if (a == 0) {
cout << 0 << endl;
return 0;
}
while (a) {
int digit = a % 10; // 取最低位
if (digit == 4)
b += t * 8; // 将4替换为8
else
b += t * digit; // 保持原数字
a /= 10; // 去掉最低位
t *= 10; // 位权乘10
}
cout << b << endl;
return 0;
}