1 单选题(每题 2 分,共 30 分)
第1题 2026年春节联欢晚会上一个武术表演节目《武 BOT》。节目中多个人形机器人会表演空翻,它们落地可能会 有微微踉跄,但都会迅速调整姿态站稳,并适当移动来和前后左右的其他机器人保持原来队列。如果将机器人视作 一个计算机系统,那么在该计算机系统中下面哪一项不能作为输入设备( )。
A. 检测重心的重力传感器 B. 预装的AI算法程序
C. 接收动作指令的遥控器 D. 拍摄其他机器人的摄像头
解析:答案B。传感器、键盘、鼠标、遥控器、游戏杆、摄像头、麦克风等是输入设备,屏幕、打印机等中输出设备。算法程序是软件不属于输入输出设备,所以B错误。故选B。
第2题 下面代码用来找出输入的N个正整数中最大的一个。如果将代码段用流程图来表示,则 L1 标记的代码行应该使用的图形是( )。
cpp
int N, max=0, val;
cin >> N;
while(N){
cin >> val;
if(val > max) // L1
max = val;
N--;
}
cout << max;
A. 圆形框 B. 椭圆形框 C. 平行四边形框 D. 菱形框
解析:答案D。L1处if(val > max) 为条件语句,流程图为菱形框。故选D。
第3题 下面 C++ 代码可以执行,有关说法正确的是( )。
cpp
double PI = 3.1415926;
cout << (PI);
A. 为了方便初学者, cout << (PI) 和 cout << (pi) 效果相同,即变量的大小写不敏感
B. cout << (PI) 修改为 cout << (Pi) 能正常执行
C. 不能用 PI 做变量名,因为要保存圆周率这个常量
D. 将程序中全部 PI 都改写为 Pai ,将能正常执行,不会报错
解析:答案D。C++/C变量名是大小写敏感的,即大小写是不同不变量,因此PI、Pi、pi是三个不同的变量,故A、B错误,PI符合C++/C变量名命名规则,可以赋常数,故C错误。变量名可以是PI,也可以是Pai,两者都符合C++/C变量名命名规则,所以D正确。故选D。
第4题 下面选择项中,与C++表达式 !(x > 5 && y <= 10) 等价的是( )。
A. x <= 5 && y > 10 B. x > 5 || y <= 10
C. x <= 5 || y > 10 D. ! x > 5 && ! y <= 10
解析:答案C。!(x > 5 && y <= 10)= !(x > 5) || !(y <= 10) = x <= 5 || y > 10,所以C正确。故选C。
第5题 某同学执行C++代码 cout << ((0.1 + 0.2) == 0.3) 时输出 0 ,下面最可能的原因是( )。
A. C++的 + 运算符在处理小数时存在bug
B. 0.1、0.2 和 0.3 在计算机中无法用二进制浮点数精确表示,导致 0.1 + 0.2 的结果与 0.3 存在微小误差
C. == 运算符不能用于比较浮点数,只能用于整数
D. 因为 0.1 + 0.2 的数学结果不等于 0.3
解析:答案B。C++的 + 运算符在处理小数时不存在bug,A错误;由于二进制表示小数时位数有限(float23位,double52位),导致表示二进制小数时会存在误差,凡不能用有限位二进制(精度)精确表示的数就会存在舍入而导致误差,所以B正确;==不只能用于比较整数,C错误;0.1+0.2的数学结果等于0.3,D错误。故选B。
第6题 下面的 C++ 代码段执行后其输出是( )。
cpp
tnt = 0;
for (int i = 0; i < 5; i++){
for (int j = 0; j < i; j++)
tnt += 1;
cout << tnt << "#";
}
cout << tnt;
A. 0#1#3#6#10#10 B. 1#2#3#4#5#6#7#8#9#10#10
C. 10#10 D. 10
解析:答案A。当i=0时,j循环不能执行,tnt=0,输出0#;当i=1时,j循环执行一次,tnt=1,输出1#;当i=2时,j循环执行二次,tnt=3,输出3#;当i=3时,j循环执行三次,tnt=6,输出6#;当i=4时,j循环执行四次,tnt=10,输出10#。循环结束tnt=10,第7行输出10,故合并输出为0#1#3#6#10#10,A正确。故选A。
第7题 下面的 C++ 代码执行之后的输出是( )。
cpp
for ( int i = -2; i < 2; i++)
if (not i % 3)
cout << i << "#";
A. 0# B. -2#-1#1# C. -1#0# D. -2#0#1#
解析:答案A。注意C++/C中运算符not优先级高于%,当i=-2时,-2为非0,逻辑为ture, not i为逻辑false,等价为0,所以not i % 3=0,没有输出;所以只要i非0,无输出。当i=0时,i为逻辑为false, not i为逻辑ture,等价为1,所以not i % 3=1,等价为真,输出0#,所以A正确。故选A。
第8题 下面的 C++ 代码执行后其输出是( )。
cpp
int cnt = 0, i, j;
for (i =1; i < 5; i++){
for (j =0; j < i; j++)
cout << j << "#";
break;
}
if(i >= 5)
cout << (i*j);
A. 0#0#1#0#1#2#0#1#2#3#12 B. 0#0#1#0#1#2#0#1#2#3#
C. 0# D. 1#
解析:答案C。当外循环i=1时,内循环执行1次,输出0#,然后执行第5行break,中断外循环(跳出外循环),因i=1,第7行条件不成立没有输出i*j,合计输出0#,所以选项C正确。故选C。
第9题 下面 C++ 代码执行后其输出是( )。
cpp
int count = 0;
for (int i = 1; i < 4; i++)
for (int j = 1; j < 5; j++){
if (j == 3)
continue;
if (i == 2)
break;
count += 1;
}
cout << (count);
A. 2 B. 4 C. 6 D. 8
解析:答案C。当i=1时,count+=1执行3次,count=3;当i=2时,当j为1时,j==3不成立,i==2成立,结束j循环;当i=3时count+=1执行3次,count=6。循环结束后输出count的结果为6,所以C正确。故选C。
第10题 下面4个选项中,与下面 C++ 代码段具有相同效果的是( )。
cpp
i = 0;
while (i < 5){
cout << i;
i += 1;
}
A.
cpp
for (i = 0; i < 5; i++)
cout << i;
B.
cpp
for (i = 1; i < 5; i++)
cout << i;
C.
cpp
for (i = 0; i < 6; i++)
cout << i;
D.
cpp
for (i = 1; i < 6; i++)
cout << i;
解析:答案A。原程序循环5次,先输出i再i加1,故输出01234。选项A,i从0循环到4也是5次,输出01234,故正确;选项B,i从1循环到4是4次,输出1234,故正错误;选项C,i从0循环到5也是6次,输出012345,故错误;选项D,i从1循环到5是5次,输出12345,故错误。故选A。
第11题 下面 C++ 代码执行后输出是( )。
cpp
int n = 10;
while (n > 0){
n -= 1;
if (n % 3 == 0)
continue;
if (n == 5)
break;
}
cout << n;
A. 0 B. 5 C. 6 D. 7
解析:答案B。因第4行n是3的倍数continue到下一轮循环,当循环n=6时,n-=1,n=5,第4行条件不成立,执行第6行,条件成立执行break,中断循环而跳出循环,此时n=5,第9行输出5。故选B。
第12题 下面 C++ 代码段执行后,其输出是( )。
cpp
int i, j, cnt;
cnt = 0;
for (i = 0; i < 5; i++){
i = -i;
for (j = i; j < -i; j++)
cnt += 1;
i = -i;
}
cout << cnt;
A. 5 B. 15 C. 20 D. 30
解析:答案C。当外层循环i=0时,i=-i=0,内层循环不执行,cnt=0;当外层循环i=1时,i=-i=-1,内层循环执行2次,cnt=2;当外层循环i=2时,i=-i=-2,内层循环执行4次,cnt=6;当外层循环i=3时,i=-i=-3,内层循环执行6次,cnt=12;当外层循环i=4时,i=-i=-4,内层循环执行8次,cnt=20。故选C。
第13题 某学校图书馆的借阅卡号由6位整数组成。前5位是顺序编号,第6位是校验码,用于防止输错。校验码规则如下:将前5位数字相加,然后除以10的余数,就是第6位数字。如卡号 123455 的前5位之和为 15 ,除以 10 的余数是5,故第6位为5。下面的C++代码段用于判断卡号是否正确,横线处应填入的代码是( )。
cpp
cout << "请输入卡号:";
cin >> N;
order_num = N / 10; // 获得前5位顺序号,假设录入一定为6位正整数
check_num = N % 10; // 获得最后一位
tnt = 0; // 保存前5位之和
for (i = 0; i < 5; i++){
________________;
order_num /= 10;
}
if (__________________)
cout << "符合校验规则";
else
cout << "不符合校验规则";
A.
cpp
tnt += order_num / 10
tnt / 10 == check_num
B.
cpp
tnt += order_num % 10
tnt % 10 == check_num
C.
cpp
tnt = order_num / 10 + tnt
tnt % 10 == check_num
D.
cpp
tnt = order_num % 10
tnt / 10 == check_num
解析:答案B。按题目描述,第8行应该取每1位数求和,故应填写tnt = tnt + order_num % 10; ,第12行比较计算的校验和tnt % 10与输入的最后一位check_num是否相等,相等符合校验规则,故应填写tnt % 10 == check_num,选项B符合。故选B。
第14题 下面的 C++ 代码段正常执行后其输出的数字图形是( )。
cpp
for (i = 1; i < 5; i++){
for (j = 1; j < i+1; j++)
cout << j;
cout << endl;
}
A.
cpp
1
12
123
1234
B.
cpp
1
22
333
4444
C.
cpp
1
21
321
4321
D.
cpp
4
34
234
1234
解析:答案A。根据程序内层循环j是从1到i+1且j++,即从1开始到大输出一行,故B、C、D排除。当外循环i=1时,内循环输出1;当外循环i=2时,内循环输出12;当外循环i=3时,内循环输出123;当外循环i=4时,内循环输出1234,与选项A一致。故选A。
第15题 某学校举办"校园演讲比赛",每位选手由8位评委打分(分数为 0~10 的整数),且每位评委必须打分。计分规则:若至少有5位评委给出大于等于6分,则成绩有效,最终得分为所有8位评委的总分;如给出低于6分的评委数量超过5位,则记为0分。以下核心程序段依次输入8个分数,并计算最终得分。横线处应填入( )。
cpp
total_score = 0; // 所有分数之和
high_count = 0; // ≥6分的评委数量
for (i = 0; i < 8; i++){
cout << "请输入评委分数: ";
cin >> score;
____________________;
if (score >= 6)
________________;
}
if (high_count >= 5)
cout << total_score;
else
cout << 0;
A.
cpp
total_score += score
high_count += 1
B.
cpp
total_score += score
high_count += score
C.
cpp
high_count += 1
total_score += score
D.
cpp
total_score *= score
high_count *= 1
解析:答案A。根据程序分别读入8位评委的打分数,求总分(保存于total_score),如评委评分大于6分计数(保存于high_count)。当计分大于等于5时输出总分,否则输出0。故第7行求和填写total_score += score,第9行计数填写high_count++(或high_count += 1),选项A符合。故选A。
2 判断题(每题 2 分,共 20 分)
第1题 小明的妈妈最近刚刚给他买了一块电话手表,除了可以看时间,小明也可以用它和妈妈打电话、收发信息,那么可以推测这块手表中装有一款特定操作系统。( )
解析:答案正确(√)。可以看时间、打电话和收尾信息的电话手表,属智能手表,需要安装智能手表操作系统。故正确。
第2题 C++ 语句 cout << ('4' % '2' == '2' * '2' % 2); 执行后的输出是1。( )
解析:答案错误(╳)。'4'和'2'是字符类型,等价单字节整数(即ASCII码值,也等同UNICODE码值),'4'等价52、'2'等价50,所以'4' % '2' == '2' * '2' % 2等价52 % 50 == 50 * 50 % 2,即2 == 0,结果为否,输出0。故错误。
第3题 下面的 C++ 代码段执行时将报错,因为10是整数类型, a 是布尔类型。由于类型不同,不能进行加法运算。( )
cpp
bool a = true;
cout << (10 + a);
解析:答案错误(╳)。C++/C布尔类型true默认等价为整数1,代码可正确运行,输出11。故错误。
第4题 下面C++代码段执行后将输出 0-3-6-9- 。 ( )
cpp
for (int i = 0; i < 10; i++){
if (i % 3)
continue;
cout << i << "-";
}
解析:答案正确(√)。数字0等价逻辑false,数字1等价逻辑true,所以i%3作为条件时,i能被3整除为0等价条件不成立,否则i不能被3整除则条件成立。对题目所给程序,i不是3的倍数,则continue,回到循环开始进入下一轮循环(相当于跳过本循环从continue之后的语句)不执行第4行cout语句。只有i是3的整数倍的i能输出,输出为0-3-6-9-,故正确。
第5题 执行下面的 C++ 代码段,如果N是基本数据类型,则语句 cout << (N); 将被执行 0 次或无数次(即死循环)。( )
cpp
cin >> N;
while (N)
cout << (N);
解析:答案正确(√)。GESPC++二级所学的基本数据类型包括:整型、浮点型、字符型、布尔型,都属于数值类型或等价数值类型。当N为0或等价为0时,条件不成立,cout << (N)执行0次;当N不为0或等价不为0时,条件成立,因没有改变N的语句,N不变,所以会无限循环,无数次执行cout << (N),即"死循环"。故正确。
第6题 下面的 C++ 代码段可正常执行,删除 continue 不影响执行效果。( )
cpp
for (i = 0; i < 10; i++){
i += 1;
continue;
}
cout << (i);
解析:答案正确(√)。题目所给程序的continue语句行位于循环体的最后一行,有没有continue语句行,都执行了全部循环体的有效语句,不影响执行结果(效果),故正确。
第7题 下面的 C++ 代码段用于计算1到N之间且包含N的所有数字中含有的3的个数,如1到40含有14个3, 而1到20则只含有2个3。如果将 while (i != 0) 改为 while (abs(i)) ,则执行结果相同。( )
cpp
cout << "请输入正整数N:";
cin >> N;
cnt = 0; // 保存3的个数
for (k = 1; k < N + 1; k++){
i = k;
while (i != 0){
if (i % 10 == 3)
cnt += 1;
i /= 10;
}
}
cout << cnt;
解析:答案正确(√)。C++/C中abs()为取绝对值函数,对数字0等价逻辑假,数字非0等价逻辑真,所以(i !=0)等价于(i)等价(abs(i))。故正确。
第8题 下面的 C++ 代码段执行将不会有输出,因为内层循环 j 总是 0 开始, i * j % 10 == 0 将会被满足,执行 break ,故而 i 小于 10 ,不会满足 if 判断条件。( )
cpp
for (i = 1; i < 10; i++)
for (j = 0; j < i; j++)
if (i * j % 10 == 0)
break;
if(i >= 10)
cout << (i*j);
解析:答案错误(╳)。题目拨给程序中,虽然内层循环j总是0开始,i * j % 10 == 0将会被满足,执行break,但结束循环时i=10,j=0,第5行条件I >= 10成立,会输出0。故错误。
第9题 下列 C++ 代码执行后将输出 1#4#9#16#16 。( )
cpp
cnt = 0;
for (i = 1; i < 5; i++){
for (j = 1; j < i + 1; j++)
if (i * j % 10 == 0)
break;
if (j >= i + 1)
cout << (i * j) << "#";
}
if(i >= 5)
cout << (i * j);
解析:答案错误(╳)。题目拨给程序中,外层循环i从1到4,内层循环j从1到i,i*j%10 不可能为0,所以不会执行break,内循环每次结束j=i+1成立,所以输出i*j=i*(i+1),最后一轮i=4时内循环结束j=5,当外循环结束时i=5,所以正确输出为2#6#12#20#25。故错误。
第10题 下面 C++ 代码执行后输出如左图所示,将 " %d" 修改为 "%3d" 即可实现右图输出。( )
cpp
/*
// 左图 // 右图
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18 2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27 3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36 4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45 5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54 6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63 7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72 8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81 9 18 27 36 45 54 63 72 81
*/
for (i = 1; i < 10; i++){
for (j = 1; j < 10; j++)
printf(" %d", i*j);
printf("\n");
}
解析:答案正确(√)。" %d" 中的空格是普通字符,会原样输出到终端。%d 是格式说明符(占位符),用于指示 printf 将后续参数按十进制有符号整数的形式输出。所以输入的数字前会多一个空格。因i*j的结果从1(1位)到81(2位),所以数字1~81不会按列对齐,如题目中的左图。
"%3d"的组成与含义:%:格式说明符的起始标志。3:指定最小字段宽度(即输出至少占 3 个字符宽度),如果输出的整数位数小于3,则左侧补空格(默认右对齐,如果输出的整数位数≥3,则按实际位数输出,不截断。d:表示按十进制有符号整数的形式输出。因i*j的结果从1(1位)到81(2位),所以数字1~81会按列对齐(每个数占3位),如题目中的右图。故正确。
但题目是有瑕疵的,右图明显是每个数占4位,是" %3d"的输出而不是"%3d"的输出。
3 编程题(每题 25 分,共 50 分)
3.1 编程题 1
- 试题名称:数数
- 时间限制:1.0 s
- 内存限制:512.0 MB
3.1.1题目描述
对于正整数𝑛,如果𝑛的所有数位中包含恰好 3个2,Alice 会认为这个正整数是美丽的。例如,正整数24122中包含3个2,所以24122是 美丽的;正整数132中包含1个2,所以132不是 美丽的;正整数212322中包含4个2,所以212322不是美丽的。
Alice 想知道正整数𝐿到正整数𝑅(包括𝐿和𝑅)中有多少美丽的正整数,你能帮她数一数吗?
3.1.2 输入格式
输入共2行,第一行为正整数𝐿,第二行为正整数𝑅。
3.1.3 输出格式
输出一行,包含一个整数𝐶,表示𝐿到𝑅中𝐶美丽数的数量。
3.1.4 样例
3.1.4.1 输入样例
cpp
2221
2223
3.1.4.2 输出样例
cpp
2
3.1.5 样例解释
2221到2223中,2221与2223是美丽的,2222不是美丽的。
3.1.6 数据范围
保证1≤𝐿≤𝑅≤10⁶。
3.1.7 编写程序
解析:要判断一个数N有多个2,可以取其每一位进行判断,取个位可用N%10,个位判断过了就去掉个位,用N/=10,新N的个位即原十位,循环操作直到N=0。
n从L循环到R,用上述方法判断每个n中2的个数,如是3个2则计数。参考代码如下:
cpp
#include <iostream>
using namespace std;
int main() {
int L = 0, R = 0, cnt = 0; // L≤L≤10⁶, cnt美丽的正整数个数
cin >> L >> R;
for (int i = L; i <= R; i++) { // 包含L和R
int s = 0, n = i; // s为n中2的个数
while (n) {
if (n % 10 == 2) s++; // 如n的个位数为2则计数
n /= 10; // 更新n(去掉已处理的个位)
}
if (s == 3) cnt++; // 如s为n中2的个数s=3则美丽数计数
}
cout << cnt << endl;
return 0;
}
3.2 编程题2
- 试题名称:画画
- 时间限制:1.0 s
- 内存限制:512.0 MB
3.2.1题目描述
输入一个正整数𝑛,你需要绘制一个𝑛行𝑛列的正方形,绘制规则如下:
正方形的四个顶点使用 + 绘制;
除顶点外,第1行与第𝑛行使用 - 绘制;
除顶点外,第1列与第𝑛列使用 | 绘制;
正方形内部使用 * 绘制。
3.2.2 输入格式
一行,一个正整数𝑛。
3.2.3 输出格式
输出共𝑛行,表示对应的正方形。
3.2.4 样例
3.2.4.1 输入样例
cpp
5
3.2.4.2 输出样例
cpp
+---+
|***|
|***|
|***|
+---+
3.2.5 数据范围
保证3≤𝑛≤100。
3.2.6 编写程序
解析:设行i从1到n,列j从1到n。①四个角(i=1, j=1)、(i=1, j=n)、(i=n, j=1)、(i=n, j=n)。②除顶点外的第1行或第𝑛行(i=1, i=n)。③除顶点外的第1列或第𝑛列(j=1, j=n)
方法一:
①四个角的条件(i=1 && j=1) || (i=1 && j=n) || (i=n && j=1) || (i=n && j=n),满足这个条件之一的输出+。
②除顶点外的第1行或第𝑛行条件(i=1 || i=n),满足条件的输出-。
③除顶点外的第1列或第𝑛列条件(j=1 || j=n),满足条件的输出|。
其他输出*。参考代码如下:
cpp
#include <iostream>
using namespace std;
int main() {
int n; // 3≤n≤100
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if ((i == 1 && j == 1) || (i == 1 && j == n) || (i == n && j == 1) || (i == n && j == n))
cout << "+"; // 四个角输出"+"
else {
if ((i == 1 || i == n) || (j == 1 || j == n))
if (i == 1 || i == n)cout << "-"; // 第1、n行输出"-"
else cout << "|"; // 第1、n列输出"|"
else
cout << "*"; // 其他输出"*"
}
}
cout << endl; // 换行
}
return 0;
}
方法二:
换个角度看问题。从行看:第1行和第n行的第1列为+,其余列为-,其他行的第1列和第n列为|,其余列为*。参考代码如下:
cpp
#include <iostream>
using namespace std;
int main() {
int n; // 3≤n≤100
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == 1 || i == n) // 第1行和第n行的
if (j == 1 || j == n)
cout << "+"; // 第1列和第n列输出"+"
else cout << "-"; // 其他列输出"-"
else {
if (j == 1 || j == n) // 其他行的
cout << "|"; // 第1列和第n列输出"|"
else cout << "*"; // 其他列输出"*"
}
}
cout << endl; // 换行
}
return 0;
}