信奥刷题站
GESP 认证 4级2025-09

2025年9月 GESP C++ 4级

题量
27 题
客观题
25 题
建议时长
60 分钟
卷面总分
100 分

2025年9月 GESP C++ 4级认证考试真题(含编程操作题部分)

开始整卷模拟计时作答 · 交卷即时判分 · 错题自动进错题本(需登录)2 道编程大题:在线只判客观题,编程题请自行前往洛谷等 OJ 提交验证

// questions

题目预览

1
单选题2

运行下面程序后变量 aaa 的值是( )。

int a = 42;
int* p = &a;
*p = *p + 1;
A

424242

B

434343

C

编译错误

D

不确定

2
单选题2

以下关于数组的描述中,( )是错误的。

A

数组名是一个指针常量

B

随机访问数组的元素方便快捷

C

数组可以像指针一样进行自增操作

D

sizeof(arr) 返回的是整个数组 arr 占用的字节数

3
单选题2

给定如下定义的数组 arr,则 *(*(arr + 1) + 2) 的值是( )。

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
A

222

B

555

C

444

D

666

4
单选题2

下面这段代码会输出( )。

int add(int a, int b = 1); // 函数声明
int main() {
    cout << add(2) << " " << add(2, 3);
    return 0;
}
int add(int a, int b) { // 函数定义
    return a + b;
}
A

333 555

B

编译失败:定义处少了默认参数

C

运行错误

D

链接失败:未定义引用

5
单选题2

下面这段代码会输出( )。

int x = 5;
void foo() {
    int x = 10;
    cout << x << " ";
}
void bar() {
    cout << x << " ";
}
int main() {
    foo();
    bar();
}
A

555 555

B

101010 101010

C

555 101010

D

101010 555

6
单选题2

下面程序运行的结果是( )。

void increaseA(int x) {
    x++;
}
void increaseB(int* p) {
    (*p)++;
}
int main() {
    int a = 5;
    increaseA(a);
    cout << a << " ";
    increaseB(&a);
    cout << a;
}
A

666 777

B

666 666

C

555 666

D

555 555

7
单选题2

关于结构体初始化,以下哪个选项中正确的是( )。

struct Point {int x,y;};
A

Point p = (1,2);

B

Point p = {1,2};

C

Point p = new {1,2};

D

Point p = <1,2>;

8
单选题2

运行如下代码会输出( )。

struct Cat {
    string name;
    int age;
};
void birthday(Cat& c) {
    c.age++;
}
int main() {
    Cat kitty{"Mimi", 2};
    birthday(kitty);
    cout << kitty.name << " " << kitty.age;
}
A

Mimi 2

B

Mimi 3

C

kitty 3

D

kitty 2

9
单选题2

关于排序算法的稳定性,以下说法错误的是( )。

A

稳定的排序算法不改变相等元素的相对位置

B

冒泡排序是稳定的排序算法

C

选择排序是稳定的排序算法

D

插入排序是稳定的排序算法

10
单选题2

下面代码试图实现选择排序,使其能对数组 numsnumsnums 排序为升序,则横线上应分别填写( )。

void selectionSort(vector<int>& nums) {
    int n = nums.size();
    for (int i = 0; i < n - 1; ++i) {
        int minIndex = i;
        for (int j = i + 1; j < n; ++j) {
            if ( __________ ) { // 在此处填入代码
                minIndex = j;
            }
        }
        ____________________; // 在此处填入代码
    }
}
A
nums[j] < nums[minIndex]
swap(nums[i], nums[minIndex])
B
nums[j] > nums[minIndex]
swap(nums[i], nums[minIndex])
C
nums[j] <= nums[minIndex]
swap(nums[j], nums[minIndex])
D
nums[j] <= nums[minIndex]
swap(nums[i], nums[j])
11
单选题2

下面程序实现插入排序(升序排序),则横线上应分别填写( )。

void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && ____________________) { // 在此处填入代码
            arr[j + 1] = arr[j];
            j--;
        }
        ____________________; // 在此处填入代码
    }
}
A
arr[j] > key
arr[j + 1] = key
B
arr[j] < key
arr[j + 1] = key
C
arr[j] > key
arr[j] = key
D
arr[j] < key
arr[j] = key
12
单选题2

关于插入排序的时间复杂度,下列说法正确的是( )。

A

最好情况和最坏情况的时间复杂度都是 O(n2)O(n^2)O(n2)

B

最好情况是 O(n)O(n)O(n) ,最坏情况是 O(n2)O(n^2)O(n2)

C

最好情况是 O(nlog⁡n)O(n \log n)O(nlogn) ,最坏情况是 O(n2)O(n^2)O(n2)

D

最好情况是 O(n)O(n)O(n) ,最坏情况是 O(nlog⁡n)O(n \log n)O(nlogn)

13
单选题2

小杨正在爬楼梯,需要 nnn 阶才能到达楼顶,每次可以爬 111 阶或 222 阶,求小杨有多少种不同的方法可以爬到楼顶,横线上应填写( )。

int climbStairs(int n) {
    if (n <= 2) return n;
    int prev2 = 1;
    int prev1 = 2;
    int current = 0;
    for (int i = 3; i <= n; ++i) {
        ________________ // 在此处填入代码
    }
    return current;
}
A
prev2 = prev1;
prev1 = current;
current = prev1 + prev2;
B
current = prev1 + prev2;
prev2 = prev1;
prev1 = current;
C
current = prev1 + prev2;
prev1 = current;
prev2 = prev1;
D
prev1 = current;
prev2 = prev1;
current = prev1 + prev2;
14
单选题2

假设有一个班级的成绩单,存储在一个长度为 nnn 的数组 scores 中,每个元素是一个学生的分数。老师想要找出所有满足 scores[i] + scores[j] + scores[k] == 300 的三元组,其中 i<j<ki < j < ki<j<k。下面代码实现该功能,请问其时间复杂度是( )。

int cnt = 0;
for (int i = 0; i < n; i++) {
    for (int j = i + 1; j < n; j++) {
        for (int k = j + 1; k < n; k++) {
            if (scores[i] + scores[j] + scores[k] == 300) {
                cnt++;
            }
        }
    }
}
A
B
C
D
15
单选题2

关于异常处理,以下说法错误的是( )。

A

try 块中的代码可能会抛出异常

B

catch 块可以有多个,处理不同类型的异常

C

throw 语句用于抛出异常

D

所有异常都必须被捕获,否则程序会崩溃

16
判断题2

以下代码能正确初始化指针。

int a = 5;
int *p = a;
17
判断题2

执行下面 C++ 代码将输出 111111

int x = 10;
void f() {
    int x = x + 1;
    cout << x << endl;
}
int main() {
    f();
}
18
判断题2

以下 C++ 代码合法。

struct Student {
    string name;
    int age;
    float score;
};
Student* students = new Student[20];
19
判断题2

执行下面 C++ 代码将输出 101010

void func(int* p) {
    *p = 10;
}
int main() {
    int a = 5;
    func(&a);
    cout << a << endl;
    return 0;
}
20
判断题2

下面代码将二维数组 arr 传递给函数 f,函数内部用 arr[i][j] 访问元素,函数参数声明为 int arr[][4] 是错误的。

void f(int arr[][4], int rows) {
    // 访问 arr[i][j]
}
int main() {
    int arr[3][4] = { /* 初始化 */ };
    f(arr, 3);
}
21
判断题2

递推是在给定初始条件下,已知前一项(或前几项)求后一项的过程。

22
判断题2

虽然插入排序的时间复杂度为 O(n2)O(n^2)O(n2),但由于单元操作相对较少,因此在小数据量的排序任务中非常受欢迎。

23
判断题2

对整数数组 {444, 111, 333, 111, 555, 222} 进行冒泡排序(将最大元素放到最后),执行一轮之后是 {444, 111, 333, 111, 222, 555}。

24
判断题2

以下代码只能捕获 int 类型异常。

int main() {
    try {
        throw 42;
    } catch (...) {
        cout << "Caught" << endl;
    }
    return 0;
}
25
判断题2

以下代码将 Hello 写入文件 data.txt。

ofstream file("data.txt");
cout << "Hello" << endl;
file.close();
GESP 编程操作题
26
编程题25

试题名称:排兵布阵

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

作为将军,你自然需要合理地排兵布阵。地图可以视为 nnnmmm 列的网格,适合排兵的网格以 1 标注,不适合排兵的网格以 0 标注。现在你需要在地图上选择一个矩形区域排兵,这个矩形区域内不能包含不适合排兵的网格。请问可选择的矩形区域最多能包含多少网格?

输入格式

第一行,两个正整数 n,mn, mn,m,分别表示地图网格的行数与列数。

接下来 nnn 行,每行 mmm 个整数 ai,1,ai,2,…,ai,ma_{i,1}, a_{i,2}, \ldots, a_{i,m}ai,1,ai,2,,ai,m,表示各行中的网格是否适合排兵。

输出格式

一行,一个整数,表示适合排兵的矩形区域包含的最大网格数。

样例输入 #1

4 3
0 1 1
1 0 1
0 1 1
1 1 1

样例输出 #1

4

样例输入 #2

3 5
1 0 1 0 1
0 1 0 1 0
0 1 1 1 0

样例输出 #2

3

说明/提示

对于所有测试点,保证 1≤n,m≤121 \leq n, m \leq 121n,m120≤ai,j≤10 \leq a_{i,j} \leq 10ai,j1

本题为编程大题:请复制题面到洛谷 / GESP OJ 等平台编写并提交代码(本站不判分)
27
编程题25

试题名称:最长连续段

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

对于 kkk 个整数构成的数组 [b1,b2,…,bk][b_1, b_2, \ldots, b_k][b1,b2,,bk],如果对 1≤i<k1 \leq i < k1i<k 都有 bi+1=bi+1b_{i+1} = b_i + 1bi+1=bi+1,那么称数组 bbb 是一个连续段。

给定由 nnn 个整数构成的数组 [a1,a2,…,an][a_1, a_2, \ldots, a_n][a1,a2,,an],你可以任意重排数组 aaa 中元素顺序。请问在重排顺序之后,aaa 所有是连续段的子数组中,最长的子数组长度是多少?

例如,对于数组 [1,0,2,4][1, 0, 2, 4][1,0,2,4],可以将其重排为 [4,0,1,2][4, 0, 1, 2][4,0,1,2],有以下 101010 个子数组:

[4],[0],[1],[2],[4,0],[0,1],[1,2],[4,0,1],[0,1,2],[4,0,1,2][4], [0], [1], [2], [4, 0], [0, 1], [1, 2], [4, 0, 1], [0, 1, 2], [4, 0, 1, 2][4],[0],[1],[2],[4,0],[0,1],[1,2],[4,0,1],[0,1,2],[4,0,1,2]

其中除 [4,0],[4,0,1],[4,0,1,2][4, 0], [4, 0, 1], [4, 0, 1, 2][4,0],[4,0,1],[4,0,1,2] 以外的子数组均是连续段,因此是连续段的子数组中,最长子数组长度为 3。

输入格式

第一行,一个正整数 nnn,表示数组长度。

第二行,nnn 个整数 a1,a2,…,ana_1, a_2, \ldots, a_na1,a2,,an,表示数组中的整数。

输出格式

一行,一个整数,表示数组 aaa 重排顺序后,所有是连续段的子数组的最长长度。

样例输入 #1

4
1 0 2 4

样例输出 #1

3

样例输入 #2

9
9 9 8 2 4 4 3 5 3

样例输出 #2

4

说明/提示

对于 40%40\%40% 的测试点,保证 1≤n≤81 \leq n \leq 81n8

对于所有测试点,保证 1≤n≤1051 \leq n \leq 10^51n105−109≤ai≤109-10^9 \leq a_i \leq 10^9109ai109

本题为编程大题:请复制题面到洛谷 / GESP OJ 等平台编写并提交代码(本站不判分)