GESP 客观题评测系统

2026-06-Level-2

2026-06-Level-2

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

单选题

1 题(单选题2 分)

学校组织到未来农场参观,小明听讲解员介绍,在智能温室中,湿度传感器可以连续检测土壤的湿度变化,并将检测到的湿度数据实时发送给中央控制器。中央控制器根据这些数据判断是否开启灌溉系统。请问,这里的湿度传感器所发挥的作用,类似于计算机系统中的哪一类组件?()

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

正确答案C

解析详情

【答案】C

【考点】输入设备

【解析】 湿度传感器负责采集土壤湿度,并把数据送给中央控制器,相当于向计算机输入外部信息,因此属于输入设备。

【易错点】 传感器只负责采集数据,不负责根据数据作出控制决策。

2 题(单选题2 分)

小明去农场参观回来后就在自己的电脑上安装了一个 3D 农场仿真模拟系统,因为他今年买的二手电脑有点老旧,系统运行时经常弹出“系统内存不足”的警告,导致系统卡顿严重。他计划通过增加物理内存来解决问题。请问他应该购买以下哪种硬件组件?()

A.
机械硬盘
B.
内存条
C.
图形显卡
D.
移动硬盘

正确答案B

解析详情

【答案】B

【考点】内存与外存

【解析】 “增加物理内存”指扩充计算机运行程序时直接使用的主存,应购买内存条。机械硬盘和移动硬盘属于外存,不能直接增加物理内存容量。

【易错点】 不要把硬盘容量与运行程序所需的内存容量混为一谈。

3 题(单选题2 分)

有关如下 C++ 代码的说法,正确的是()。

float a = 3 + 3.5;
cout << a;
A.
代码执行将报错。如果将 a = 3 + 3.5 改为 a = float(3) + 3.5 将能正常执行。
B.
代码执行将报错。如果将 a = 3 + 3.5 改为 a = 3.0 + 3.5 将能正常执行。
C.
代码能正常执行,将输出 6。
D.
代码能正常执行,将输出 6.5。

正确答案D

解析详情

【答案】D

【考点】混合类型运算

【解析】 表达式 `3 + 3.5` 中整数 3 会转换为浮点数后参与运算,结果为 6.5;该值可以赋给 `float a`,所以代码正常输出 6.5。

【易错点】 整数与浮点数相加不会报错,整数会先进行类型转换。

4 题(单选题2 分)

下面选择项中,与 C++ 表达式 not (x > 5 or y <= 10) 等价的是()。

A.
x <= 5 or y > 10
B.
x > 5 and y <= 10
C.
x <= 5 and y > 10
D.
not x > 5 and not y <= 10

正确答案C

解析详情

【答案】C

【考点】德摩根定律

【解析】 对 `(x > 5 or y <= 10)` 整体取反时,`or` 变为 `and`,两个条件也分别取反,得到 `x <= 5 and y > 10`。

【易错点】 整体取反时既要反转每个关系运算,也要把 `or` 改成 `and`。

5 题(单选题2 分)

小明在某开发环境中执行 C++ 代码 `cout << (2.5 + 2.25) << ' ' << (2.2 + 2.1)` 时输出 4.754.30000000000001,其原因最可能是()。

A.
C++ 的 + 运算符在处理浮点数时有时正确,有时错误
B.
某些浮点数难以精确表示,导致微小误差
C.
+ 运算符不能用于浮点数,只能用于整数
D.
因为 `cout` 函数难以输出太长的数值

正确答案B

解析详情

【答案】B

【考点】浮点数精度

【解析】 二进制浮点数不能精确表示某些十进制小数,例如 2.2 和 2.1,运算后会留下微小的舍入误差,因此可能显示为 4.30000000000001。

【易错点】 这种误差来自浮点数的有限精度,不是 `+` 运算符或 `cout` 失效。

6 题(单选题2 分)

执行如下 C++ 程序后,当输入 4 时,输出的最后一行是()。

int n;
cin >> n;
for (int i = n; i > 0; i--) {
    for (int j = 0; j < i; j++)
        cout << j + 1 << ' ';
    cout << endl;
}
A.
0
B.
1
C.
1 2
D.
1 2 3 4

正确答案B

解析详情

【答案】B

【考点】嵌套循环

【解析】 外层变量 `i` 从 4 递减到 1,每行输出 `1` 到 `i`。最后一次循环时 `i=1`,内层只执行 `j=0`,所以最后一行是 `1`。

【易错点】 题目问的是最后一行,不是第一行或完整输出。

7 题(单选题2 分)

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

int tnt = 0;
for (int i = 1; i < 5; i += 3) {
    for (int j = 0; j < i; j++)
        tnt += 1;
    cout << tnt << "#";
}
cout << tnt;
A.
1#5#5
B.
1#5#5#
C.
1#5#12#12
D.
0

正确答案A

解析详情

【答案】A

【考点】嵌套循环与累加

【解析】 外层循环的 `i` 依次为 1、4,内层分别让 `tnt` 增加 1 和 4,因此两次循环中输出 `1#`、`5#`。循环结束后再输出 5,结果为 `1#5#5`。

【易错点】 最后一次 `cout << tnt` 后没有输出 `#`。

8 题(单选题2 分)

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

int i;
for (i = -2; i < 2; i++)
    if (not i % 3 == 0)
        cout << i << "#";
cout << i;
A.
-2#-1#1#2
B.
-2#-1#1#2#3
C.
1#2#3
D.
0#1#2#3

正确答案A

解析详情

【答案】A

【考点】循环与逻辑非

【解析】 循环中 `i` 依次为 -2、-1、0、1;条件等价于 `i % 3 != 0`,所以输出 `-2#-1#1#`。循环结束时 `i=2`,末尾再输出 2,得到 `-2#-1#1#2`。

【易错点】 循环结束后 `i` 已自增为 2,且末尾输出不带 `#`。

9 题(单选题2 分)

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

int cnt = 0, i, j;
for (i = 0; i < 3; i++) {
    j = i;
    while (j) {
        cnt += 1;
        j -= 1;
    }
}
cout << i << ' ' << j << ' ' << cnt;
A.
3 0 3
B.
2 0 4
C.
2 0 5
D.
3 0 5

正确答案A

解析详情

【答案】A

【考点】for 与 while 循环

【解析】 `i=0、1、2` 时,while 循环分别执行 0、1、2 次,故 `cnt=3`;每轮 while 都把 `j` 减到 0。for 结束后 `i=3`,最终输出 `3 0 3`。

【易错点】 for 循环正常结束时,`i` 已完成最后一次自增。

10 题(单选题2 分)

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

int count = 0, i, j;
for (i = 1; i < 4; i++)
    for (j = 0; j < i; j++) {
        if (j % 3 != 0)
            continue;
        count += 1;
        break;
    }
    cout << i << ' ' << j << ' ' << count;
A.
4 0 4
B.
3 0 0
C.
3 2 0
D.
4 0 3

正确答案D

解析详情

【答案】D

【考点】break 与 continue

【解析】 每次外层循环开始时 `j=0`,条件 `j % 3 != 0` 为假,于是 `count` 加 1 后立即 `break`。外层共执行 3 次,结束时 `i=4、j=0、count=3`,输出 `4 0 3`。

【易错点】 `break` 只结束内层循环,不会结束外层 for 循环。

11 题(单选题2 分)

如下 C++ 代码执行后输出是 1 2 3 4 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7。横线处应该填入的运算符是()。

int num = 1;
for (int i = 0; i < 35; i++) {
    cout << num << " ";
    if (num _______ 10)
        num _______ 2;
    else
        num _______ 1;
}
A.
> /= +=
B.
>= %= +=
C.
> /= =+
D.
>= %= =+

正确答案A

解析详情

【答案】A

【考点】条件分支与复合赋值

【解析】 当 `num` 不大于 10 时用 `num += 1` 递增,依次输出 1 到 11;输出 11 后满足 `num > 10`,执行 `num /= 2` 得到 5,再重复这一变化规律。

【易错点】 `=+` 是赋值为正数,不等同于累加运算符 `+=`。

12 题(单选题2 分)

如下数字图形在通过执行后续的 C++ 代码时,输入 10 来输出。横线处应填入的代码是()。

1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 0 1
1 0 1 0 0 0 0 0 0 1
1 0 0 1 0 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 1 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 0 1 1
1 1 1 1 1 1 1 1 1 1
int N;
cin >> N;
for (int i = 1; i < N + 1; i++) {
    for (int j = 1; j < N + 1; j++)
        if (________)
            cout << "1 ";
        else
            cout << "0 ";
    cout << endl;
}
A.
i == j and i == 1 and j == 1 and i == N and j == N
B.
i == j or i == 1 or j == 1 or i == N or j == N
C.
i == j or i == 0 or j == 0 or i == (N + 1) or j == (N + 1)
D.
i == j and i == 1 and j == 1 and i == (N + 1) and j == (N + 1)

正确答案B

解析详情

【答案】B

【考点】二维循环与坐标条件

【解析】 图形在主对角线 `i==j` 以及上、下、左、右边界处输出 1。循环下标范围是 1 到 N,因此边界条件分别是 `i==1`、`i==N`、`j==1`、`j==N`,这些条件应使用 `or` 连接。

【易错点】 循环从 1 开始,边界不是 0 和 N+1。

13 题(单选题2 分)

英文 corner case 通常翻译为极端案例或边角案例,通常指正常范围以外的问题或者情形。在如下 C++ 代码中,变量都是整型,则 corner case 最应该是()。

int tnt = 0, cnt = 0;
while (1) {
    int score;
    cin >> score;
    if (score == -1)
        break;
    tnt += score;
    cnt += 1;
}
cout << tnt / cnt;
A.
tnt = 0, cnt = 0 是 corner case,应分为两行
B.
while(1) 是 corner case,因为 while(1) 将会导致死循环
C.
cin >> score 是 corner case,因为输入数据前应该提示整型数据
D.
cout << tnt / cnt 是 corner case,因为如果直接输入 -1,将导致执行错误,虽然这种情况较为罕见

正确答案D

解析详情

【答案】D

【考点】除零边界情况

【解析】 如果第一次输入就是 -1,循环立即结束,`cnt` 仍为 0。随后计算 `tnt / cnt` 会发生整数除零,因此空数据输入是必须处理的 corner case。

【易错点】 有结束标记不代表循环一定读入过有效成绩。

14 题(单选题2 分)

如下 C++ 代码执行后,输入 4 后,输出的数字图形是()。

int n;
cin >> n;
for (int i = n; i > 0; i--) {
    for (int j = 0; j < n - i; j++)
        cout << "0";
    for (int k = 0; k < i; k++)
        cout << k + 1 << "";
    cout << endl;
}
A.
1 1 2 3 4
2 1 2 3 0
3 1 2 0 0
4 1 0 0 0
B.
1 1 2 3 4
2 0 1 2 3
3 0 0 1 2
4 0 0 0 1
C.
1 2 3 4
2 3 4 0
3 4 0 0
4 0 0 0
D.
1 0 0 0 1
2 0 0 1 2
3 0 1 2 3
4 1 2 3 4

正确答案B

解析详情

【答案】B

【考点】嵌套循环输出图形

【解析】 当 `i` 从 4 递减到 1 时,每行先输出 `n-i` 个 0,再输出 1 到 `i`。四行依次为 `1234`、`0123`、`0012`、`0001`,对应 B。

【易错点】 前导 0 的数量逐行增加,而后面的数字个数逐行减少。

15 题(单选题2 分)

某学校举办“校园演讲比赛”,每位选手由 8 位评委打分(分数为 0~10 的整数),且每位评委必须打分。计分规则:去掉一个最高分,去掉一个最低分。如下程序通过键盘先输入选手编号,然后依次输入 8 个分数,并计算最终得分。下列说法正确的是()。

for (int i = 0; i < 10; i++) {
    int id, score;
    printf("输入选手编号: ");
    scanf("%d", &id);

    int max_score = 0, min_score = 100;
    int total_score = 0;

    for (int j = 1; j < 9; j++) {
        printf("输入选手第%d个成绩:", j);
        scanf("%d", &score);
        if (max_score < score)
            max_score = score;
        if (min_score > score)
            min_score = score;
        total_score += score;
    }

    total_score = total_score - max_score - min_score;
    printf("%d号选手的成绩:\n去掉一个最高分%d,\n去掉一个最低分%d,\n最后成绩是:%d",
           id, max_score, min_score, total_score);
}
A.
上述代码能完成题目要求
B.
max_score = 0, min_score = 100 应修改为 max_score = 0, min_score = 0
C.
max_score < score 和 min_score > score 必须相应修改为 <= 和 >=
D.
total_score = total_score - max_score - min_score 不能达到预期,可修改如下:
int total = total_score - max_score - min_score;
total_score = total;

正确答案A

解析详情

【答案】A

【考点】极值与累加统计

【解析】 内层循环恰好读入 8 个 0~10 的分数,同时累计总分并更新最高、最低分。最后减去一个 `max_score` 和一个 `min_score`,正好得到去掉各一个极值后的总分。

【易错点】 最高分或最低分有并列时,题意也只要求各去掉一个。

判断题

1 题(判断题2 分)

又到期末考试周,小明发现这次许多闭卷考试不仅禁止携带手机、平板电脑,还有最近比较时髦的各类AI眼镜(也有叫智能眼镜)也同样不允许带入考场。这些AI眼镜应该也是内置了操作系统并可能支持Wi-Fi或蓝牙连接。

正确答案正确

解析详情

【答案】正确

【考点】智能终端

【解析】 AI 眼镜通常具有处理器、操作系统和通信模块,可运行应用并通过 Wi-Fi 或蓝牙交换数据,属于可联网的智能终端。

【易错点】 不要因为设备外形是眼镜,就忽略其内部的计算与通信能力。

2 题(判断题2 分)

C++ 代码 cout << (not ('5' % 2 == 0) == ((not '5' % 2) == 0)) 执行后的输出是 1。

正确答案正确

解析详情

【答案】正确

【考点】字符运算与逻辑非

【解析】 字符 `'5'` 的编码值为 53,`53 % 2` 等于 1。左侧 `not (1==0)` 为真,右侧 `(not 1)==0` 也为真,两侧相等,所以输出 1。

【易错点】 `'5'` 是字符,其参与整数运算时使用字符编码值,不是整数 5。

3 题(判断题2 分)

执行 C++ 语句 cout << (int(3.5) * 2) 将输出 6。

正确答案正确

解析详情

【答案】正确

【考点】强制类型转换

【解析】 `int(3.5)` 会舍弃小数部分得到 3,随后计算 `3 * 2` 得到 6,因此输出 6。

【易错点】 浮点数转整数是截去小数部分,不是四舍五入。

4 题(判断题2 分)

下面 C++ 代码执行后将输出 1-4-7-。

for (int i = 1; i < 10; i += 3) {
    if (not i % 3)
        break;
    cout << i << "-";
}

正确答案正确

解析详情

【答案】正确

【考点】for 循环与取模

【解析】 `i` 依次取 1、4、7,它们除以 3 的余数都为 1,因此 `not i % 3` 始终为假,不会触发 `break`。程序依次输出 `1-4-7-`。

【易错点】 `not i % 3` 等价于 `!(i % 3)`,余数非 0 时结果为假。

5 题(判断题2 分)

执行如下 C++ 代码,将从小到大依次输出 abs(N) 个整数,并在最后输出 1。

int N;
cin >> N;
int start_num = 1, end_num = N + 1, i;
if (N < 0)
    start_num = N, end_num = 0;
for (i = start_num; i < end_num; i++)
    cout << i << " ";
cout << endl << ((i - 1) == abs(N)) << endl;

正确答案错误

解析详情

【答案】错误

【考点】循环边界与条件表达式

【解析】 当 `N<0` 时,循环输出 `N` 到 -1,共 `abs(N)` 个整数,结束后 `i=0`。此时 `(i-1)==abs(N)` 即 `-1==abs(N)`,结果为 0,而不是 1。

【易错点】 前半句对正负 N 都成立,不代表末尾比较式也对负数成立。

6 题(判断题2 分)

如下 C++ 代码执行后,输出值为 9。

int cnt = 0, i;
for (i = 0; i < 10; i++) {
    for (int j = 0; j < i; j++)
        cnt += 1;
    break;
}
cout << i;

正确答案错误

解析详情

【答案】错误

【考点】break 语句

【解析】 外层循环第一次执行时 `i=0`,内层循环不执行,随后立即遇到 `break` 退出外层循环。此时 `i` 仍为 0,所以程序输出 0,不是 9。

【易错点】 `break` 位于外层循环体中,会在第一次迭代就结束该循环。

7 题(判断题2 分)

如下 C++ 代码执行时如输入 10 ,输出将是 100 。

int cnt = 0, N;
cout << "请输入正整数:";
cin >> N;
for (int i = 0; i < N; i++)
    for (int j = -i; j < i; j++)
        cnt += 1;
cout << cnt;

正确答案错误

解析详情

【答案】错误

【考点】嵌套循环计数

【解析】 固定 `i` 时,`j` 从 `-i` 到 `i-1`,内层执行 `2i` 次。输入 10 时总次数为 `2×(0+1+…+9)=2×45=90`,因此输出 90。

【易错点】 内层次数是 `2i`,且外层最大只取到 `i=9`。

8 题(判断题2 分)

如下 C++ 代码执行其输出是 3。

int count = 0;
int i = 0;
while (i < 3) {
    int j = 0;
    while (j < 3) {
        if (i + j >= 3)
            count += 1;
        j += 1;
    }
    i += 1;
}
cout << count;

正确答案正确

解析详情

【答案】正确

【考点】嵌套循环计数

【解析】 `i、j` 都取 0、1、2,满足 `i+j>=3` 的组合是 `(1,2)`、`(2,1)`、`(2,2)`,共 3 组,所以输出 3。

【易错点】 边界条件包含等于 3 的组合。

9 题(判断题2 分)

如下 C++ 代码执行时如果输入正整数,其输出将是输入的正整数。

int N;
cin >> N;
int i = 0, Nbase = 1;
int rst = 0;
while (N != 0) {
    rst = rst + N % 10 * Nbase;
    N /= 10, Nbase *= 10;
    i += 1;
}
cout << rst;

正确答案正确

解析详情

【答案】正确

【考点】十进制数位分解与重组

【解析】 循环从低位到高位依次取出 `N % 10`,同时 `Nbase` 依次取 1、10、100……,所以每一位都被加回原来的十进制位权。`N /= 10` 删除已处理的最低位,循环结束时 `rst` 与输入的正整数相同。

【易错点】 `Nbase *= 10` 用来提高位权;若漏掉这一步,程序得到的会是各位数字之和。

10 题(判断题2 分)

如下 C++ 代码执行时如输入 5,将输出代码后的字符图形。

int n;
cin >> n;
for (int i = 1; i < n + 1; i++) {
    for (int j = 1; j < n - i + 1; j++)
        cout << 0;
    for (int k = 1; k < 2 * i; k++) {
        if (k <= i)
            cout << k;
        else
            cout << 2 * i - k;
    }
    for (int j = 1; j < n - i + 1; j++)
        cout << 0;
    cout << endl;
}

000010000 000121000 001232100 012343210 123454321

正确答案正确

解析详情

【答案】正确

【考点】嵌套循环输出图形

【解析】 第 `i` 行两侧各输出 `5-i` 个 0,中间先输出 1 到 `i`,再输出 `i-1` 到 1。于是五行依次形成题示的 `000010000` 到 `123454321`。

【易错点】 中间部分共有 `2i-1` 个数字,峰值 `i` 只输出一次。