GESP 客观题评测系统

2023-06-Level-4

2023-06-Level-4

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

单选题(每题 2 分)

1 题(单选题

高级语言编写的程序需要经过以下()操作,可以生成在计算机上运行的可执行代码。

A.
编辑
B.
保存
C.
调试
D.
编译

正确答案D

解析详情

【答案】D

【考点】编译过程

【解析】高级语言编写的源代码需经过编译器翻译(编译)成机器语言,才能生成可执行文件并在计算机上运行。

【易错点】混淆编辑(编写代码)、调试(找错)与编译(生成目标代码)的概念。

2 题(单选题

排序算法是稳定的(Stable Sorting),就是指排序算法可以保证,在待排序数据中有两个相等记录的关键字 R 和 S(R 出现在 S 之前),在排序后的列表中 R 也一定在 S 前。下面关于排序稳定性的描述,正确的是()。

A.
冒泡排序是不稳定的。
B.
插入排序是不稳定的。
C.
选择排序是不稳定的。
D.
以上都不正确。

正确答案C

解析详情

【答案】C

【考点】排序稳定性

【解析】冒泡排序和插入排序通过相邻比较或有序插入保持相等元素的相对位置,是稳定的。选择排序在交换最小元素时可能跨越相等元素,导致不稳定。

【易错点】误认为所有简单排序都是稳定的。

3 题(单选题

下列关于 C++ 语言中指针的叙述,不正确的是()。

A.
指针变量中存储的是内存地址。
B.
定义指针变量时必须指定其指向的类型。
C.
指针变量只能指向基本类型变量,不能指向指针变量。
D.
指针变量指向的内存地址不一定能够合法访问。

正确答案C

解析详情

【答案】C

【考点】指针定义与类型

【解析】指针变量可以指向任何类型的数据,包括基本类型、结构体、类,以及其他指针变量(如指向指针的指针 `int** p`)。

【易错点】不理解多级指针的概念。

4 题(单选题

下列关于 C++ 语言中数组的叙述,不正确的是()。

A.
一维数组在内存中一定是连续存放的。
B.
二维数组是一维数组的一维数组。
C.
二维数组中的每个一维数组在内存中都是连续存放的。
D.
二维数组在内存中可以不是连续存放的。

正确答案D

解析详情

【答案】D

【考点】数组内存布局

【解析】在 C++ 中,数组(包括多维数组)在内存中都是按行优先原则连续存放的,每个元素紧随前一个元素。

【易错点】误认为二维数组是由多个独立的不连续的一维数组组成的。

5 题(单选题

下列关于 C++ 语言中函数的叙述,正确的是()。

A.
函数必须有名字。
B.
函数必须有参数。
C.
函数必须有返回值。
D.
函数定义必须写在函数调用前。

正确答案A

解析详情

【答案】A

【考点】函数定义规则

【解析】普通函数调用依赖其函数名。函数可以没有参数(void)、可以没有返回值(void)、定义可以放在调用后(需先声明)。

【易错点】混淆函数声明与定义的顺序要求。

6 题(单选题

下列关于 C++ 语言中变量的叙述,正确的是()。

A.
变量定义后可以直接使用。
B.
两个变量的变量名不能是相同的。
C.
两个变量的变量名可以相同,但它们的类型必须是不同的。
D.
两个变量的变量名可以相同,但它们的作用域必须是不同的。

正确答案D

解析详情

【答案】D

【考点】变量作用域与同名覆盖

【解析】在同一作用域内不允许同名变量,但在不同作用域(如全局与局部、嵌套块)中允许同名,此时局部变量会隐藏更广范围的同名变量。

【易错点】认为程序中任何地方变量名都必须唯一。

7 题(单选题

一个二维数组定义为 double array[3][10];,则这个二维数组占用内存的大小为()。

A.
30
B.
60
C.
120
D.
240

正确答案D

解析详情

【答案】D

【考点】数组内存计算

【解析】double 类型通常占 8 字节。数组共有 3 * 10 = 30 个元素。总大小 = 30 * 8 = 240 字节。

【易错点】忘记乘数据类型的字节数(double 占 8 字节)。

8 题(单选题

一个变量定义为 int *p =多大,则下列说法正确的是()。

A.
该指针变量的类型为 int。
B.
该指针变量指向的类型为 int。
C.
该指针变量指向的内存地址是随机的。
D.
访问该指针变量指向的内存会出现编译错误。

正确答案B

解析详情

【答案】B

【考点】指针类型定义

【解析】定义 `int *p` 时,`*` 修饰 `p` 表示其为指针,`int` 表示该指针指向的内存区域存储的数据类型是 int。指针本身的类型是 `int*`。

【易错点】混淆“指针的类型”和“指针指向的类型”。

9 题(单选题

一个二维数组定义为 int array[5][3]; 则 array[1][2] 和 array[2][1] 在内存中的位置相差多少字节?()

A.
2 字节。
B.
4 字节。
C.
8 字节。
D.
无法确定。

正确答案C

解析详情

【答案】C

【考点】二维数组下标寻址

【解析】array[i][j] 的地址公式为:首地址 + (i*列数 + j) * sizeof(int)。array[1][2] 的序号是 1*3+2=5,array[2][1] 的序号是 2*3+1=7。序号差为 2,字节差为 2 * 4 = 8 字节。

【易错点】行列计算错误,漏算每行有 3 个元素。

10 题(单选题

如果 a 为 int 类型的变量,且 a 的值为 6,则执行 a &= 3; 之后,a 的值会是()。

A.
3
B.
9
C.
2
D.
7

正确答案C

解析详情

【答案】C

【考点】按位与运算

【解析】6 的二进制是 110,3 的二进制是 011。执行按位与运算:110 & 011 = 010,转换为十进制即为 2。

【易错点】将按位与运算与逻辑与(&&)或算术运算混淆。

11 题(单选题

一个数组定义为 int a[5] = {1, 2, 3, 4, 5}; 一个指针 definition 为 int *p = &a[2]; 则执行 a[1] = *p; 后,数组 a 中的值会变为( )。

A.
{1, 3, 3, 4, 5}
B.
{2, 2, 3, 4, 5}
C.
{1, 2, 2, 4, 5}
D.
{1, 2, 3, 4, 5}

正确答案A

解析详情

【答案】A

【考点】指针引用与数组赋值

【解析】p 指向 a[2],即 `*p` 的值为 3。执行 `a[1] = *p` 后,数组第二个元素(下标 1)被修改为 3。原数组由 {1, 2, 3, 4, 5} 变为 {1, 3, 3, 4, 5}。

【易错点】混淆数组下标(从 0 开始)和元素位置。

12 题(单选题

以下哪个函数声明在调用时可以传递二维数组的名字作为参数?( )

A.
void BubbleSort(int a[][4]);
B.
void BubbleSort(int a[3][]);
C.
void BubbleSort(int a[][]);
D.
void BubbleSort(int ** a);

正确答案A

解析详情

【答案】A

【考点】二维数组作函数参数

【解析】二维数组作为函数参数时,第一维大小可以省略,但第二维(及更高维)的大小必须明确给出,以便编译器计算寻址偏移量。

【易错点】认为所有维度都可以省略或都必须给出。

13 题(单选题

在下列代码的横线处填写( ),可以使得输出是 “20 10”。

int x;

A.
int x, int y
B.
int *x, int *y
C.
int a, int b
D.
int & a, int & b

正确答案B

解析详情

【答案】B

【考点】指针与地址传递

【解析】要实现交换两个变量的值并在函数外生效,通常需要传递指针。根据选项,B 提供了指针定义,符合传址调用实现值交换的逻辑。

【易错点】传值调用无法修改主调函数中变量的值。

14 题(单选题

执行以下 C++ 语言程序后,输出结果是()。

#include <iostream>
using namespace std;
int main() {
    int array[3][3];
    for (int i = 0; i < 3; i++)
        for (int j = 0; j < 3; j++)
            array[i][j] = i * 10 + j;
    int sum;
    for (int i = 0; i < 3; i++)
        sum += array[i][i];
    cout << sum << endl;
    return 0;
}
A.
3
B.
30
C.
33
D.
无法确定。

正确答案D

解析详情

【答案】D

【考点】局部变量初始化

【解析】在 main 函数中定义的局部变量 sum 没有初始值,其内存中存放的是随机的残留数据。未初始化即进行 `sum += ...` 操作,结果不可预知。

【易错点】认为局部变量会自动初始化为 0(只有全局变量和静态变量会自动清零)。

15 题(单选题

在下列代码的横线处填写( ),完成对有 n 个 int 类型元素的数组 array 由小到大排序。

void SelectionSort(int array[], int n) {
    int i, j, min, temp;
    for (i = 0; i < n - 1; i++) {
        min = i;
        for (j = i + 1; j < n; j++)
            if (____)
                min = j;
            temp = array[min];
            array[min] = array[i];
            array[i] = temp;
    }
}
A.
array[min] > array[j]
B.
array[min] > array[i]
C.
min > array[j]
D.
min > array[i]

正确答案A

解析详情

【答案】A

【考点】选择排序算法

【解析】选择排序通过不断寻找当前未排序部分的最小值来排序。如果发现 `array[j]` 比当前记录的最小值 `array[min]` 还要小,则更新最小值下标 `min` 为 `j`。

【易错点】逻辑判断方向写反(写成小于号将变成从大到小排序)。

判断题(每题 2 分)

1 题(判断题

域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称,CCF编程能力等级认证官方网站的域名是 gesp.ccf.org.cn,其中顶级域名是 gesp。

正确答案错误

解析详情

【答案】错误

【考点】域名体系结构

【解析】域名是从右向左逐级定义的。在 gesp.ccf.org.cn 中,顶级域名是 cn,ccf 和 org 是子域名,gesp 是更低级的域名。

【易错点】误以为域名最左侧的部分是顶级域名。

2 题(判断题

数列 1, 1, 2, 3, 5, 8 ... 是以意大利数学家列昂纳多·斐波那契命名的数列,从第三个数开始,每个数是前面两项之和。如果计算该数列的第 n 项(其中 n>3) fib(n),我们采用如下方法:① 令 fib(1)=fib(2)=1 ② 用循环 for i=3 to n 分别计算 f(i) ③ 输出 fib(n)。这体现了递推的编程思想。

正确答案正确

解析详情

【答案】正确

【考点】递推思想

【解析】递推是从已知的初始条件出发,利用确定的数学关系逐步推出后续项。斐波那契数列的循环求法正是典型的递推实现。

【易错点】混淆递推(自底向上循环)与递归(自顶向下函数嵌套)。

3 题(判断题

在 C++ 语言中,函数的参数默认以引用传递方式进行传递。

正确答案错误

解析详情

【答案】错误

【考点】参数传递方式

【解析】C++ 函数参数默认是“值传递”,即对实参进行拷贝。只有显式使用 `&` 符号时才是引用传递。

【易错点】认为所有现代语言都默认引用传递。

4 题(判断题

在 C++语言中,可以定义四维数组,但在解决实际问题时不可能用到,因为世界是三维的。

正确答案错误

解析详情

【答案】错误

【考点】多维数组应用

【解析】C++ 理论上支持任意维度的数组。在处理包含时间维、属性维或复杂物理模拟的数据时,四维及以上数组非常常见,不局限于空间维度。

【易错点】思维局限于物理空间维度,忽略了数据抽象。

5 题(判断题

在 C++ 语言中,一个函数没有被调用时,它的参数不占用内存。

正确答案正确

解析详情

【答案】正确

【考点】局部变量生命周期

【解析】普通函数的形参属于局部变量,只有在函数被调用时,程序才会为该函数分配栈帧并分配参数空间。

【易错点】误以为函数定义时就分配了所有变量空间。

6 题(判断题

在 C++语言中,如果一个函数可能抛出异常,那么一定要在 try 子句里调用这个函数。

正确答案错误

解析详情

【答案】错误

【考点】异常处理机制

【解析】C++ 不强制捕获异常。如果不在 try 块中处理,异常会逐层抛出直到被捕获或导致程序终止。

【易错点】混淆 C++ 与某些强制检查异常(Checked Exception)的语言。

7 题(判断题

如果希望记录 10 个最长为 99 字节的字符串,可以将字符串数组定义为 char s[100][10];。

正确答案错误

解析详情

【答案】错误

【考点】二维数组定义

【解析】`char s[100][10]` 定义的是 100 个长度为 10 的字符串。题干要求 10 个长度能容纳 99 字节的字符串,应定义为 `char s[10][100]`。

【易错点】混淆二维数组的行标和列标含义。

8 题(判断题

字符常量'0'和'\0'是等价的。

正确答案错误

解析详情

【答案】错误

【考点】字符常量与 ASCII 码

【解析】'0' 是字符零,对应 ASCII 码 48;'\0' 是空字符,常作字符串结束符,对应 ASCII 码 0。

【易错点】混淆零值字符和数值零。

9 题(判断题

>=和>>=都是 C++语言的运算符。

正确答案正确

解析详情

【答案】正确

【考点】运算符识别

【解析】`>=` 是关系运算符(大于等于),`>>=` 是复合位运算符(右移并赋值)。两者均为合法 C++ 运算符。

【易错点】对位运算相关的复合运算符不熟悉。

10 题(判断题

由于文件重定向操作, 程序员在使用 C++ 语言编写程序时无法确定通过 cout 输出的内容是否会被输出到屏幕上。

正确答案正确

解析详情

【答案】正确

【考点】标准流重定向

【解析】程序使用 `cout` 输出到标准输出流,系统环境可以决定将该流导向屏幕、文件或管道。程序代码本身通常不感知这种外部重定向。

【易错点】认为 `cout` 只能输出到屏幕。