GESP 客观题评测系统

2025-12-Level-2

2025-12-Level-2

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

单选题(每题 2 分)

1 题(单选题

近日,空中客车公司表示,约6000架空客A320系列飞机需要紧急更换一种易受太阳辐射影响的飞行控制软件。空客表示,在对一起飞行事故分析后的结果显示,强烈的太阳辐射可能会损坏飞行控制系统所需的关键数据,导致判断失误,进而引发飞行异常。那这里的飞行控制系统执行判断的部件最可能是下面的()。

A.
辐射传感器
B.
处理器
C.
内存单元
D.
输出设备

正确答案B

解析详情

【答案】B

【考点】计算机硬件组成;处理器功能

【解析】 飞行控制系统中的“判断”本质上是对输入数据进行运算并作出控制决策,这一工作由处理器完成。传感器负责采集外界信息,内存单元负责存放数据,输出设备负责把结果显示或执行出去,所以只有 B 符合题意。

【易错点】 容易把“接收数据”的传感器误当成“做判断”的核心部件。

2 题(单选题

小明最近为了备考 GESP,开始看 B 站上关于网络知识的视频。其中提到计算机网络系统有不同的划分标准,那他平时上学所在的教学楼内的网络是一个()。

A.
PAN
B.
LAN
C.
MAN
D.
WAN

正确答案B

解析详情

【答案】B

【考点】计算机网络分类;局域网

【解析】 教学楼内部覆盖范围小,连接的是同一建筑内的设备,属于局域网 LAN。PAN 是个人范围网络,MAN 是城域网,WAN 是广域网,范围都与题目描述不符,所以答案选 B。

【易错点】 容易把“学校里用的网络”直接联想到更大的城域网或广域网。

3 题(单选题

下面有关C++变量的说法,正确的是()。

A.
不可以用 for 作为变量名,因为 for 是C++的关键字(保留字)。
B.
_tnt 不可以是变量名,因为变量名的第一个字符必须是英文字母。
C.
_tnt_ 不可以是变量名,因为最后一个字符容易与减号混淆。
D.
可以用 printf 作为变量名,因为 printf 是关键字,但这不是好习惯,因为 printf 有约定的功能与含义。

正确答案A

解析详情

【答案】A

【考点】标识符命名规则;关键字

【解析】 `for` 是 C++ 关键字,不能拿来当变量名,所以 A 正确。变量名首字符既可以是字母,也可以是下划线,因此 `_tnt` 合法;末尾下划线不会因为“像减号”而非法;`printf` 不是关键字,D 错在把它说成了关键字。

【易错点】 容易把“关键字不能作变量名”和“库函数名最好别重名”混成一条规则。

4 题(单选题

一个小数是0.123123123……无限循环,其小数点后1位是1,后2位是2,依此类推,求第N位的值。横线处应填入的代码是( )。

int N;
cin >> N;
remainder = ___;

if (remainder == 0)
    cout << 1;
else if (remainder == 1)
    cout << 2;
else
    cout << 3;
A.
N % 3
B.
(N - 1) % 3
C.
N / 3
D.
(N - 1) / 3

正确答案B

解析详情

【答案】B

【考点】循环小数规律;取模运算

【解析】 小数部分按 `1,2,3` 三个数字循环出现,第 1 位对应 1,第 2 位对应 2,第 3 位对应 3。为了把第 N 位映射到下标 0、1、2,应先把 N 变成从 0 开始计数,所以用 `(N - 1) % 3`。这样余数为 0、1、2 时正好分别输出 1、2、3。

【易错点】 容易直接写成 `N % 3`,这样第 1 位会被错判到余数 1。

5 题(单选题

某同学执行C++代码时 `printf("%g\n", (3 + 3.1415926535));` 输出 6.14159,其原因最可能是()。

A.
C++中整数和浮点数相加时,整数会被转换为浮点数,而某些十进制小数无法精确表示为二进制小数,从而产生某些舍入误差。
B.
C++的 `printf` 函数在输出浮点数时根据格式有默认小数点位数,因此输出了较少的位数。
C.
3.1415926535 是一个无限循环小数,在计算机中无法精确表示。
D.
由于计算机CPU的运算错误导致。

正确答案B

解析详情

【答案】B

【考点】格式化输出;`printf` 的 `%g`

【解析】 这里看到的 `6.14159` 主要是输出格式造成的,而不是 CPU 算错。`%g` 会按照默认精度输出有效数字,必要时自动省去多余位数,所以结果没有把更多小数位全部显示出来。A 说的是浮点表示误差,但题目现象的直接原因是输出格式;C 把有限小数说成无限循环小数,明显错误。

【易错点】 容易把“显示得少”误判成“计算过程出错”。

6 题(单选题

某单位工号的编码规则:编码总长5位,均为数字,前4位依次整除以3其值累加之和除以10的余数为第5位数字。如某工号为76587,前4位分别整除以3后,商分别为2、2、1、2,其累加之和为7,除以10的余数为7,故第5位为7。下面代码依次输入前4位后,两个横线处分别应填的是( )。

int rst = 0, N;
for (int i = 0; i < 4; i++) {
    cin >> N;
    rst += _____; // L1
}
cout << _____; // L2
A.
1 | N % 3 2 | rst / 10
B.
1 | N % 3 2 | rst % 10
C.
1 | N / 3 2 | rst / 10
D.
1 | N / 3 2 | rst % 10

正确答案D

解析详情

【答案】D

【考点】整数除法;取模运算

【解析】 题目要求把前 4 位“分别整除以 3 后的商”累加,所以 L1 应写 `N / 3`,不能写成 `N % 3`。累加完成后,第 5 位要取“除以 10 的余数”,所以 L2 应写 `rst % 10`。两空组合起来正好对应 D。

【易错点】 容易把“整除以 3 后的商”和“除以 3 的余数”混淆。

7 题(单选题

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

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

正确答案A

解析详情

【答案】A

【考点】`for` 循环;条件判断;取模

【解析】 循环中 `i` 依次取 `-2,-1,0,1`。只有当 `i % 2` 的结果非 0 时才会执行 `printf`,因此 `-2` 和 `0` 不输出,`-1` 和 `1` 会输出,结果是 `-1#1#`,对应 A。

【易错点】 容易把 `if (i % 2)` 误看成“偶数时成立”,实际上非 0 才成立。

8 题(单选题

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

int cnt = 0, N;
for (int i = 1; i < 10; i += 2)
    for (int j = 0; j < i; j++)
        cnt += 1;
cout << cnt;
A.
100
B.
55
C.
45
D.
25

正确答案D

解析详情

【答案】D

【考点】嵌套循环;累加计数

【解析】 外层循环的 `i` 依次为 `1,3,5,7,9`。每次内层循环执行 `i` 次,所以 `cnt` 的总增加次数是 `1 + 3 + 5 + 7 + 9 = 25`。程序最后输出 25,因此选 D。

【易错点】 容易只看外层循环执行 5 次,就忽略了内层循环次数随 `i` 变化。

9 题(单选题

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

int i,j;
for (i = 1; i < 12; i++) {
    if (i % 2 == 0)
        continue;
    for (j = 0; j < i; j++)
        if (i * j % 2 == 0)
            break;
    if (j >= i)
        cout << i * j << " ";
}
if (i >= 12)
    cout << (i * j);
A.
0 0
B.
11
C.
0
D.
0 11

正确答案C

解析详情

【答案】C

【考点】`continue` 与 `break`;循环执行过程

【解析】 外层只处理奇数 `i`。对任意奇数 `i`,内层从 `j = 0` 开始检查,而 `i * 0 % 2 == 0` 立即成立,所以立刻 `break`,此时 `j = 0`,`j >= i` 不成立,循环体里不会输出任何内容。外层结束后 `i` 已变成 12,`j` 仍为 0,因此最后输出 `12 * 0 = 0`,对应 C。

【易错点】 容易忽略 `j` 从 0 开始,导致一开始就触发 `break`。

10 题(单选题

与下面 C++ 输出效果不一致的代码是()。

int i;
for (i = 0; i < 10; i++)
    cout << i;
A.
int i = 0;
while (i < 10){
    cout << i;
    i += 1;
}
B.
int i = 0;
while (i < 10){
    i += 1;
    cout << i;
}
C.
int i = 0;
while (true){
    cout << i;
    i += 1;
    if (i >= 10)
        break;
}
D.
int i = 0;
while (true){
    if (i >= 10)
        break;
    cout << i;
    i += 1;
}

正确答案B

解析详情

【答案】B

【考点】`for` 与 `while` 等价改写;循环顺序

【解析】 原代码输出的是 `0123456789`。A 先输出再加 1,结果一致;C 和 D 都是在每次输出后把 `i` 增加到下一个值,也会得到同样的序列。只有 B 先执行 `i += 1`,再输出 `i`,所以输出会从 1 开始,到 10 结束,与原效果不一致。

【易错点】 容易只看循环条件相同,却忽略“先自增还是先输出”的顺序差异。

11 题(单选题

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

int num = 0;
while (num <= 5){
    num += 1;
    if (num % 3)
        continue;
    printf("%d#",num);
}
if(num > 5)
    printf("%d",num);
A.
3#6#
B.
3#6#6
C.
1#2#3#4#5#6#
D.
1#2#3#4#5#6#6

正确答案B

解析详情

【答案】B

【考点】`while` 循环;`continue` 语句

【解析】 `num` 从 0 开始,在循环里先自增,所以依次变成 1 到 6。`num % 3` 不为 0 时直接 `continue`,只有 `num = 3` 和 `num = 6` 时会执行 `printf("%d#", num)`,输出 `3#6#`。循环结束后 `num` 已经是 6,满足 `num > 5`,还会再输出一次 `6`,因此结果是 `3#6#6`。

【易错点】 容易漏掉循环结束后还有一个单独的 `if` 会再输出一次 `num`。

12 题(单选题

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

int cnt = 0;
for (int i = 0; i < 5; i++)
    for (int j = i; j < 4; j++)
        cnt += 1;
cout << cnt;
A.
9
B.
10
C.
14
D.
20

正确答案B

解析详情

【答案】B

【考点】嵌套循环;求和计数

【解析】 当 `i = 0,1,2,3,4` 时,内层循环 `j = i` 到 `3`,执行次数分别是 `4,3,2,1,0`。所以 `cnt` 最终为 `4 + 3 + 2 + 1 + 0 = 10`,程序输出 10,对应 B。

【易错点】 容易把内层上界 `j < 4` 看成固定执行 4 次。

13 题(单选题

漂亮数的定义是:如果N能被M整除,或者某位是M,或者N的每位数之和能被M整除,则说N是M的漂亮数。如果三个条件都满足,则是完整漂亮数。123是3的完整漂亮数,因为123能被3整除,也含有3,其每位数之和为6也能被3整除。下面的代码用于判断N是否为M的完整漂亮数并输出。相关说法正确的是( )。

int N, M, Flag, Sum, num;
cout << "请输入N,不等于0的正整数:";
cin >> N;
cout << "请输入M:M必须大于1小于9:";
cin >> M;
Sum = 0; // 记录各位数之和
Flag = 0; // 假设记录N不含有M

while (N != 0){
    num = N % 10;
    Sum += num;
    if (num == M)
        Flag = 1;
    N /= 10;
}
if ((N % M == 0) && (Flag == 1) && (Sum % M == 0)) // L1
    printf("%d 是 %d 的完整漂亮数", N, M);
else
    printf("%d 不是 %d 的完整漂亮数", N, M);
A.
代码能完成题目设定目标。
B.
在 while 循环中 N 最终将变成 0,因此 L1 行代码中 N % M 将总是满足条件,可以在 while 前增加一行代码 int old_num = N;并将 L1 开始这 4 行代码中的 N 都改为 old_num 就可以做出正确的判定。
C.
while 循环中 if 判断语句可以增加 else 子句,其内容为 Flag = 0。
D.
如果先后输入 0 和 3,则肯定会输出 0 是 3 的完整漂亮数。

正确答案B

解析详情

【答案】B

【考点】循环中变量更新;保存原始数据

【解析】 程序在 `while` 循环里不断执行 `N /= 10`,循环结束后 `N` 一定变成 0。这样 L1 里的 `N % M == 0` 就失去了“原数是否能被 M 整除”的意义,因此要先把原始的 `N` 保存下来,再在最终判断和输出时使用保存的值。B 正是指出了这个关键问题;C 如果把 `Flag` 重新置 0,会把前面已经找到过数字 M 的事实抹掉。

【易错点】 容易在循环里直接改写原变量,最后却还想拿它表示原始输入值。

14 题(单选题

阅读下面的 C++ 代码。执行后如输入 5,其输出的字符图形是()。

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

正确答案B

解析详情

【答案】B

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

【解析】 外层循环执行 5 次,`i` 从 0 到 4。每一行第二个循环都会输出 `2 * i + 1` 个 `*`,所以 5 行分别输出 `1,3,5,7,9` 个星号。对应的图形是逐行按奇数递增的三角形,因此选 B。

【易错点】 容易忽略 `2 * i + 1` 这一项,误以为每行只比上一行多 1 个星号。

15 题(单选题

某学校举办“十佳歌手大奖赛”,经过选拔最终参赛选手有25人,评委10人,最终计分规则去掉一个最高分去掉一个最低分作为该参赛选手的最终得分,并输出该得分。如果单个评委可给满分为10分,则相关说法正确的是()。

float total_score, max_score, min_score, now_score;
for (int i = 0; i < 25; i++) {
    max_score = 0; // 记录最高分
    min_score = 10; // 记录最低分
    total_score = 0; // 记录总分
    for (int j = 0; j < 10; j++) {
        cin >> now_score; // 录入评委打分
        max_score = max(max_score, now_score); // L1
        min_score = min(min_score, now_score); // L2
        total_score += now_score;
    }
    cout << (total_score - max_score - min_score);
}
A.
程序总体逻辑错误。因为要去掉最高分和最低分,需要排序,而程序没有相关代码。
B.
内层循环和外层循环之间的三行代码也就是 max_score = 0 开始的三行代码应该移动到外层循环外。
C.
L1和L2标记的两行代码可以分别改为简单的 if 语句或?:语句。
D.
total_score += now_score 不可以更改为 total_score = total_score + now_score。

正确答案C

解析详情

【答案】C

【考点】最大值最小值更新;复合赋值

【解析】 程序不需要排序,只要在读入 10 个分数的过程中同步维护最大值、最小值和总分,最后再减去一个最高分和一个最低分即可,所以 A 错。每位选手都要重新统计自己的最高分、最低分和总分,因此这三行初始化必须放在外层循环内部,B 错。`max` 和 `min` 的功能完全可以用 `if` 语句或三目运算符改写,所以 C 正确;`a += b` 与 `a = a + b` 等价,D 错。

【易错点】 容易以为“去掉最高分和最低分”一定先排序,其实单次扫描就能完成。

判断题(每题 2 分)

1 题(判断题

鸿蒙是华为公司开发的一款操作系统,那么它能够将正确的源程序翻译成目标程序,并运行。()

正确答案错误

解析详情

【答案】错误

【考点】操作系统;编译程序

【解析】 鸿蒙是操作系统,负责管理硬件资源并为程序提供运行环境;把源程序翻译成目标程序的是编译器等翻译程序,不是操作系统本身。所以题干把两个概念混在了一起,结论错误。

【易错点】 容易把“程序运行在操作系统上”误当成“操作系统负责把源代码翻译成可执行程序”。

2 题(判断题

C++表达式 5 < 10 && 20 对应的逻辑值为 true。()

正确答案正确

解析详情

【答案】正确

【考点】逻辑运算;布尔值转换

【解析】 先算 `5 < 10`,结果为 `true`。在逻辑与运算里,非 0 整数都会被当成 `true`,所以 `20` 也是真。于是表达式等价于 `true && true`,最终结果就是 `true`,题干说法正确。

【易错点】 容易误以为 `&&` 两边必须都写成显式的布尔表达式。

3 题(判断题

C++表达式 10 / 0.333333 == 10 / (1 / 3) 的值为 true。()

正确答案错误

解析详情

【答案】错误

【考点】整数除法;表达式求值

【解析】 左边 `10 / 0.333333` 是浮点除法,结果约为 30。右边先算括号里的 `1 / 3`,这里是整数除法,结果为 0,接下来就变成 `10 / 0`,该表达式没有合法的真值结果,更不可能稳妥地等于左边。所以题干说它的值为 `true` 是错误的。

【易错点】 容易忽略 `1 / 3` 在整数环境下先算出 0。

4 题(判断题

下面C++代码中N是整数,执行时无论输入负整数、0或正整数,其输出都将是 0。()

cin >> N;
while (N)
    N /= 10;
cout << N;

正确答案正确

解析详情

【答案】正确

【考点】整数除法;`while` 循环

【解析】 如果输入是 0,`while (N)` 一开始就不进入循环,直接输出 0。若输入是正整数或负整数,每次执行 `N /= 10` 都会把绝对值缩小,C++ 的整数除法会向 0 截断,因此经过有限次循环后 `N` 一定变成 0,最后输出仍然是 0,所以题干正确。

【易错点】 容易只验证正整数,忽略负整数整除 10 也会逐步逼近 0。

5 题(判断题

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

int a, b;
a = 4;
b = a == 5;
cout << a << ' ' << b;

正确答案正确

解析详情

【答案】正确

【考点】关系表达式;布尔值的整数表示

【解析】 先执行 `a = 4`。表达式 `a == 5` 的结果是 `false`,赋给整型变量 `b` 后会变成 0,所以最后输出的是 `a` 的值 4 和 `b` 的值 0,也就是 `4 0`。题干判断正确。

【易错点】 容易把 `b = a == 5` 看成先给 `b` 赋 5,再和 `a` 比较。

6 题(判断题

C++代码中对表达式('Z' - 'A')<('z' - 'A')的结果输出为 0。()

正确答案错误

解析详情

【答案】错误

【考点】字符编码;关系运算

【解析】 `'Z' - 'A' = 25`,而 `'z' - 'A' = 122 - 65 = 57`。因此比较式 `25 < 57` 的结果为真。如果把这个布尔结果直接输出,通常会得到 1,而不是 0,所以题干错误。

【易错点】 容易只看两个字母都是 z/Z,就忽略了大小写字符编码不同。

7 题(判断题

下面的C++代码可以用于判断正整数N的位数(即几位数,如123是3位数,12为2位数)。()

int N, N10, i;
cin >> N;
N10 = 10, i = 1;
while (1) {
    if (N % N10 == N) {
        printf("%d 是 %d 位数", N, i);
        break;
    }
    i++, N10 *= 10;
}

正确答案正确

解析详情

【答案】正确

【考点】位数判断;循环与乘法扩展

【解析】 `N10` 依次取 10、100、1000……,`i` 同步记录当前判断的是几位数。当第一次满足 `N % N10 == N` 时,说明 `N < N10`,也就是 N 的位数正好是当前的 `i`。例如 `N = 123` 时,先后比较 123 与 10、100、1000,直到 `123 < 1000`,输出 3 位数,因此题干正确。

【易错点】 容易看懂判断条件,却忽略 `N10` 必须每轮乘 10 才能扩大位数范围。

8 题(判断题

计算交叉加减的结果,形如 1-2+3-4+5-…… 。下面C++代码中的变量都是整型,则将 Flag = -Flag 改为 Flag -= Flag 效果相同。()

cin >> N;
Flag = -1;
tnt = 0;
for (i = 1; i < N + 1; i++) {
    Flag = -Flag;
    tnt += Flag * i;
}
cout << tnt;

正确答案错误

解析详情

【答案】错误

【考点】符号翻转;赋值语句

【解析】 `Flag = -Flag` 的作用是把 1 和 -1 来回切换,这样才能实现“加一项、减一项、再加一项”的交替。若改成 `Flag -= Flag`,第一次执行后 `Flag` 就变成 0,之后每次仍然是 0,`tnt += Flag * i` 就再也不会正常累加,所以两者效果完全不同,题干错误。

【易错点】 容易把“变号”误当成“减去自己”这种表面上也有减号的写法。

9 题(判断题

下列C++代码段执行后将输出 55。()

int cnt = 0;
for (int i = 0; i < 10; i++)
    for (int j = i; j < 10; j++)
        cnt += 1;
cout << cnt;

正确答案正确

解析详情

【答案】正确

【考点】嵌套循环;等差求和

【解析】 当 `i = 0,1,2,...,9` 时,内层循环执行次数分别为 `10,9,8,...,1`。所以 `cnt` 最终增加 `10 + 9 + ... + 1 = 55` 次,而 `cout << cnt` 在两个循环结束后执行一次,输出的正是 55,因此题干正确。

【易错点】 容易被缩进迷惑,以为 `cout` 在外层循环里会输出很多次。

10 题(判断题

下面C++代码执行后输出如下,因为代码 printf("\n") 没有任何可读内容,删除不影响输出效果。()

1 | 1  2  3  4  5  6  7  8  9
2 | 2  4  6  8 10 12 14 16 18
3 | 3  6  9 12 15 18 21 24 27
4 | 4  8 12 16 20 24 28 32 36
5 | 5 10 15 20 25 30 35 40 45
6 | 6 12 18 24 30 36 42 48 54
7 | 7 14 21 28 35 42 49 56 63
8 | 8 16 24 32 40 48 56 64 72
9 | 9 18 27 36 45 54 63 72 81
for (int i = 1; i < 10; i++) {
    for(int j = 1; j < 10; j++)
        printf("%3d", i * j);
    printf("\n");
}

正确答案错误

解析详情

【答案】错误

【考点】格式化输出;换行控制

【解析】 `printf("\n")` 虽然不显示可见字符,但它会输出换行符,把每一行乘法结果分到新的一行。若删除这一句,所有数字都会连在同一行里,乘法表的版式就被破坏了,因此“删除不影响输出效果”的说法错误。

【易错点】 容易把“没有可见字符”误当成“对输出结果没有作用”。