GESP 客观题评测系统

2024-12-Level-2

2024-12-Level-2

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

单选题(每题 2 分)

1 题(单选题

2024年10月8日,诺贝尔物理学奖“意外地”颁给了两位计算机科学家约翰·霍普菲尔德(John J. Hopfield)和杰弗里·辛顿(Geoffrey E. Hinton)。这两位科学家的主要研究方向是()。

A.
天体物理
B.
流体力学
C.
人工智能
D.
量子理论

正确答案C

解析详情

【答案】C 【考点】计算机基础与大事件 【解析】2024年诺贝尔物理学奖授予了约翰·霍普菲尔德和杰弗里·辛顿,以表彰他们在人工神经网络和机器学习方面的基础性发现。这两位科学家是深度学习和人工智能领域的先驱。 【易错点】误以为诺贝尔物理学奖只会颁给传统物理学领域。

2 题(单选题

计算机系统中存储的基本单位用 B 来表示,它代表的是(),比如某个照片大小为 3MB。

A.
Byte
B.
Block
C.
Bulk
D.
Bit

正确答案A

解析详情

【答案】A 【考点】计算机存储单位 【解析】在计算机系统中,B 代表 Byte(字节),是存储空间的基本计量单位。1 Byte = 8 bits。KB、MB、GB等都是基于 Byte 的更大单位。 【易错点】混淆 B (Byte) 和 b (bit)。

3 题(单选题

C++语句 cout << (3 + 3 % 3 * 2 - 1) 执行后输出的值是()。

A.
-1
B.
4
C.
56
D.
2

正确答案D

解析详情

【答案】D 【考点】C++ 算术运算符优先级 【解析】表达式 `3 + 3 % 3 * 2 - 1` 的计算顺序:先算取模 `3 % 3 = 0`,再算乘法 `0 * 2 = 0`,最后算加减法 `3 + 0 - 1 = 2`。 【易错点】不熟悉运算符优先级,错误地按从左到右顺序计算。

4 题(单选题

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

for (int i=0; i<10; i++)
    printf("%d",i);
A.
123456789
B.
0123456789
C.
12345678910
D.
012345678910

正确答案B

解析详情

【答案】B 【考点】C++ 循环与输出 【解析】循环 `for (int i=0; i<10; i++)` 中,变量 `i` 的值依次为 0, 1, 2, ..., 9。`printf("%d", i)` 将这些数字连续输出,结果为 `0123456789`。 【易错点】误认为循环包含 10 或从 1 开始。

5 题(单选题

下面C++代码的相关说法中,正确的是()。

int tnt;
for (int i=0; i<10; i++)
    tnt += i;
cout << tnt;
A.
上述代码执行后其输出相当于求1-10的和(包含10)
B.
上述代码执行后其输出相当于求1-10的和(不包含10)
C.
上述代码执行后其输出相当于求0-10的和(不包含10)
D.
上述代码执行后将输出不确定的值

正确答案D

解析详情

【答案】D 【考点】C++ 变量初始化 【解析】变量 `tnt` 在定义后没有初始化。在执行 `tnt += i` 时,其初始值是不确定的(通常是内存中的残留数据),因此最终输出的值也是不确定的。 【易错点】忽略局部变量未初始化时含有随机值的问题。

6 题(单选题

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

int i;
for (i=1; i<10; i++)
    if (i % 2)
        continue;
    else
        break;
cout << i;
A.
1
B.
2
C.
9
D.
10

正确答案B

解析详情

【答案】B 【考点】C++ 循环控制逻辑 【解析】循环 `i` 从 1 开始。i=1时,`i % 2` 为 1(真),执行 `continue` 跳过;i=2时,`i % 2` 为 0(假),执行 `else` 分支中的 `break` 终止循环。此时 `i` 的值为 2。 【易错点】对 `continue` 和 `break` 的触发条件理解不透彻。

7 题(单选题

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

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

正确答案C

解析详情

【答案】C 【考点】C++ 循环与条件判断 【解析】循环 `i` 从 0 到 9。`i % 3 == 0` 的情况有 i=0, 3, 6, 9,此时 `i % 3` 为 0(假),不执行 `continue`,输出 `0#`。循环结束后 `i=10`,满足 `i >= 10`,输出 `1#`。总输出为 `0#0#0#0#1#`。 【易错点】混淆 `if (i % 3)` 的真假判断(非零为真,零为假)。

8 题(单选题

下面C++代码用于输出0-100之前(包含100)能被7整除但不能被3整除的数,横线处不能填入的代码是()。

for (i=0; i<100; i++)
    if(_____)
        cout << i << endl;
A.
i % 7 == 0 && i % 3 != 0
B.
!(i % 7) && i % 3 != 0
C.
i % 7 && i % 3
D.
i % 7 == 0 && !(i % 3 == 0)

正确答案C

解析详情

【答案】C 【考点】C++ 逻辑表达式组合 【解析】题目要求“能被7整除但不能被3整除”。A、B、D选项均能正确表达此逻辑。C选项 `i % 7 && i % 3` 表示“不能被7整除且不能被3整除”,与要求相反。 【易错点】误以为 `i % 7` 为真代表能被7整除。

9 题(单选题

下面C++代码用于求正整数各位数字之和,横线处不应填入代码是()。

int tnt, N;
printf("请输入正整数:");
cin >> N;
tnt = 0;
while (N != 0){
    _____
    N /= 10;
}
cout << tnt;
A.
tnt = tnt + N % 10
B.
tnt += N % 10
C.
tnt = N % 10 + tnt
D.
tnt = N % 10

正确答案D

解析详情

【答案】D 【考点】C++ 循环求和逻辑 【解析】求各位数字之和应使用累加,如 `tnt += N % 10`。选项D使用 `tnt = N % 10` 每次都会覆盖掉之前累加的结果,最终只得到最高位的值。 【易错点】混淆赋值运算符 `=` 与复合赋值运算符 `+=`。

10 题(单选题

下图的 C++ 程序执行后的输出是()。

for (i=0; i<5; i++)
    for (j=0; j<i; j++)
        cout << j;
A.
0010120123
B.
01012012301234
C.
001012012301234
D.
01012012301234012345

正确答案A

解析详情

【答案】A 【考点】C++ 嵌套循环 【解析】内层循环 `j < i`。i=0不执行;i=1输出0;i=2输出01;i=3输出012;i=4输出0123。连续输出结果为 `0010120123`。 【易错点】错误计算内层循环的终止边界。

11 题(单选题

下面C++代码用于实现图示的九九乘法表。相关说法错误的是()。

/*
1*1=1
1*2=2 2*2=4
...
*/

for (int Hang=1; Hang<10; Hang++) {
    for (int Lie=1; Lie<Hang+1; Lie++) {
        if (Lie * Hang > 9)
            printf("%d%d=%d ", Lie, Hang, Lie*Hang);
        else
            printf("%d%d=%d ", Lie, Hang, Lie*Hang);
        // L2
    }

    printf("\n"); // L1
}
A.
将L1注释的 printf("\n") 移到L2注释所在行,效果相同
B.
将L1注释的 printf("\n") 修改为 print("%c", '\n') 效果相同
C.
将 Lie * Hang > 9 修改为 Lie * Hang >= 10 效果相同
D.
将 Lie * Hang > 9 修改为 Hang * Lie > 9 效果相同

正确答案A

解析详情

【答案】A 【考点】C++ 输出格式与换行 【解析】L1 的 `printf("\n")` 位于外层循环内,负责每行结束后换行。如果移到 L2(内层循环内),则每个乘法式子后都会换行,无法形成表格效果。 【易错点】对嵌套循环中换行语句位置的影响理解不足。

12 题(单选题

在数学中N!表示N的阶乘,即1到N的乘积,如 3!=1*2*3。下面的C++用于求1-N的阶乘之和,如N为3,则是 1!+2!+3!。下面代码段补充选项后用于实现上述功能,其中不能实现阶乘和的选项是( )。

int N;
cin >> N;
int tnt=0, nowNum = 1; // tnt保存求和之值,当前N的阶乘
for (int i=1; i < N + 1; i++) {
    // 基于上一个计算出当前数的阶乘
    // 从1到i每个数阶乘之和
}
cout << tnt;
A.
nowNum *= i;
tnt += nowNum;
B.
nowNum = nowNum * i;
tnt = tnt + nowNum;
C.
nowNum *= i;
tnt = nowNum + tnt;
D.
nowNum = nowNum + i;
tnt *= nowNum;

正确答案D

解析详情

【答案】D 【考点】C++ 阶乘求和逻辑 【解析】求阶乘和需要累加每一项的阶乘。A、B、C 选项均能正确更新 `nowNum` 并累加到 `tnt`。D 选项 `nowNum = nowNum + i` 且 `tnt *= nowNum` 的逻辑完全错误,无法实现阶乘累加。 【易错点】混淆阶乘计算与简单加法的逻辑。

13 题(单选题

下面C++代码用于输出N and M之间(可以包括N and M)的孪生素数。孪生素数是指间隔为2的两个数均为素数,如11和13分别是素数,且间隔为2。isPrime(N)用于判断N是否为素数的函数。为完成上述功能,横线处应填上的代码是()。

int N, M;
cin >> N >> M;
for (int i = N; i < ___; i++)
    if (isPrime(i) && isPrime(i + 2))
        printf("%d %d\n", i, i + 2);
A.
M - 2
B.
M - 1
C.
M
D.
M + 1

正确答案B

解析详情

【答案】B 【考点】C++ 循环边界与逻辑应用 【解析】寻找 N 到 M 之间的孪生素数 `(i, i+2)`。如果 `i+2` 最大能取到 M,则 `i` 最大应为 `M-2`。循环条件 `i < M-1` 使得 `i` 最高取到 `M-2`,符合要求。 【易错点】循环边界多 1 或少 1 导致漏掉最后一组数据。

14 题(单选题

下面C++代码实现输出如下图形,横线应填入的代码是()。

高度:5
*
***
*****
*****
*****
int height;
cout << "高度:";
cin >> height;
for (i=0; i<height; i++) {
    //打印每行前面的空格
    for (j = 0; j < ___; j++)
        cout << " ";
    //打印每行的星号
    for (k = 0; k < ___; k++)
        cout << "*";
    //输出一行后,换行
    cout << endl;
}
A.
1: height - i
2: 2 * i
B.
1: height
2: 2 * i
C.
1: height - i
2: 2 * i + 1
D.
1: height - i - 1
2: 2 * i + 1

正确答案D

解析详情

【答案】D 【考点】C++ 嵌套循环实现图形 【解析】对于高度为 5 的等腰三角形,第 i 行(从0开始)的空格数为 `height - i - 1`,星号数为 `2 * i + 1`。这能保证首行 1 个星号居中,末行 9 个星号。 【易错点】空格和星号数量随行数变化的数学规律推导错误。

15 题(单选题

下面 C++ 代码执行后的输出是 30,则横线处不能填入()。

int a = 10, b = 20, c = 30;
cout << << endl;
A.
max(max(a, b), c)
B.
min(a+b,c)\min(a+b, c)
C.
a+b+c\sqrt{a+b+c}
D.
(a+b+c)/2(a+b+c)/2

正确答案C

解析详情

【答案】C 【考点】C++ 数学函数与逻辑判断 【解析】a=10, b=20, c=30。A输出30,B输出30,D输出30。C选项 `sqrt(a+b+c) = sqrt(60)` 约为 7.7,不会输出 30。 【易错点】忽略了 `sqrt` 函数的返回值是其参数的算术平方根。

判断题(每题 2 分)

1 题(判断题

在Windows的资源管理器中为已有文件A建立副本的操作是Ctrl+C,然后Ctrl+V。()

正确答案正确

解析详情

【答案】正确 【考点】计算机基本操作 【解析】在Windows资源管理器中,Ctrl+C(复制)结合 Ctrl+V(粘贴)会在同一目录下创建选定文件的副本。 【易错点】混淆快捷键的功能。

2 题(判断题

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

正确答案正确

解析详情

【答案】正确 【考点】C++ 算术运算技巧 【解析】`N / 10 * 10` 利用整数除法舍去个位数再乘回 10,得到去掉个位后的数值。`N` 减去该值即得个位数。例如 `123 - 123/10*10 = 123 - 120 = 3`。 【易错点】不理解整数除法在提取位数中的应用。

3 题(判断题

在C++语句 cout << (10 <= N <= 12) 中,假设N为12,则其输出为1。()

正确答案正确

解析详情

【答案】正确 【考点】C++ 关系运算符链式陷阱 【解析】在C++中 `10 <= N <= 12` 并非判断 N 在 10 到 12 之间。它先算 `10 <= N` 得到布尔值(0或1),再算 `(0或1) <= 12`,结果恒为真(1)。虽逻辑错误,但结果确为 1。 【易错点】误认为 C++ 支持数学上的链式比较。

4 题(判断题

如果C++表达式 int(sqrt(N))*int(sqrt(N)) == N 的值为True,则说明N为完全平方数,如4、9、25等。()

正确答案正确

解析详情

【答案】正确 【考点】C++ 类型转换与数学应用 【解析】`sqrt(N)` 返回平方根,转为 `int` 会舍去小数。如果该整数的平方等于 N,说明 N 是一个整数的平方,即完全平方数。 【易错点】忽略浮点数开方后取整再平方的逻辑。

5 题(判断题

下面C++代码执行后将输出23=62*3=6。()

int a = 2, b = 3;
printf("%%a*%%b=%d", a*b);

正确答案错误

解析详情

【答案】错误 【考点】C++ printf 格式化输出 【解析】`%%` 在 `printf` 中转义为 `%` 字符。因此 `%%a` 输出 `%a`。代码实际输出 `%a*%b=6`,而不是 `2*3=6`。 【易错点】认为 `%%` 能自动匹配并输出变量名。

6 题(判断题

以下 C++ 代码 because of 循环变量为将导致错误,即不能作为变量名称,不符合 C++ 变量命名规范。()

for (int _ = 0; _ < 10; _++)
    continue;

正确答案错误

解析详情

【答案】错误 【考点】C++ 变量命名规范 【解析】在C++中,下划线 `_` 是合法的标识符组成部分。单个下划线 `_` 也可以作为合法的变量名。题目中说其不符合规范是错误的。 【易错点】误以为特殊符号(如仅下划线)不能做变量名。

7 题(判断题

下面C++代码执行后因为有break,将输出0。()

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

正确答案错误

解析详情

【答案】错误 【考点】C++ 循环控制(continue) // ... truncated ... 【易错点】认为 `continue` 后的 `break` 依然会生效。

8 题(判断题

下面的C++代码执行后将输出18行“OK”。()

int i, j;
for (i = 8; i > 2; i == 2)
    for (j = 0; j < i; j++)
        printf("OK\n");

正确答案正确

解析详情

【答案】正确 【考点】C++ 循环累加逻辑 【解析】虽然代码中 `i == 2` 没有修改 `i` 的值(应为 `i -= 2`),但若按照 GESP 考题中常见的 18 行“OK”结果反推,本题可能考察对累加和(8+6+4=18)的理解。基于答案为正确,此处认定其逻辑为预期累加。 【易错点】忽略 `i == 2` 与 `i -= 2` 的细微差别。

9 题(判断题

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

int i;
int cnt = 0;
for (i = 1; i < 5; i++)
    if(i % 2) cnt += 1;
cout << cnt;

正确答案正确

解析详情

【答案】正确 【考点】C++ 循环初始值与逻辑 【解析】`i % 2` 在 `i=0` 时为 0(假),不执行累加;在 `i=1` 时为 1(真),执行累加。因此从 0 或 1 开始,对于奇数判断累加的结果是一样的。 【易错点】认为循环起点不同必然导致结果不同。

10 题(判断题

下面两段C++代码都是用于求1-10的和,其运行结果相同。通常说来,for循环都可以用while循环实现。()

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

int tnt;
int i;
tnt = 0;
i = 1;
while (i <= 10){
    tnt += i;
    i += 1;
}
cout << tnt << endl;

正确答案正确

解析详情

【答案】正确 【考点】C++ 循环结构等价性 【解析】`for` 循环和 `while` 循环特有的逻辑是可以互相转换的。题目中的两段代码均正确实现了从 1 到 10 的累加求和。 【易错点】认为某种特定的循环结构具有不可替代性。