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

2025年3月 GESP C++ 4级

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

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

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

// questions

题目预览

1
单选题2

关于下述代码,说法错误的是( )。

int multiply(int x, int y);
int main() {
    int a = 4;
    int b = 5;
    int result = multiply(a, b);
    std::cout << "The result is: " << result << std::endl;
    return 0;
}
int multiply(int x, int y) {
    return x * y;
}
A

函数 multiply 的定义应该放到函数 main 之前。

B

函数声明 int multiply(int x, int y); 中明确指定了函数 multiply() 的返回值为整数类型。

C

main 函数中,函数 multiply 通过 multiply(a, b) 被调用,其中 aaabbb 是定义在 main 函数中的变量,它们作为实参传递给了 multiply 函数的形参 xxxyyy

D

运行上述代码,将输出 The result is: 20。

2
单选题2

执行下述代码将输出( )。

int x = 10;
void func() { int x = 20; std::cout << x; }
int main() {
    func();
    std::cout << x;
    return 0;
}
A

202020202020

B

201020102010

C

101010101010

D

编译错误

3
单选题2

执行下述代码后,变量 aaa 的值为( )。

int a = 10;
int* p = &a;
*p = 20;
A

101010

B

202020

C

随机值

D

编译错误

4
单选题2

以下哪种参数传递方式可以避免拷贝大型对象?

A

只能用值传递

B

只能用引用传递

C

只能用指针传递

D

引用传递和指针传递均可

5
单选题2

执行下述代码,将输出( )。

void swap(int a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}
int main() {
    int x = 1, y = 2;
    swap(x, y);
    std::cout << x << y;
    return 0;
}
A

12

B

21

C

22

D

11

6
单选题2

下面的描述中,( )正确定义一个名为 Person 的结构体并正确初始化了一个 Person 结构体的变量 ppp

A
struct Person {
    string name;
    int age;
};
Person p("Yang", 10);
B
struct Person {
    string name,
    int age;
};
Person p;
p.name = "Yang";
p.age = 10;
C
struct Person {
    string name;
    int age;
};
Person p = { "Yang", 10 };
D
struct Person {
    string name;
    int age;
};
Person p = new Person("Yang", 10);
7
单选题2

给定如下代码,

struct Person {
    std::string name;
    int age;
    struct Address {
        std::string street;
        std::string city;
    };
    Address address;
};

下面描述错误的是( )。

A

结构 Person 内嵌套结构 Address

B

Person 有一个 Address 类型的 address 成员

C

一个 Person 类型的变量 pppaddress 的初始化可以写成:p.address.street = "123 Main St"; p.address.city = "Anytown";

D

结构的嵌套可以减少命名冲突,因此可以不必控制嵌套层次

8
单选题2

假设 int arr[2][3] = {{1,2,3},{4,5,6}};,则 arr[1][2] 的值是( )。

A

222

B

333

C

555

D

666

9
单选题2

下面( )正确定义了二维数组。

A

int arr[3,4];

B

int arr[3][4];

C

int arr(3,4);

D

int a[3-4];

10
单选题2

小杨正在爬楼梯,需要爬 nnn 阶才能到达楼顶。如果每次可以爬 111 个或 222 个台阶,下面代码采用递推算法来计算一共有多少种不同的方法可以爬到楼顶,则横线上应填写( )。

int f(int n) {
    if (n == 1 || n == 2)
        return n;
    int f1 = 1;
    int f2 = 2;
    int res = 0;
    for (int i = 3; i <= n; i++) {
        ________________________________ // 在此处填入代码
    }
    return res;
}
A
res += f1 + f2;
f1 = f2;
f2 = res;
B
res = f1 + f2;
f1 = f2;
f2 = res;
C
res += f1 + f2;
f2 = res;
f1 = f2;
D
res = f1 + f2;
f2 = res;
f1 = f2;
11
单选题2

给定如下算法,其时间复杂度为( )。

bool f(int arr[], int n, int target) {
    for (int i = 0; i < (1 << n); i++) {
        int sum = 0;
        for (int j = 0; j < n; j++) {
            if (i & (1 << j)) {
                sum += arr[j];
            }
        }
        if (sum == target) return true;
    }
    return false;
}
A
B
C
D
12
单选题2

下面关于排序稳定性的描述,正确的是( )。

A

稳定性指算法的时间复杂度恒定

B

稳定排序保证相同元素的相对顺序不变

C

选择排序是稳定排序

D

插入排序不是稳定排序

13
单选题2

对数组 arr[] = {5, 3, 8, 1} 进行升序排序,执行第一轮冒泡排序后数组 arr 中的内容为( )。

A

3, 5, 1, 8

B

3, 1, 5, 8

C

3, 5, 8, 1

D

5, 3, 8, 1

14
单选题2

运行下面的代码,将出现( )。

double hmean(double a, double b) {
    if (a == -b)
        throw runtime_error("Runtime error occurred.");
    return 2.0 * a * b / (a + b);
}
int main() {
    double x = 10;
    double y = -10;
    try {
        int result = hmean(x, y);
        cout << "hmean: " << result << endl;
    }
    catch (const runtime_error& e) {
        cout << "Caught: " << e.what() << endl;
    } catch (...) {
        cout << "Caught an unknown exception." << endl;
    }
    return 0;
}
A

屏幕上输出 Caught: Runtime error occurred.

B

屏幕上输出 Caught an unknown exception.

C

程序调用 std::terminate()

D

编译错误

15
单选题2

下面哪种方式不能实现将字符串 "Happy Spring!" 输出重定向到文件 log.txt( )。

A
freopen("log.txt", "w", stdout);
cout << "Happy Spring!" << endl;
fclose(stdout);
B
std::ofstream outFile("log.txt");
outFile << "Happy Spring!" << endl;
outFile.close();
C
std::ofstream outFile("log.txt");
cout << "Happy Spring!" << endl;
outFile.close();
D
ofstream log_file("log.txt");
streambuf* org_cout = cout.rdbuf();
cout.rdbuf(log_file.rdbuf());
cout << "Happy Spring!" << endl;
cout.rdbuf(org_cout);
16
判断题2

函数是 C++ 中的核心概念,用于封装可重用的代码块。

17
判断题2

在 C++ 中,函数的返回类型可以省略,默认为 int

18
判断题2

结构体的成员默认是 public 访问权限。

19
判断题2

假设整数数组 arr[4] = {0, 1, 2, 3}; 的第一个元素在内存中的地址为 0x7ffee4065820,经过 int* p = arr; p += 1; 后,指针 p 的值是 111

20
判断题2

二维数组作为函数参数时,必须显式指定所有维度的大小。

21
判断题2

递推是一种通过已知的初始值和递推公式,逐步求解目标值的算法。

22
判断题2

考虑最坏情况下冒泡排序算法的时间复杂度,nnn 为待排序数字的数目,则其递推关系式为 T(n)=T(n−1)+(n−1)T(n) = T(n-1) + (n-1)T(n)=T(n1)+(n1)T(1)=0T(1) = 0T(1)=0

23
判断题2

插入排序在最好情况(已有序)下的时间复杂度是 O(n)O(n)O(n)

24
判断题2

对数组 arr[]={4, 3, 1, 5, 2} 进行升序排序,执行第一轮选择排序后数组 arr 中的内容是 {1, 4, 3, 5, 2}

25
判断题2

未捕获异常会调用 std::terminate 终止程序。

GESP 编程操作题
26
编程题25

试题名称:荒地开垦

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

题目描述

小杨有一大片荒地,可以表示为一个 nnnmmm 列的网格图。

小杨想要开垦这块荒地,但荒地中一些位置存在杂物,对于一块不存在杂物的荒地,该荒地可以开垦当且仅当其上下左右四个方向相邻的格子均不存在杂物。

小杨可以选择至多一个位置,清除该位置的杂物,移除杂物后该位置变为荒地。小杨想知道在清除至多一个位置的杂物的情况下,最多能够开垦多少块荒地。

输入格式

第一行包含两个正整数 n,mn, mn,m,含义如题面所示。

之后 nnn 行,每行包含一个长度为 mmm 且仅包含字符 .# 的字符串。如果为 .,代表该位置为荒地;如果为 #,代表该位置为杂物。

输出格式

输出一个整数,代表在清除至多一个位置的杂物的情况下,最多能够开垦的荒地块数。

样例输入 #1

3 5
.....
.#..#
.....

样例输出 #1

11

说明/提示

样例解释

移除第二行从左数第二块空地的杂物后:

.....
....#
.....

第一行从左数前 444 块荒地,第二行从左数前 333 块荒地,第三行从左数前 444 块荒地,均可开垦,4+3+4=114+3+4=114+3+4=11

数据范围

对于全部数据,有 1≤n,m≤10001\leq n,m\leq 10001n,m1000

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

试题名称:二阶矩阵

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

题目描述

小 A 有一个 nnnmmm 列的矩阵 AAA

小 A 认为一个 2×22 \times 22×2 的矩阵 DDD 是好的,当且仅当 D1,1×D2,2=D1,2×D2,1D_{1,1} \times D_{2,2} = D_{1,2} \times D_{2,1}D1,1×D2,2=D1,2×D2,1。其中 Di,jD_{i,j}Di,j 表示矩阵 DDD 的第 iii 行第 jjj 列的元素。

小 A 想知道 AAA 中有多少个好的子矩阵。

输入格式

第一行,两个正整数 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

输出格式

一行,一个整数,表示 AAA 中好的子矩阵的数量。

样例输入 #1

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

样例输出 #1

2

说明/提示

样例解释

样例中好的子矩阵如下:

数据范围

对于所有测试点,保证 1≤n≤5001\leq n\leq 5001n5001≤m≤5001\leq m\leq 5001m500−100≤Ai,j≤100-100\leq A_{i,j}\leq 100100Ai,j100

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