GESP 客观题评测系统

2025-03-Level-2

2025-03-Level-2

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

单选题(每题 2 分)

1 题(单选题

2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人,入了全球票房榜。下面关于DeepSeek与《哪吒2》的描述成立的是()。

A.
《哪吒2》是一款新型操作系统
B.
DeepSeek是深海钻探软件
C.
《哪吒2》可以生成新的软件
D.
DeepSeek可以根据《哪吒2》的场景生成剧情脚本

正确答案D

解析详情

【答案】D

【考点】人工智能应用;生成式模型

【解析】 DeepSeek 是人工智能模型,《哪吒2》是电影作品。只有 D 描述的是利用生成式 AI 根据电影场景生成剧情脚本,逻辑成立。A 把电影说成操作系统,B 把 DeepSeek 说成深海钻探软件,C 把电影说成能生成软件,都与题意不符。

【易错点】 不要把 AI 工具和电影作品这两类对象混为一谈。

2 题(单选题

对整型变量 N,如果它能够同时被 3 和 5 整除,则输出 N 是含有至少两个质因数。如果用流程图来描述处理过程,则输出语句应该在哪种图形框中()。

A.
圆形框
B.
椭圆形框
C.
平行四边形框
D.
菱形框

正确答案C

解析详情

【答案】C

【考点】流程图符号;输入输出表示

【解析】 题目问的是“输出语句”在流程图中用什么图形表示。流程图里输入和输出都用平行四边形表示,所以应选 C。圆形或椭圆形通常表示起止,菱形表示条件判断,不用于单独表示输出语句。

【易错点】 容易把“判断条件”用的菱形框误当成所有语句都适用的框。

3 题(单选题

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

int a=3, b = 4;
a == b;
b == a;
cout << a << ' ' << b << endl;
A.
34
B.
33
C.
44
D.
43

正确答案A

解析详情

【答案】A

【考点】比较运算;变量值变化;输出语句

【解析】 开始时 a=3,b=4。第 2、3 行的 `a == b` 和 `b == a` 都是比较表达式,不会给变量重新赋值,也没有把比较结果输出出来,所以 a 和 b 的值保持不变。最后 `cout << a << ' ' << b` 输出的是 3 和 4,因此对应 A。

【易错点】 容易把 `==` 误看成赋值号 `=`。

4 题(单选题

求三色彩球的颜色。有数量无限的红(Red)绿(Green)蓝(Blue)三种彩球排成一行,每组先为5个红色球,随后3个绿色,最后为2个蓝色。每个球都有编号,从左到右依次为1,2,3……。输入整数代表编号,求该编号球的颜色。下面是C++代码是实现,正确说法是()。

int N, remainder;
cin >> N;
remainder = N % 10; // remainder变量保存余数

if((1 <= remainder) && (remainder <= 5))
    cout << "Red";
else if ((6 <= remainder) && (remainder <= 8))
    cout << "Green";
else if ((remainder == 9) || (remainder == 0))
    cout << "Blue";
A.
将 else if ((remainder == 9) || (remainder == 0)) 修改为 else 效果相同
B.
将 ((1 <= remainder) && (remainder <= 5)) 修改为 (remainder <= 5) 效果相同
C.
else if ((6 <= remainder) && (remainder <= 8)) 写法错误,应修改为 else if (6 <= remainder <= 8)
D.
根据题意 remainder = N % 10 应修改为 remainder = N / 10

正确答案A

解析详情

【答案】A

【考点】周期规律;取模运算;分支结构

【解析】 每 10 个球颜色循环一次,所以用 `N % 10` 取出当前编号在这一组中的位置是对的基础。前两个条件已经覆盖了余数 1 到 8,剩下只可能是 9 或 0,因此最后一个分支写成 `else` 与写成 `else if ((remainder == 9) || (remainder == 0))` 效果相同。B 会把余数 0 也判成 Red,C 的连续比较不是 C++ 里判断区间的正确写法,D 用除法得不到组内位置。

【易错点】 余数为 0 代表这一组的第 10 个位置,不要漏掉。

5 题(单选题

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

int tnt = 0;
for (int i = 0; i < 10; i++)
    if (i % 3)
        tnt += 1;
    else
        tnt += 2;
cout << tnt;
A.
18
B.
17
C.
16
D.
14

正确答案D

解析详情

【答案】D

【考点】for 循环;条件判断;累计求和

【解析】 `i` 从 0 到 9 一共 10 次。满足 `i % 3 == 0` 的有 0、3、6、9 这 4 个数,每次给 `tnt` 加 2,共加 8;其余 6 个数每次加 1,共加 6。最终 `tnt = 8 + 6 = 14`,所以选 D。

【易错点】 不要漏算 `i=0`,它同样满足能被 3 整除。

6 题(单选题

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

int i;
for (i = 10; i > 0; i == 2)
    break;
cout << i;
A.
10
B.
8
C.
0
D.
因为循环执行时会执行break语句而终止循环,所以i的值不确定

正确答案A

解析详情

【答案】A

【考点】for 循环执行顺序;break 语句

【解析】 `for` 先把 `i` 赋值为 10,再判断 `i > 0` 成立,于是进入循环体。循环体第一句就是 `break`,会立刻结束循环,因此第三个表达式 `i == 2` 根本不会执行。最后 `i` 仍为 10,所以输出 10,选 A。

【易错点】 `break` 跳出循环后,不会再执行 for 的更新表达式。

7 题(单选题

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

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

正确答案D

解析详情

【答案】D

【考点】continue 语句;循环计数

【解析】 当 `i` 从 0 到 9 时,遇到 0、3、6、9 这 4 个 3 的倍数会执行 `continue`,因此不会输出 `0#`。其余 1、2、4、5、7、8 共 6 次,各输出一次 `0#`,得到 `0#0#0#0#0#0#`。循环结束后 `i` 已经变成 10,满足 `i >= 10`,还会额外输出一次 `1#`,总结果是 `0#0#0#0#0#0#1#`,选 D。

【易错点】 不要漏掉循环后面那个独立的 `if` 输出。

8 题(单选题

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

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

正确答案A

解析详情

【答案】A

【考点】for 循环执行过程;OCR 待核对

【解析】 根据题首答案表,本题答案为 A。原 Markdown 中存在 OCR 噪声字符 θ,已修正为 0。但代码中 `j == 1` 逻辑及选项 C/D 仍显异常,需结合原题进一步确认。

9 题(单选题

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

for (int i = 0; i < 100; i++)
    if (_____)
        cout << i << " ";
A.
((i % 2 == 0) && (i % 7 == 2))
B.
((!(i % 2)) && (i % 7 == 2))
C.
((!(i % 2)) && (!(i % 7)))
D.
((i % 2 != 1) && (i % 7 == 2))

正确答案C

解析详情

【答案】C

【考点】逻辑表达式;取模运算;条件筛选

【解析】 题目要求同时满足“能被 2 整除”和“除以 7 余 2”。A 直接判断这两个条件;B 中 `!(i % 2)` 等价于 `i % 2 == 0`;D 中 `i % 2 != 1` 对整数也等价于偶数判断,所以 A、B、D 都能实现。C 的后半部分 `!(i % 7)` 表示 `i % 7 == 0`,筛出来的是 7 的倍数,不是“余 2”,因此它不能实现。

【易错点】 `!(i % 7)` 表示余数为 0,不是“余数不等于 0”。

10 题(单选题

下面C++代码用于求1到N之间正整数中含有3的数的个数,比如 123 和 32 都是符合条件的数。则前后两处横线应填入代码分别是()。

int i, j, cnt = 0, N;
cout << "请输入正整数N:";
cin >> N;
for (i = 1; (j = i) < N; i++)
    while (j != 0)
        if (j % 10 == 3) {
            cnt += 1;
            ________;
        } else
            ________;
cout << cnt << " ";
A.
1 continue 2 j /= 10
B.
1 break 2 j /= 10
C.
1 continue 2 j %= 10
D.
1 break 2 j %= 10

正确答案B

解析详情

【答案】B

【考点】数位分解;while 循环;break 语句

【解析】 题目要统计的是“含有数字 3 的数”有多少个,而不是数字 3 一共出现多少次。检查一个数 `j` 的末位时,如果 `j % 10 == 3`,应先把 `cnt` 加 1,再立刻 `break`,避免像 33 这样的数被重复计数;如果末位不是 3,就要执行 `j /= 10` 去掉末位,继续检查更高位。所以两个空分别是 `break` 和 `j /= 10`,选 B。

【易错点】 第一空若写成 `continue`,一个数中有多个 3 时会被重复统计。

11 题(单选题

在数学中N!表示N的阶乘,即1到N的乘积,如3!=1*2*3,且0!=1。下面的两段C++代码用于求1到N的阶乘之和,如N为3,则结果是9(1!+2!+3!的值)。选项中的说法正确的是( )。

// 实现1
int i, N;
cin >> N;
int tnt = 0, last = 1;
for (i = 1; i < N + 1; i++) {
    last *= i;
    tnt += last;
}
cout << tnt << endl;
// 实现2
int i, N;
cin >> N;
int tnt = 0, tmp;
for (i = 1; i < N + 1; i++) {
    tmp = 1;
    for (int j = 1; j < i + 1; j++) {
        tmp *= j;
        tnt += tmp;
    }
    cout << tnt << endl;
}
A.
虽然实现1的代码短小,但效率并不高
B.
实现2的代码效率更高,且更易于理解
C.
实现1因为应用了前项计算结果,计算量更小,因此效率高
D.
两种实现,效率几乎一致

正确答案C

解析详情

【答案】C

【考点】阶乘递推;算法效率比较

【解析】 实现 1 用变量 `last` 保存上一轮已经算出的阶乘。若上一轮 `last = (i-1)!`,这一轮只需再乘一次 `i` 就得到 `i!`,然后累加到 `tnt`。实现 2 对每个 `i` 都从 1 重新连乘到 `i`,乘法次数明显更多,因此效率更低。于是“实现 1 因为应用了前项计算结果,计算量更小,因此效率高”是正确说法,选 C。

【易错点】 代码更短不一定只是书写简洁,很多时候也意味着重复计算更少。

12 题(单选题

哥德巴赫猜想是指大于2的偶数都可以分解为两个质数之和,下面的代码用于验证4-1000之内的偶数能否分解为两个质数之和。下面C++代码中假设isPrime()是已经定义好用于判断正整数N是否为质数,返回bool值。对该段代码,错误的说法是( )。

for (i = 4; i < 1000; i += 2)
    for (j = 2; j < i; j++)
        if (isPrime(j) && isPrime(i - j)) {
            printf("%d=%d+%d\n", i, j, i - j);
            break;
        }
A.
将代码 isPrime(j) && isPrime(i-j) 修改为 isPrime(j) == true && isPrime(i-j) == true 效果相同
B.
代码执行后,输出的一对质数,一定是小的数在前
C.
即便将外层循环中i的上界1000修改为很大的整数,也不能说从数学上证明了哥德巴赫猜想
D.
根据题意,break语句应该移到if语句块之外

正确答案D

解析详情

【答案】D

【考点】嵌套循环;布尔表达式;反例判断

【解析】 代码的作用是:对每个偶数 `i`,从小到大枚举 `j`,一旦找到 `j` 和 `i-j` 都是质数,就输出这一组分解并停止当前内层循环。`break` 必须放在 `if` 语句块里,只有找到一组合法分解时才该停止;若挪到 `if` 外面,内层循环会被过早终止,题意就被破坏,所以 D 是错误说法。A 只是把布尔值显式写成与 `true` 比较,效果相同;B 中 `j` 从小到大枚举,第一次找到的分解一定是较小的那个数在前;C 只是在有限范围内验证,不能当作数学证明。

【易错点】 “验证很多个例子”不等于“证明对所有情况都成立”。

13 题(单选题

已知 C++ 代码和执行后的期望输出如下,相关说法正确的是()。

int i, j, last, N;
cout << "请输入层数N:";
cin >> N;
last = 1;
for (i = 1; i < N; i++) {
    for (j = 1; j < i + 1; j++) {  //L1 
        if (last > 9)
            last = 1;
        cout << last << " ";
        last += 1;
    }
    printf("\n");
}
1 请输入层数N:10
2 1
3 2 3
4 4 5 6
5 7 8 9 1
6 2 3 4 5 6
7 7 8 9 1 2 3
8 4 5 6 7 8 9 1
9 2 3 4 5 6 7 8 9
10 1 2 3 4 5 6 7 8 9
A.
倒数第二行的 printf("\n") 有错,应该修改为 cout << endl;printf()函数不能输出换行
B.
last += 1 修改为 last = last + 1 执行效果相同
C.
代码中L1标记行中的 j < i + 1 应修改为 j < i
D.
外层for循环前的 last = 1 修改为 last = 0 执行效果相同

正确答案B

解析详情

【答案】B

【考点】循环输出;赋值等价变形

【解析】 这段程序按顺序输出从 1 到 9 循环出现的数字,`last += 1` 与 `last = last + 1` 是完全等价的写法,所以 B 正确。A 错在 `printf("\n")` 本来就能输出换行;C 若把 `j < i + 1` 改成 `j < i`,每行会少输出一个数;D 若把 `last` 初值改成 0,第一行就会先输出 0,结果显然不同。

【易错点】 判断“效果是否相同”时,要代入示例输出逐行核对,而不是只看某一行代码长得像不像。

14 题(单选题

在C++中,()最适合填入横线处连续5次正确生成1到10之间的随机整数?

for (int i = 0; i < 5; i++)
    ________;
A.
rand() % 11
B.
rand() % 10
C.
rand() % 10 + 1
D.
rand() % 9 + 1

正确答案C

解析详情

【答案】C

【考点】随机数范围;取模运算

【解析】 `rand() % 10` 的结果范围是 0 到 9,再加 1 后才正好变成 1 到 10,所以应选 `rand() % 10 + 1`。A 的范围是 0 到 10,包含了 0;B 的范围是 0 到 9,少了 10;D 的范围是 1 到 9,少了 10。

【易错点】 先判断 `%` 后的范围,再看是否需要平移到目标区间。

15 题(单选题

在C++中,如果 a 和 b 均为 float 类型的变量,那么二者如果相差足够小(比如0.000001),就可以视作相等。比如 2.2345676 和 2.2345677 就可以视作相等。下列哪个表达式能用来正确判断“a等于b”()。

A.
((b-a) < 0.000001)
B.
((b-a) <= 0.000001)
C.
(abs(b-a) <= 0.000001)
D.
(sqrt(b-a) <= 0.000001)

正确答案C

解析详情

【答案】C

【考点】浮点数比较;绝对值

【解析】 判断两个浮点数是否“足够接近”,要看它们差值的绝对值是否不超过给定误差,因此应使用 `abs(b-a) <= 0.000001`。A、B 只限制了 `b-a` 的上界,没有处理 `a>b` 时出现的负值;D 对差值开平方没有比较相等的意义,而且当 `b-a` 为负数时还会出问题,所以选 C。

【易错点】 浮点数近似相等比较时,必须先取绝对值。

判断题(每题 2 分)

1 题(判断题

C++、Python都是高级编程语言,它们的每条语句最终都要通过机器指令来完成。()

正确答案正确

解析详情

【答案】正确

【考点】程序执行机制;高级语言

【解析】 C++ 和 Python 都属于高级编程语言,但程序最终要在计算机硬件上运行,落到处理器能够执行的仍然是机器指令。区别只是在于 C++ 通常先编译,Python 常借助解释器或虚拟机间接执行,本质上最终都离不开底层机器指令,所以题干说法正确。

【易错点】 “高级语言”描述的是编程抽象层次,不表示可以脱离机器指令独立运行。

2 题(判断题

在C++代码中,假设N为正整数,则N - N / 10 * 10 与N % 10都将获得N的个位数。()

正确答案正确

解析详情

【答案】正确

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

【解析】 对正整数 `N`,`N / 10` 会去掉个位,只保留前面的整数部分。再用 `N - N / 10 * 10`,相当于把去掉个位后的数乘回 10 再从原数中减掉,剩下的正是个位数;`N % 10` 本身也是求个位余数。因此这两个表达式得到的结果相同,题干说法正确。

【易错点】 这里依赖的是整数除法,不能按实数除法去理解。

3 题(判断题

C++语句 cout << ((10 <= N <= 12) ? "true": "false") 中,假设整型变量N为12,则其输出为 true。原因是执行 10 <= N 后其值为 true,true 与 12 相比仍然是 true。()

正确答案正确

解析详情

【答案】正确

【考点】关系运算;布尔值参与比较

【解析】 在 C++ 里 `10 <= N <= 12` 不是数学上的区间连写,而是按从左到右计算。若 `N=12`,先算 `10 <= N` 得到 `true`,在数值环境里相当于 1;再比较 `1 <= 12`,结果仍然是 `true`,所以整条语句输出 `true`。因此题干对这句代码的判断是正确的。

【易错点】 不要把数学里的 `a<=x<=b` 直接照搬成 C++ 区间判断。

4 题(判断题

C++ 表达式 (sqrt(N) * sqrt(N)) == N 中的N如果为正整数,则表达式的值为true,相当于开平方后平方是本身。()

正确答案错误

解析详情

【答案】错误

【考点】浮点运算;平方根;相等比较

【解析】 `sqrt(N)` 的结果是浮点数。若 `N` 不是完全平方数,例如 2,`sqrt(N) * sqrt(N)` 只是近似等于 `N`,不一定能用 `==` 精确比较为真;即使 `N` 是完全平方数,浮点运算也可能受精度影响。因此不能说只要 `N` 是正整数,这个表达式就一定为 `true`,题干说法错误。

【易错点】 浮点数计算结果看起来相等,不代表用 `==` 比较一定为真。

5 题(判断题

下面C++执行后将输出3*2=6。()

int a = 2, b = 3;
a = a - b;
b = a + b;
a = b - a;
printf("%d*%d=%d\n", a, b, a * b);

正确答案正确

解析详情

【答案】正确

【考点】变量交换;赋值语句

【解析】 初始 `a=2`,`b=3`。执行 `a = a - b` 后 `a=-1`;执行 `b = a + b` 后 `b=2`;执行 `a = b - a` 后 `a=3`。于是最后 `a` 和 `b` 互换成功,`printf` 输出的是 `3*2=6`,所以题干说法正确。

【易错点】 这三句并不是随便改值,而是在不借助第三个变量完成交换。

6 题(判断题

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

int i;
for (i = 0; i < 10; i++)
    continue;
cout << i << endl;

正确答案正确

解析详情

【答案】正确

【考点】for 循环;语句作用范围

【解析】 没有大括号时,`for` 循环体只有紧跟着的那一条语句,也就是 `continue;`。因此循环会让 `i` 从 0 递增到 10 后结束,而 `cout << i << endl;` 并不在循环体内,只会在循环结束后执行一次,此时输出的正是 10。所以题干说法正确。

【易错点】 缩进不能决定 C++ 的语句归属,是否在循环体内要看大括号。

7 题(判断题

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

int i;
for (i = 1; i < 10; i++) {
    break;
    continue;
}
cout << i << endl;

正确答案正确

解析详情

【答案】正确

【考点】break 语句;循环首次迭代

【解析】 循环开始时 `i=1`,进入循环体后立即执行 `break`,因此循环在第一次迭代就结束。`continue` 写在 `break` 后面,实际上根本执行不到。跳出循环后输出 `i`,此时 `i` 仍是 1,所以题干说法正确。

【易错点】 同一条执行路径上,`break` 后面的语句可能变成永远到达不了的代码。

8 题(判断题

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

for (int i = 0; i < 5; i++)
    for (int j = 0; j < i; j++)
        printf("OK\n");

正确答案正确

解析详情

【答案】正确

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

【解析】 外层 `i` 依次取 0、1、2、3、4。对每个 `i`,内层 `j` 从 0 循环到 `i-1`,因此分别输出 0、1、2、3、4 行 `OK`。总行数是 `0+1+2+3+4=10`,所以题干说法正确。

【易错点】 当 `i=0` 时内层循环一次也不执行,这一层贡献的是 0 行。

9 题(判断题

将下面C++代码中的for循环中的i = 1调整为i = 0的输出结果相同。()

int tnt = 0;
for (int i = 1; i < 5; i++) // i=1
    tnt += i;
cout << tnt;

正确答案正确

解析详情

【答案】正确

【考点】循环边界;加法恒等元

【解析】 原程序累加的是 `1+2+3+4`。若把初值改成 `i=0`,循环会多执行一次 `tnt += 0`,但加上 0 不会改变结果,之后仍然会继续加上 1、2、3、4,所以最终输出保持不变。题干说法正确。

【易错点】 多循环一次不一定会改变结果,要看新增那一轮对结果的贡献是不是 0。

10 题(判断题

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

for (i = 0; i < 5; i++)
    for (i = 0; i < i; i++)
        continue;
printf("%d\n", i);

正确答案错误

解析详情

【答案】错误

【考点】循环变量复用;死循环分析

【解析】 外层循环刚进入循环体时,内层 `for (i = 0; i < i; i++)` 会先把 `i` 重新赋值为 0,然后立刻判断 `0 < 0` 为假,所以内层循环体一次也不执行。接着外层循环的更新把 `i` 加到 1,下一轮外层条件 `1 < 5` 仍然成立;进入循环体后又会被内层初始化重置成 0。这样过程会不断重复,外层循环无法正常结束,`printf` 也就执行不到,因此绝不会输出 0123,题干说法错误。

【易错点】 内外层共用同一个循环变量时,要特别注意内层初始化会不会把外层变量重置掉。