GESP 客观题评测系统

2025-06-Level-2

2025-06-Level-2

试卷解析总览,可直接查看每题答案与解析。

单选题(每题 2 分)

1 题(单选题

2025年4月19日在北京举行了一场颇为瞩目的人形机器人半程马拉松赛。比赛期间,跑动着的机器人会利用身上安装的多个传感器所反馈的数据来调整姿态、保持平衡等,那么这类传感器类似于计算机的()。

A.
处理器
B.
存储器
C.
输入设备
D.
输出设备

正确答案C

解析详情

【答案】C

【考点】输入设备;传感器作用

【解析】 传感器负责采集外界或自身状态数据,再把这些数据送给控制系统处理,这个作用相当于计算机把信息“输入”进去的输入设备。处理器负责运算,存储器负责保存数据,输出设备负责把结果展示出来,都不符合题意。

【易错点】容易因为题干提到“调整姿态”就误选处理器,真正采集数据的是传感器。

2 题(单选题

小明购置的计算机使用一年后觉得内存不够用了,想购置一个容量更大的内存条,这时他需要的内存条是()。

A.
RAM
B.
ROM
C.
CACHE
D.
EPROM

正确答案A

解析详情

【答案】A

【考点】内存;RAM 与 ROM 区别

【解析】 平时说给电脑“加内存”,指的是增加运行内存,也就是 RAM。ROM 是只读存储器,CACHE 是高速缓存,EPROM 是可擦除可编程只读存储器,它们都不是普通电脑升级时购买的内存条。

【易错点】不要把“内存条”与 ROM 混淆,家用电脑扩容通常加的是 RAM。

3 题(单选题

下面C++代码执行后的输出 is ()。

int a = 3;
float b = 3.5;
cout << (a * = b);
A.
3
B.
3.5
C.
10
D.
11

正确答案C

解析详情

【答案】C

【考点】复合赋值;整型与浮点型转换

【解析】 先计算 a *= b,等价于 a = a * b。原来 a=3、b=3.5,乘积是 10.5,再赋回给整型变量 a 时小数部分被舍去,得到 10,输出的也是 10。

【易错点】看到 3 * 3.5 容易直接选 10.5 或 11,但结果最终存回的是 int。

4 题(单选题

下面C++代码用于获得正整数的第3位数,如1234则输出2。如果是一位数或两位数,则输出0。横线处应填入的代码是()。int N, remainder;

cout << "请输入正整数:";
cin >> N;
cout << ___;
A.
N % 1000 / 100
B.
N / 1000 % 100
C.
N / 1000 / 100
D.
N % 100 / 100

正确答案A

解析详情

【答案】A

【考点】整数拆位;取模与整除

【解析】 第 3 位数指百位。N % 1000 先保留后三位,再 / 100 取出百位,例如 1234 % 1000 = 234,234 / 100 = 2。如果 N 只有一两位,N % 1000 仍小于 100,整除 100 后自然得到 0。

【易错点】/1000 取到的是千位及更高位,不是第 3 位。

5 题(单选题

下面C++代码执行,其输出是()。

int a, b = (6, 28);
b == a;
a = b;
cout << a << ' ' << b;
A.
6 28
B.
6 6
C.
28 6
D.
28 28

正确答案D

解析详情

【答案】D

【考点】逗号运算符;比较表达式

【解析】 表达式 (6, 28) 的值是最后一个数 28,所以 b 被初始化为 28。语句 b == a; 只是做比较,没有赋值效果;随后 a = b;,因此 a 和 b 都变成 28,输出 28 28。

【易错点】== 是比较不是赋值,单独写一行不会修改变量值。

6 题(单选题

今天星期六,其后第N天星期几?如果是星期一到星期六输出形如:星期1、星期2等,星期天则输出星期天。下面的C++代码用于完成上述要求,横线处应填上的代码是()。

int N, remainder;

cin >> N;
remainder = ___;
if(remainder == 0)
    printf("星期六后第%d天是星期天\n", N);
else
    printf("星期六后第%d天是星期%d\n", N, remainder);
A.
(N+6)/7(N + 6) / 7
B.
(N+6)//7(N + 6) // 7
C.
N % 7
D.
(N+6)(N + 6) % 7

正确答案D

解析详情

【答案】D

【考点】星期循环;模运算

【解析】 把星期六记作 6,向后走 N 天后可用 (N + 6) % 7 求结果。若余数为 0,说明正好落在星期天;其余余数 1 到 6 正好对应题目要求输出的“星期1”到“星期6”。只写 N % 7 会把星期六当作起点 0,和题目映射不一致。

【易错点】循环题不能只看“7 天一轮”,还要把起始星期六这个偏移量算进去。

7 题(单选题

下面的 C++ 代码执行后其输出是()。

int i, Sum = 0;
for (i = 1; i < 10; i++) {
    Sum += i;
    if (i % 2) continue;
    if (i % 7) break;
}
cout << Sum;
A.
45
B.
28
C.
3
D.
0

正确答案C

解析详情

【答案】C

【考点】`for` 循环;`continue` 与 `break`

【解析】 当 i=1 时先执行 Sum += 1,因为 1 % 2 为真,直接 continue,此时 Sum=1。i=2 时先加到 3,i % 2 为假,不继续;接着判断 i % 7,值为 2,为真,于是立刻 break 跳出循环,所以最终输出 3。

【易错点】要注意 Sum += i 在两个判断之前执行,不能只盯着 break。

8 题(单选题

下面C++代码执行后其输出是()。

int i, j;

for(i = 1; i < 12; i++)
    for(j = 1; j < i; j++)
        if(i * j % 2 == 1)
            break;
cout << i * j;
A.
110
B.
22
C.
12
D.
3

正确答案C

解析详情

【答案】C

【考点】双重循环;`break` 作用范围

【解析】 内层 break 只会跳出内层循环. 奇数 i 时,j=1 就满足 i*j 为奇数,内层立刻结束;偶数 i 时不会触发 break,内层正常跑到 j=i. 外层循环结束时 i 已增到 12,而最后一次是 i=11 时在 j=1 处跳出,所以输出 12 * 1 = 12.

【易错点】不要把内层的 break 误当成结束整个双重循环。

9 题(单选题

下面C++代码执行后输出是()。

int i, cnt = 0;
for(i = -99; i < 100; i += 2)
    cnt = 1 + cnt;
cout << cnt;
A.
101
B.
100
C.
99
D.
98

正确答案B

解析详情

【答案】B

【考点】等差循环计数

【解析】 循环变量依次取 -99, -97, ..., 99,是首项 -99、末项 99、公差 2 的等差数列。项数为 (99 - (-99)) / 2 + 1 = 100,每次循环 cnt 都加 1,所以最终输出 100。

【易错点】首尾都取到时,项数公式最后要再加 1。

10 题(单选题

下面 C++ 代码执行后输出是()。

int i;

for(i = 1; i < 10; i++) {
    if(i % 3 != 0) {
        printf("A#");
        continue;
    }
    else 
        break;
    printf("0#");
}
if(i == 10) cout << "1";
A.
A#A#
B.
A#0#A#0
C.
A#A#1
D.
A#0#A#0#1

正确答案A

解析详情

【答案】A

【考点】`continue`;`break`;循环流程

【解析】 当 i=1、i=2 时都不被 3 整除,所以进入 if 输出 A#,然后 continue 进入下一轮。i=3 时条件不成立,执行 else 中的 break 直接结束循环,因此只输出两次 A#;后面的 printf("0#") 永远到不了,i 也不会变成 10。

【易错点】continue 和 break 都会让后面的 printf("0#") 失去执行机会。

11 题(单选题

下面C++代码执行后的输出是()。

int i, j;

for(i = 0; i < 3; i++)
    for(j = 0; j < i; j++)
        printf("%d%d-", i, j);
printf("END");
A.
0#0-1#0-2#0-2#1-END
B.
0#0-1#0-1#1-2#0-2#1-2#2-3#0-3#1-3#2-END
C.
0#0-1#0-1#1-2#0-2#1-2#2-END
D.
1#0-2#0-2#1-END

正确答案D

解析详情

【答案】D

【考点】双重循环输出

【解析】 当 i=0 时内层条件 j < i 不成立,没有输出。i=1 时输出一次 10-;i=2 时依次输出 20-、21-。循环结束后再输出 END,所以完整结果是 10-20-21-END,对应选项 D 的写法。

【易错点】外层从 0 开始,但 i=0 这一轮内层根本不会执行。

12 题(单选题

下面C++代码执行后,将输出不能被3整除且除以5余数为2的数。下列选项不能实现的是()。

int i, j;
for (i = 0; i < 100; i++)
    if (____)
        cout << i << endl;
A.
(i % 3 != 0) && (i % 5 == 2)
B.
(i % 3) && (i % 5 == 2)
C.
(i % 3) && !(i % 5 != 2)
D.
!(i % 3) && (i % 5 == 2)

正确答案D

解析详情

【答案】D

【考点】逻辑表达式;整除判断

【解析】 题目要求同时满足“不能被 3 整除”和“除以 5 余 2”。A 中 i % 3 != 0 正确表达了不能被 3 整除,B 中 i % 3 在 C++ 里非 0 即真,含义相同,C 里的 !(i % 5 != 2) 也等价于 i % 5 == 2。只有 D 的 !(i % 3) 等价于 i % 3 == 0,反而筛出能被 3 整除的数。

【易错点】!(i % 3) 表示“余数为 0”,不是“不能被 3 整除”。

13 题(单选题

下面C++代码用于判断一个大于0的正整数是几位数,横线处应填入代码先后是()。

int N, cnt;

cout << "请输入大于0的正整数:";
cin >> N;

cnt = 0;
while (____){
    cnt += 1;
};

cout << cnt;
A.
1     N > 1
2     N = N / 10
B.
1     N > 1
2     N / = 10
C.
1     N == 0
2     N / = 10
D.
1 N > 0
2 N / = 10

正确答案D

解析详情

【答案】D

【考点】整数位数统计;循环更新

【解析】 统计位数的常见做法是:只要 N > 0 就把 cnt 加 1,并令 N /= 10 去掉个位。这样 123 会依次变成 12、1、0,循环 3 次,最后 cnt=3。因此横线应是 N > 0 和 N /= 10,只是题目 OCR 把 0 识别成了 θ。

【易错点】如果条件写成 N > 1,输入 1 时循环不会执行,位数会被算成 0。

14 题(单选题

判断一个数是否为自守数。自守数的定义是如果一个数的平方其尾数与该数相同,则为自守数,如 25 的平方是 625,其尾数是 25,所以 25 是自守数。相关说法错误的是()。int N, N1, M1;

cout << "输入一个正整数:";
cin >> N;
N1 = N, M1 = N * N;

bool Flag = true;

while (N1 > 0){
    if (N1 % 10 != M1 % 10){
        Flag = false;
        break;
    }
    else{
        N1 = N1 / 10, M1 = M1 / 10;
    }
}

if (Flag == true){
    printf("%d的平方是%d,是自守数", N, N * N);
    else{
        printf("%d的平方是%d,不是自守数", N, N * N);
    }
}
A.
如果Flag在循环中不被改为false,则说明该数是自守数
B.
代码 if (N1 % 10 != M1 % 10) 用于判断其个位数是否相等,如果不等,则表明不是自守数
C.
代码 N1 = N1 / 10, M1 = M1 / 10 将个位数去掉
D.
将 N1 > 0 改为 N > 0 效果相同

正确答案D

解析详情

【答案】D

【考点】自守数判断;循环变量更新

【解析】 程序通过比较 N 与 N*N 的末位是否逐位相同来判断自守数,所以 B、C 的说法都对;如果每一位都匹配,Flag 不会被改成 false,A 也正确。D 错在把 while (N1 > 0) 改成 while (N > 0) 后,循环体里并没有更新 N,条件始终不变,程序逻辑就被破坏了。

【易错点】循环条件里应使用会被不断缩小的变量,而不是原始输入值。

15 题(单选题

下面 C++ 代码实现输出如下图形。关于该程序的说法,错误的是( )。程序运行示例:

请输入行数: 10
0
12
345
6789
01234
567890
1234567
89012345
678901234
5678901234

代码如下:

#include <iostream>
using namespace std;

int main() {
    int line_number, now_number;
    int i, row;

    cout << "请输入行数: ";
    cin >> line_number;

    now_number = 0;

    for (row = 1; row < line_number + 1; row++) {   // L1
        for (i = 0; i < row; i++) {                 // L2
            cout << now_number;
            now_number += 1;
            if (now_number == 10) now_number = 0;   // L3
        }
        cout << endl;
    }

    return 0;
}
A.
代码 now_number = 0 移动到 L1 和 L2 标记的两行代码之间,效果维持不变
B.
代码 now_number += 1 修改为 now_number = 1 + now_number 效果维持不变
C.
将代码 now_number == 10 调整为 now_number > 9 效果维持不变
D.
将最后一行的 cout << endl 修改为 cout << "\n",效果维持不变

正确答案A

解析详情

【答案】A

【考点】变量作用域;循环中的状态延续

【解析】 now_number 在外层循环开始前只初始化一次,所以数字会在各行之间连续接着输出。若把 now_number = 0 挪到 L1 和 L2 之间,它会在每一行开始时重置为 0,每行都会从 0 开始,输出明显改变,因此 A 错。B 只是交换加法写法,C 把 ==10 改成 >9 等价,D 中 endl 与 "\n" 都能换行。

【易错点】这题关键不在语法,而在变量是否跨行保留上一次的状态。

判断题(每题 2 分)

1 题(判断题

人们现在参加很多闭卷考试时通常都不允许带智能手机、平板电脑等,此外很多种智能手表同样因为具有嵌入操作系统及通信等功能,所以也不允许随身携带。()

正确答案正确

解析详情

【答案】正确

【考点】智能终端;嵌入式系统

【解析】 智能手表不仅能计时,还可能运行嵌入式操作系统,并具备通信、存储、联网等能力,已经属于可进行信息处理和传输的智能终端。闭卷考试禁止携带这类设备是合理的,因此题干说法正确。

【易错点】不要把智能手表只当作普通手表,它本质上也是一种计算设备。

2 题(判断题

在C++代码中,假设N为正整数,则 N / 10 舍弃个位数。如果 N 小于10,则其值为0,大于10则是舍弃个位数的数。()

正确答案正确

解析详情

【答案】正确

【考点】整数除法

【解析】 当 N 是正整数时,N / 10 做的是整除,会直接舍去个位。例如 57 / 10 = 5,8 / 10 = 0。因此题干关于“小于 10 得 0,大于 10 时去掉个位”的描述是正确的。

【易错点】这里是整型除法,不会保留小数部分。

3 题(判断题

下列C++代码执行后,其输出为 10 20 ,即 a == b 和 b == a 对 a 和 b 的值没有任何影响。()

int a = 10, b = 20;
a == b;
b == a;
cout << (a, b);

正确答案错误

解析详情

【答案】错误

【考点】比较运算;逗号运算符

【解析】 a == b 和 b == a 的确都只是比较,不会改动变量值;但最后输出的是 cout << (a, b);,逗号表达式的值等于最后一个操作数 b,所以只会输出 20,不是题干说的 10 20。因此整句话是错误的。

【易错点】判断题要看整句,前半句对不代表后半句也对。

4 题(判断题

a 和 b 分别是 C++ 的整型变量,如果表达式max(a,b)==min(a,b)\max(a, b) == \min(a, b)的值为真,则说明 a 和 b 相等。()

正确答案正确

解析详情

【答案】正确

【考点】最大值与最小值;相等判断

【解析】 若 max(a, b) == min(a, b),说明较大的那个值和较小的那个值相同,只可能是 a 与 b 相等。只要两个数不相等,最大值一定大于最小值,表达式就不可能为真。

【易错点】不要把 max、min 当成“可能接近”即可,它们相等只能发生在两数完全相等时。

5 题(判断题

下面C++代码编译时将报错,因为字符变量 a 被赋值了浮点值。()

char a = '1';
a = 45.6;
cout << a;

正确答案错误

解析详情

【答案】错误

【考点】类型转换;字符类型

【解析】 char 变量可以接收数值赋值,编译器会把 45.6 转成整数再存入字符类型,不会因为“给字符赋浮点值”就直接编译报错。运行时输出的是对应码值的字符,而不是题干所说的编译错误,所以此说法错误。

【易错点】C++ 中很多基本类型之间允许隐式转换,不一定一写错类型就编译失败。

6 题(判断题

下面C++代码执行时如输入59.99,将输出及格两个汉字。()int score;

cout << "请输入学生成绩:";
cin >> score;
if (score < 60)
    cout << "不及格";
else
    cout << "及格";
}

正确答案错误

解析详情

【答案】错误

【考点】输入到整型变量;条件判断

【解析】 score 是 int,输入 59.99 时按整型读取会先读入 59,小数点后的内容不会成为 score 的值。于是条件 score < 60 成立,程序输出的是“不及格”,不是“及格”。

【易错点】变量是 int 时,输入带小数不会自动四舍五入成 60。

7 题(判断题

在下面的C++代码中,因为 continue 将被执行,因此不会有输出。()int i;

for (i = 1; i < 10; i++)
    if (i % 2 == 0)
        continue;
if (i == 10)
    cout << "END";

正确答案错误

解析详情

【答案】错误

【考点】`continue`;循环结束后的判断

【解析】 continue 只是在偶数轮跳过本次循环体剩余部分,并不终止整个 for 循环。循环正常执行到 i=10 才结束,随后外面的 if (i == 10) 条件成立,会输出 END,所以“不会有输出”是错误的。

【易错点】continue 跳过的是当前轮,不是整个循环。

8 题(判断题

下面的C++代码执行后将输出15。()

int Sum = 0;
for (int i = 0; i < 5; i++)
    Sum += i;
cout << Sum;

正确答案错误

解析详情

【答案】错误

【考点】累加循环

【解析】 循环中 i 依次取 0、1、2、3、4,因此 Sum = 0 + 1 + 2 + 3 + 4 = 10。题干说输出 15,和实际结果不符,所以判断为错误。

【易错点】i < 5 只取到 4,不会把 5 加进去。

9 题(判断题

将下面C++代码中的(int i = 5; i > 1; i--)调整为(int i = 1; i < 5; i++) 输出结果相同,因为5到1与1到5的求和相同。()int tnt; tnt = 0;

for (int i = 5; i > 1; i--)
    tnt += i;
cout << tnt;
cout << endl;

正确答案错误

解析详情

【答案】错误

【考点】循环边界;求和范围

【解析】 原循环累加的是 5 + 4 + 3 + 2 = 14,因为条件是 i > 1,不会加到 1。改成 for (int i = 1; i < 5; i++) 后累加的是 1 + 2 + 3 + 4 = 10。虽然两个式子都像是在“1 到 5 之间求和”,但边界不同,结果并不相同。

【易错点】比较两段循环时,要把起点、终点和是否取到边界都写清楚。

10 题(判断题

为实现如下效果,即N行N列字符。当输入是奇数时,中间列为*,其他是-;当输入是偶数时,则中间两列是*,其他是-。字符阵阵列后的代码能实现其效果。()

/*
5
--*--
--*--
--*--
--*--
*/

int N;

cin >> N;
int i,j;
for (i = 0; i < N; i++) {
    for (j = 0; j < N; j++)
        if ((j == N / 2) || (j == (N-1) / 2))
            cout << "*";
        else
            cout << "-";
        cout << endl;
    }
}

正确答案正确

解析详情

【答案】正确

【考点】二维图形输出;奇偶列定位

【解析】 当 N 为奇数时,N / 2 与 (N - 1) / 2 相同,只会有一列满足条件,所以中间列输出 *。当 N 为偶数时,这两个值分别对应中间偏右和中间偏左两列,因此会输出两列 *。外层循环控制行数,内层循环控制每行的列数,题目描述与代码效果一致。

【易错点】整数除法会向下取整,偶数和奇数时这两个中间位置的结果不同。