空客 A320 需更换易受太阳辐射影响的飞行控制软件。强烈太阳辐射可能损坏关键数据,导致判断失误。这里飞行控制系统执行判断的部件最可能是( )。
🧭 分析思路
把题目里的关键词和硬件功能一一对应——「判断」属于运算与决策:
| 部件 | 职责 | 是否“做判断” |
|---|---|---|
| 传感器 | 采集外界信息(输入) | 否 |
| 处理器 CPU | 对数据运算并作出控制决策 | ✔ 是 |
| 内存单元 | 存放数据 | 否 |
| 输出设备 | 显示/执行结果 | 否 |
试卷:2025 年 12 月 · GESP Level 2(客观题部分)
用法:每题先独立思考并选出答案,再点开「显示解析」核对分步推理与知识点。
25 道题主要围绕下面 7 类知识点展开,复习时建议先掌握「循环追踪」和「整除/取模」两大核心。
涉及:单选 1、2;判断 1。硬件分工(处理器=判断/运算)、网络分类(PAN/LAN/MAN/WAN)、操作系统≠编译器。
涉及:单选 3。变量名规则:字母/下划线开头,关键字不能当变量名,库函数名≠关键字。
涉及:单选 4、6、7;判断 3、4、6。整数除法向 0 截断,% 取余数,循环节用取模定位。
涉及:单选 5;判断 10。%g 默认精度、\n 换行的作用。
涉及:判断 2、5、6。比较结果是 0/1,非 0 即真,字符按 ASCII 参与运算。
涉及:单选 8、9、10、11、12、14;判断 7、8、9。嵌套循环计数、break/continue、先自增还是先输出。
涉及:单选 13、15。循环里改写了原变量要先备份;单次扫描即可求最大/最小,不必排序。
空客 A320 需更换易受太阳辐射影响的飞行控制软件。强烈太阳辐射可能损坏关键数据,导致判断失误。这里飞行控制系统执行判断的部件最可能是( )。
把题目里的关键词和硬件功能一一对应——「判断」属于运算与决策:
| 部件 | 职责 | 是否“做判断” |
|---|---|---|
| 传感器 | 采集外界信息(输入) | 否 |
| 处理器 CPU | 对数据运算并作出控制决策 | ✔ 是 |
| 内存单元 | 存放数据 | 否 |
| 输出设备 | 显示/执行结果 | 否 |
平时上学所在的教学楼内的网络属于( )。
网络按覆盖范围由小到大排列,对号入座即可:
| 类型 | 全称 | 覆盖范围 |
|---|---|---|
| PAN | 个人区域网 | 几米(蓝牙耳机等) |
| LAN | 局域网 | 一栋楼 / 一个校园 ✔ |
| MAN | 城域网 | 一座城市 |
| WAN | 广域网 | 跨城市 / 全国 / 互联网 |
「教学楼内部」范围小、连接同一建筑设备,正是 LAN。
下面有关 C++ 变量的说法,正确的是( )。
| 选项 | 判断 | 理由 |
|---|---|---|
| A ✔ | 正确 | for 是关键字,不能当变量名 |
| B ✘ | 错误 | 首字符可以是字母或下划线,_tnt 合法 |
| C ✘ | 错误 | 末尾下划线完全合法,不会“像减号” |
| D ✘ | 错误 | printf 是库函数名,不是关键字(可作变量名但不推荐) |
for/if/int/while);④区分大小写。库函数名虽可重名,但属坏习惯。小数 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;
循环节是 1, 2, 3,对应 remainder = 0, 1, 2。代码要求 remainder 取 0/1/2,所以要把「从 1 开始数的第 N 位」转成「从 0 开始的下标」,即先 N-1 再 %3。
| 第 N 位 | 正确:(N-1)%3 | 输出 | 错误写法 N%3 |
|---|---|---|---|
| 1 | 0 | 1 ✔ | 1 → 误判为 2 ✘ |
| 2 | 1 | 2 ✔ | 2 |
| 3 | 2 | 3 ✔ | 0 → 误判为 1 ✘ |
| 4 | 0 | 1 ✔ | 1 |
(k-1) % L。N % 3,会让第 1 位被错判到余数 1。执行 printf("%g\n", (3 + 3.1415926535)); 输出 6.14159,原因最可能是( )。
真实结果 ≈ 6.1415926535,而屏幕只显示 6.14159——这是显示格式导致,不是算错。%g 默认保留 6 位有效数字(6、1、4、1、5、9),多余位自动省略。
| 选项 | 是否成立 |
|---|---|
| B:%g 默认精度 | ✔ 正是直接原因 |
| A:浮点舍入误差 | 误差存在但不是“显示得少”的原因 |
| C:无限循环小数 | 它是有限小数,说法错误 |
| D:CPU 算错 | CPU 不会算错 |
%g 自动在 %f 和 %e 间选择更短形式,默认 6 位有效数字并去掉末尾多余 0。想看更多位可用 %.10f。工号编码 5 位全数字:前 4 位分别整除以 3 得到的商累加,其和除以 10 的余数为第 5 位。如 76587,前 4 位整除 3 商为 2、2、1、2,和为 7,7%10=7,故第 5 位为 7。两横线应填( )。
int rst = 0, N;
for (int i = 0; i < 4; i++) {
cin >> N;
rst += _____; // L1
}
cout << _____; // L2
| 输入 N | L1 = N / 3(商) | 累加 rst |
|---|---|---|
| 7 | 7 / 3 = 2 | 2 |
| 6 | 6 / 3 = 2 | 4 |
| 5 | 5 / 3 = 1 | 5 |
| 8 | 8 / 3 = 2 | 7 |
L2:第 5 位 = 和「除以 10 的余数」= rst % 10 = 7 % 10 = 7 ✔,与题目一致。
关键区分:「整除以 3 后的商」用 /;「除以 10 的余数」用 %。
a / b = 商(整数除法向 0 截断);a % b = 余数。取个位数常用 x % 10,去掉个位用 x / 10。下面代码执行后的输出是( )。
for (int i = -2; i < 2; i++)
if (i % 2)
printf("%d#", i);
if (i % 2) 中,只要 i%2 非 0(即奇数)就成立:
| i | i % 2 | 是否非0(奇数) | 输出 |
|---|---|---|---|
| -2 | 0 | 否 | — |
| -1 | -1 | 是 | -1# |
| 0 | 0 | 否 | — |
| 1 | 1 | 是 | 1# |
拼接得 -1#1#。
if(表达式):非 0 为真、0 为假。判断奇偶常写 if(i%2)(奇)或 if(i%2==0)(偶)。if(i%2) 误看成「偶数时成立」,实际是奇数(非0)成立。下面代码执行后输出是( )。
int cnt = 0, N;
for (int i = 1; i < 10; i += 2)
for (int j = 0; j < i; j++)
cnt += 1;
cout << cnt;
外层 i 以 +=2 递增:1, 3, 5, 7, 9;内层每次执行 i 次。
| i | 内层次数 | 累计 cnt |
|---|---|---|
| 1 | 1 | 1 |
| 3 | 3 | 4 |
| 5 | 5 | 9 |
| 7 | 7 | 16 |
| 9 | 9 | 25 |
总和 = 1+3+5+7+9 = 25(前 5 个奇数之和 = 5² = 25)。
i 变化。下面代码执行后输出是( )。
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);
① 外层 continue 让偶数 i 全部跳过,只处理奇数。
② 对任意奇数 i,内层从 j=0 开始:i*0 = 0,0%2==0 立即成立 → 第一轮就 break,此时 j 停在 0。
③ j>=i → 0>=i(i≥1)永远不成立,所以循环体内从不输出。
④ 外层结束时 i 增到 12,j 仍为 0。i>=12 成立 → 输出 i*j = 12*0 = 0。
最终只输出一个 0。
continue:跳过本轮剩余语句进入下一轮;break:直接跳出当前循环。循环结束后,循环变量仍保留最后一次的值(这里 i=12, j=0)。j 从 0 开始,导致内层一开始就触发 break。与下面代码输出效果不一致的是( )。原代码输出 0123456789。
int i;
for (i = 0; i < 10; i++)
cout << i;
| 选项 | 循环体顺序 | 输出 | 是否一致 |
|---|---|---|---|
| A | 输出 i → i+1 | 0…9 | ✔ |
| B | i+1 → 输出 i | 1…10 | ✘ 不一致 |
| C | 输出 i → i+1 → 满10才break | 0…9 | ✔ |
| D | 满10先break → 否则输出 → i+1 | 0…9 | ✔ |
B 先 i+=1 再输出,序列变成 1 到 10,与原效果不同。
for 改写为 while 时,要保证「初始化、判断、循环体、自增」四要素的先后顺序一致,尤其是输出与自增谁先谁后。下面代码执行后输出是( )。
int num = 0;
while (num <= 5) {
num += 1;
if (num % 3) continue;
printf("%d#", num);
}
if (num > 5) printf("%d", num);
注意:先 num+=1 再判断。只有 num%3==0 才打印。
| 进入时 num≤5? | num+=1 后 | num%3 | 动作 |
|---|---|---|---|
| 0 ✔ | 1 | 1 | continue |
| 1 ✔ | 2 | 2 | continue |
| 2 ✔ | 3 | 0 | 输出 3# |
| 3 ✔ | 4 | 1 | continue |
| 4 ✔ | 5 | 2 | continue |
| 5 ✔ | 6 | 0 | 输出 6# |
| 6 ✘ 退出 | — | — | 循环结束 |
循环内输出 3#6#;退出后 num=6>5 成立 → 再输出 6。合计 3#6#6。
num 已是 6。continue 跳过的是本轮 printf,不影响 num+=1(它在 continue 之前)。if 会再输出一次 num。下面代码执行后输出是( )。
int cnt = 0;
for (int i = 0; i < 5; i++)
for (int j = i; j < 4; j++)
cnt += 1;
cout << cnt;
内层 j 从 i 到 3,执行次数 = 4 - i(不足则为 0)。
| i | j 范围 | 次数 (4−i) |
|---|---|---|
| 0 | 0,1,2,3 | 4 |
| 1 | 1,2,3 | 3 |
| 2 | 2,3 | 2 |
| 3 | 3 | 1 |
| 4 | 空(4<4 假) | 0 |
合计 = 4+3+2+1+0 = 10。
j=i)时,次数随 i 递减;注意 i=4 时内层一次都不执行。j<4 看成固定执行 4 次。「完整漂亮数」:N 能被 M 整除、且某位是 M、且各位数字之和能被 M 整除。下面代码判断 N 是否为 M 的完整漂亮数,正确的说法是( )。
int N, M, Flag, Sum, num;
cin >> N; cin >> M;
Sum = 0; Flag = 0;
while (N != 0) {
num = N % 10;
Sum += num;
if (num == M) Flag = 1;
N /= 10; // 循环后 N 一定变成 0
}
if ((N % M == 0) && (Flag == 1) && (Sum % M == 0)) // L1
printf("%d 是 %d 的完整漂亮数", N, M);
else
printf("%d 不是 %d 的完整漂亮数", N, M);
| 选项 | 判断 | 理由 |
|---|---|---|
| B ✔ | 正确 | 循环里 N/=10 把 N 改没了,L1 的 N%M 已失去「原数能否被 M 整除」的含义,须先备份原值 |
| A ✘ | 错误 | 正因 N 被改成 0,逻辑不对,无法完成目标 |
| C ✘ | 错误 | 加 else Flag=0 会把之前已找到 M 的事实抹掉 |
| D ✘ | 错误 | 输入 0 时 while 不执行,Flag 仍为 0,第二个条件不满足 |
num=N%10; N/=10;)会销毁原始 N。若后续还要用原值,务必在循环前用一个变量备份,例如 int t = N; 然后对 t 做分解。输入 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;
}
| i | 空格 = n−i−1 | 星号 = 2i+1 | 该行 |
|---|---|---|---|
| 0 | 4 | 1 | ····* |
| 1 | 3 | 3 | ···*** |
| 2 | 2 | 5 | ··***** |
| 3 | 1 | 7 | ·******* |
| 4 | 0 | 9 | ********* |
星号数 1,3,5,7,9 逐行加 2,前面空格逐行减 1 → 居中的金字塔,选 B。
i 的数量关系(这里空格 n−i−1、星号 2i+1)即可。2*i+1,误以为每行只比上一行多 1 个星号(那是 C/D 的左右直角三角形)。25 名选手、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);
}
| 选项 | 判断 | 理由 |
|---|---|---|
| C ✔ | 正确 | max(a,b) 等价于 if(b>a) a=b; 或 a = b>a ? b : a; |
| A ✘ | 错误 | 单次扫描同步维护最值与总分即可,无需排序 |
| B ✘ | 错误 | 每位选手都要重新统计,初始化必须放在外层循环内 |
| D ✘ | 错误 | a += b 与 a = a + b 完全等价 |
例如 L1 改写:if (now_score > max_score) max_score = now_score;
max/min 函数、if、三目运算符三者等价。鸿蒙是华为开发的一款操作系统,那么它能够将正确的源程序翻译成目标程序,并运行。( )
把源程序翻译成目标程序的是编译器/翻译程序;操作系统负责管理硬件资源、为程序提供运行环境。两者是不同的软件,题干把概念混在了一起。
| 软件 | 职责 |
|---|---|
| 操作系统(鸿蒙/Windows/Linux) | 资源调度、提供运行环境 |
| 编译器(g++ 等) | 源代码 → 目标/可执行程序 |
C++ 表达式 5 < 10 && 20 对应的逻辑值为 true。( )
① 5 < 10 → true。
② 逻辑与中,非 0 整数 20 视为 true。
③ true && true → true。
&& 两侧只要是非 0 即为真。优先级:关系运算 < 高于逻辑 &&,所以先算 5<10。&& 两边必须都写成显式布尔表达式。C++ 表达式 10 / 0.333333 == 10 / (1 / 3) 的值为 true。( )
左边:10 / 0.333333 是浮点除法 ≈ 30。
右边:先算括号 1 / 3,两个都是整数 → 整数除法 = 0;于是变成 10 / 0,除以 0,无合法结果。
左右不可能相等,说「值为 true」是错误的。
1/3 在整数环境下等于 0(向 0 截断),想得到 0.333… 须写成 1.0/3。整数除以 0 是未定义/运行错误。1 / 3 在整数环境下先算成 0。下面代码中 N 是整数,无论输入负整数、0 或正整数,输出都将是 0。( )
cin >> N; while (N) N /= 10; cout << N;
① 输入 0:while(0) 直接不进循环,输出 0。
② 正数 123:123 → 12 → 1 → 0(每次整除 10 向 0 截断),输出 0。
③ 负数 -123:-123 → -12 → -1 → 0,同样归 0。
三种情况都收敛到 0,题干正确。
/=10 必然有限步归 0(C++ 整除向 0 截断)。while(N) 即 while(N!=0)。下面代码执行后,输出是 4 0。( )
int a, b; a = 4; b = a == 5; cout << a << ' ' << b;
① a = 4。
② b = (a == 5):先算 a==5 → false → 赋给 int 变量 b 得 0。
③ 输出 a 和 b → 4 0。
关键:==(比较)优先级高于 =(赋值),所以是「先比较再赋值」。
=(赋值)与 ==(判等)。b = a == 5 看成「先给 b 赋 5,再和 a 比较」。C++ 中对表达式 ('Z' - 'A') < ('z' - 'A') 的结果输出为 0。( )
'A'=65, 'Z'=90, 'z'=122。
左:'Z'-'A' = 90-65 = 25;右:'z'-'A' = 122-65 = 57。
比较 25 < 57 → true → 输出 1,而非 0。题干说输出 0,错误。
下面代码可以用于判断正整数 N 的位数(如 123 是 3 位数)。( )
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;
}
核心:N % N10 == N 等价于 N < N10(当 N 比 N10 小,余数就是它本身)。N10 取 10,100,1000…,i 同步记录位数。
| N10 | i | N%N10==N ? | 动作 |
|---|---|---|---|
| 10 | 1 | 123%10=3 ≠123 | 继续 |
| 100 | 2 | 123%100=23 ≠123 | 继续 |
| 1000 | 3 | 123%1000=123 ✔ | 输出 3 位数 |
N/=10 并计数,直到 N 为 0。本题用「与 10ⁱ 比较」实现同样目的。N10 必须每轮乘 10 才能扩大位数范围。计算交叉加减 1-2+3-4+5-……。将 Flag = -Flag 改为 Flag -= Flag 效果相同。( )
cin >> N;
Flag = -1; tnt = 0;
for (i = 1; i < N + 1; i++) {
Flag = -Flag; // 在 +1 / -1 间来回切换
tnt += Flag * i;
}
cout << tnt;
| i | Flag=-Flag(正确) | Flag-=Flag(错误) |
|---|---|---|
| 初始 | -1 | -1 |
| 1 | +1,tnt=+1 | -1-(-1)=0,tnt=0 |
| 2 | -1,tnt=-1 | 0-0=0,tnt=0 |
| 3 | +1,tnt=+2 | 0,tnt=0 |
Flag -= Flag 即 Flag = Flag - Flag = 0,从此恒为 0,tnt 再也不累加。两者效果完全不同。
Flag = -Flag 是「变号/取反」,用于实现 +/− 交替;Flag -= Flag 是「减去自己」,结果恒为 0。下列代码段执行后将输出 55。( )
int cnt = 0;
for (int i = 0; i < 10; i++)
for (int j = i; j < 10; j++)
cnt += 1;
cout << cnt;
内层 j 从 i 到 9,执行次数 = 10 - i:
| i | 0 | 1 | 2 | … | 9 |
|---|---|---|---|---|---|
| 次数 | 10 | 9 | 8 | … | 1 |
合计 = 10+9+8+…+1 = 10×11/2 = 55。cout 在两层循环结束后只执行 1 次,输出 55。
n(n+1)/2。注意缩进不代表归属——cout 在循环外,只输出一次。cout 在循环里会输出很多次。下面代码输出九九乘法表。因为 printf("\n") 没有可读内容,删除不影响输出效果。( )
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++)
printf("%3d", i * j);
printf("\n"); // 每行末尾换行
}
printf("\n") 虽不显示可见字符,但会输出换行符,使每一行乘积换到新行。删除后所有数字会挤在同一行,乘法表版式被破坏。
所以「删除不影响输出效果」是错误的——\n 是排版的关键。
\n 是转义字符「换行」,%3d 表示按 3 位宽右对齐输出整数,二者共同决定表格排版。