GESP 客观题评测系统

试卷解析 · 理解每一步

2023-06-Level-4

2023-06-Level-4

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

单选题

第 1 题(单选题,2 分)

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

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

正确答案D

解析详情
答案 D编译过程
思路与推导
  1. 高级语言编写的源代码需经过编译器翻译(编译)成机器语言,才能生成可执行文件并在计算机上运行。

第 2 题(单选题,2 分)

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

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

正确答案C

解析详情
答案 C排序稳定性
思路与推导
  1. 冒泡排序和插入排序通过相邻比较或有序插入保持相等元素的相对位置,是稳定的。选择排序在交换最小元素时可能跨越相等元素,导致不稳定。

第 3 题(单选题,2 分)

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

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

正确答案C

解析详情
答案 C指针定义与类型
思路与推导
  1. 指针变量可以指向任何类型的数据,包括基本类型、结构体、类,以及其他指针变量(如指向指针的指针 `int** p`)。

第 4 题(单选题,2 分)

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

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

正确答案D

解析详情
答案 D数组内存布局
思路与推导
  1. 在 C++ 中,数组(包括多维数组)在内存中都是按行优先原则连续存放的,每个元素紧随前一个元素。

第 5 题(单选题,2 分)

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

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

正确答案A

解析详情
答案 A函数定义规则
思路与推导
  1. 普通函数调用依赖其函数名。函数可以没有参数(void)、可以没有返回值(void)、定义可以放在调用后(需先声明)。

第 6 题(单选题,2 分)

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

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

正确答案D

解析详情
答案 D变量作用域与同名覆盖
思路与推导
  1. 在同一作用域内不允许同名变量,但在不同作用域(如全局与局部、嵌套块)中允许同名,此时局部变量会隐藏更广范围的同名变量。

第 7 题(单选题,2 分)

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

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

正确答案D

解析详情
答案 D数组内存计算
思路与推导
  1. double 类型通常占 8 字节。数组共有 3 * 10 = 30 个元素。总大小 = 30 * 8 = 240 字节。

第 8 题(单选题,2 分)

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

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

正确答案B

解析详情
答案 B指针类型定义
思路与推导
  1. 定义 `int *p` 时,`*` 修饰 `p` 表示其为指针,`int` 表示该指针指向的内存区域存储的数据类型是 int。指针本身的类型是 `int*`。

第 9 题(单选题,2 分)

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

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

正确答案C

解析详情
答案 C二维数组下标寻址
思路与推导
  1. 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 字节。

第 10 题(单选题,2 分)

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

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

正确答案C

解析详情
答案 C按位与运算
思路与推导
  1. 6 的二进制是 110,3 的二进制是 011。执行按位与运算:110 & 011 = 010,转换为十进制即为 2。

第 11 题(单选题,2 分)

一个数组定义为 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指针引用与数组赋值
思路与推导
  1. p 指向 a[2],即 `*p` 的值为 3。执行 `a[1] = *p` 后,数组第二个元素(下标 1)被修改为 3。原数组由 {1, 2, 3, 4, 5} 变为 {1, 3, 3, 4, 5}。

第 12 题(单选题,2 分)

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

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

正确答案A

解析详情
答案 A二维数组作函数参数
思路与推导
  1. 二维数组作为函数参数时,第一维大小可以省略,但第二维(及更高维)的大小必须明确给出,以便编译器计算寻址偏移量。

第 13 题(单选题,2 分)

在下列代码的横线处填写( ),可以使得输出是 “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指针与地址传递
思路与推导
  1. 要实现交换两个变量的值并在函数外生效,通常需要传递指针。根据选项,B 提供了指针定义,符合传址调用实现值交换的逻辑。

第 14 题(单选题,2 分)

执行以下 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局部变量初始化
思路与推导
  1. 在 main 函数中定义的局部变量 sum 没有初始值,其内存中存放的是随机的残留数据。未初始化即进行 `sum += ...` 操作,结果不可预知。

第 15 题(单选题,2 分)

在下列代码的横线处填写( ),完成对有 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选择排序算法
思路与推导
  1. 选择排序通过不断寻找当前未排序部分的最小值来排序。如果发现 `array[j]` 比当前记录的最小值 `array[min]` 还要小,则更新最小值下标 `min` 为 `j`。

判断题

第 1 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误域名体系结构
思路与推导
  1. 域名是从右向左逐级定义的。在 gesp.ccf.org.cn 中,顶级域名是 cn,ccf 和 org 是子域名,gesp 是更低级的域名。

第 2 题(判断题,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)。这体现了递推的编程思想。

正确答案正确

解析详情
答案 正确递推思想
思路与推导
  1. 递推是从已知的初始条件出发,利用确定的数学关系逐步推出后续项。斐波那契数列的循环求法正是典型的递推实现。

第 3 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误参数传递方式
思路与推导
  1. C++ 函数参数默认是“值传递”,即对实参进行拷贝。只有显式使用 `&` 符号时才是引用传递。

第 4 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误多维数组应用
思路与推导
  1. C++ 理论上支持任意维度的数组。在处理包含时间维、属性维或复杂物理模拟的数据时,四维及以上数组非常常见,不局限于空间维度。

第 5 题(判断题,2 分)

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

正确答案正确

解析详情
答案 正确局部变量生命周期
思路与推导
  1. 普通函数的形参属于局部变量,只有在函数被调用时,程序才会为该函数分配栈帧并分配参数空间。

第 6 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误异常处理机制
思路与推导
  1. C++ 不强制捕获异常。如果不在 try 块中处理,异常会逐层抛出直到被捕获或导致程序终止。

第 7 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误二维数组定义
思路与推导
  1. `char s[100][10]` 定义的是 100 个长度为 10 的字符串。题干要求 10 个长度能容纳 99 字节的字符串,应定义为 `char s[10][100]`。

第 8 题(判断题,2 分)

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

正确答案错误

解析详情
答案 错误字符常量与 ASCII 码
思路与推导
  1. '0' 是字符零,对应 ASCII 码 48;'\0' 是空字符,常作字符串结束符,对应 ASCII 码 0。

第 9 题(判断题,2 分)

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

正确答案正确

解析详情
答案 正确运算符识别
思路与推导
  1. `>=` 是关系运算符(大于等于),`>>=` 是复合位运算符(右移并赋值)。两者均为合法 C++ 运算符。

第 10 题(判断题,2 分)

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

正确答案正确

解析详情
答案 正确标准流重定向
思路与推导
  1. 程序使用 `cout` 输出到标准输出流,系统环境可以决定将该流导向屏幕、文件或管道。程序代码本身通常不感知这种外部重定向。