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

2026年3月 GESP C++ 4级

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

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

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

// questions

题目预览

1
单选题2

执行下面程序后,输出为( )。

int f(int x = 2){
    return x * 3;
}
int main(){
    cout << f() << " " << f(4);
}
A

222 121212

B

666 121212

C

666 444

D

121212 666

2
单选题2

执行下面代码后,输出为( )。

int main() {
    int a = 5;
    int* p = &a;
    int** q = &p;
    **q += 7;
    cout << a << " " << *p;
}
A

555 555

B

121212 121212

C

121212 555

D

555 121212

3
单选题2

已知:

int a[3][4] = {
    {1,2,3,4},
    {5,6,7,8},
    {9,10,11,12}
};
int (*p)[4] = a;

则表达式 *(*(p + 2) + 1) 的值为( )。

A

666

B

101010

C

999

D

111111

4
单选题2

执行下面程序后,输出为( )。

void fun(int a, int &b, int *c){
    a += 1;
    b += 2;
    *c += 3;
}
int main(){
    int x = 1, y = 1, z = 1;
    fun(x, y, &z);
    cout << x << " " << y << " " << z;
}
A

222 333 444

B

111 333 444

C

222 111 444

D

111 111 111

5
单选题2

执行下面程序后输出为( )。

int x = 3;
void f(int& x){
    x += 2;
}
int main(){
    int x = 10;
    f(x);
    cout << x << " " << ::x;
}
A

121212 333

B

101010 555

C

121212 555

D

101010 333

6
单选题2

下列关于结构体初始化的写法,正确的是( )。

A
struct Point { int x, y; };
Point p = (1,2);
B
struct Point { int x, y; };
Point p = {1,2};
C
struct Point { int x, y; };
Point p = new Point(1,2);
D
struct Point { int x, y; };
Point p = <1,2>;
7
单选题2

执行下面代码后输出为( )。

struct S { int a; int b; };
void g(S s){ s.a += 10; }
void h(S& s){ s.b += 10; }
int main(){
    S s{1,2};
    g(s);
    h(s);
    cout << s.a << " " << s.b;
}
A

111111 121212

B

111 121212

C

111111 222

D

111 222

8
单选题2

关于递推算法的描述,正确的是( )。

A

递推表现为函数自己调用自己

B

递推从已知初值出发,利用递推关系逐步推出后续结果

C

递推只能用于指数复杂度问题

D

递推一定需要回溯

9
单选题2

执行 climb(6) 的返回值为( )。

int climb(int n){
    if(n <= 2) return n;
    int a = 1, b = 2, c = 0;
    for(int i = 3; i <= n; i++){
        c = a + b;
        a = b;
        b = c;
    }
    return c;
}
A

888

B

131313

C

555

D

101010

10
单选题2

某排序算法对如下数据排序(按 scorescorescore 升序),则下面关于该排序算法稳定性的描述中,说法正确的是( )。 初始:(90,′A′)(90,'A')(90,A), (90,′B′)(90,'B')(90,B), (80,′C′)(80,'C')(80,C), (90,′D′)(90,'D')(90,D) 排序后:(80,′C′)(80,'C')(80,C), (90,′A′)(90,'A')(90,A), (90,′B′)(90,'B')(90,B), (90,′D′)(90,'D')(90,D)

A

不稳定,因为出现了相同分数

B

稳定,因为相同 scorescorescore 的相对顺序保持为 AAABBB 前、BBBDDD

C

不稳定,因为 CCC 跑到前面了

D

无法判断

11
单选题2

下面代码试图把数组按升序进行“插入排序”,横线处应填写( )。

void ins(int a[], int n){
    for(int i = 1; i < n; i++){
        int key = a[i];
        int j = i-1;
        while(j >= 0 && __________){
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = key;
    }
}
A

a[j] < key

B

a[j] > key

C

a[j+1] > key

D

a[j] == key

12
单选题2

下列代码段的时间复杂度为( )。

int cnt=0;
for(int i=0; i<n; i++){
    for(int j=0; j<n; j++){
        if( (i+j) % 3 == 0) cnt++;
    }
}
A
B
C
D
13
单选题2

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

A
freopen("log.txt", "w", stdout);
cout << "Welcome to 2026!" << endl;
fclose(stdout);
B
std::ofstream outFile("log.txt");
cout << "Welcome to 2026!" << endl;
outFile.close();
C
ofstream log_file("log.txt");
streambuf* org_cout = cout.rdbuf();
cout.rdbuf(log_file.rdbuf());
cout << "Welcome to 2026!" << endl;
cout.rdbuf(org_cout);
D
std::ofstream outFile("log.txt");
outFile << "Welcome to 2026!" << endl;
outFile.close();
14
单选题2

执行下面程序,输出结果是( )。

int divi(int a,int b){
    if(b==0) throw 0;
    return a/b;
}
int main(){
    try{
        cout << divi(10,0);
    }catch(const char* msg){
        cout << "A";
    }catch(int){
        cout << "B";
    }
}
A

A

B

B

C

程序崩溃

D

无输出

15
单选题2

下列函数实现排行榜中单个元素的位置调整(类似插入排序的相邻搬移)。当某玩家分数增加,需将其向前移动时,while 循环的条件应为( )。

struct Player{ int score; };
void up(Player players[], int n, int idx){
    Player cur = players[idx];
    int i = idx;
    while( ____________________ ){
        players[i] = players[i-1];
        i--;
    }
    players[i] = cur;
}
A

i > 0 && cur.score > players[i-1].score

B

i > 0 && cur.score < players[i-1].score

C

i < n-1 && cur.score > players[i+1].score

D

i < n-1 && cur.score < players[i+1].score

16
判断题2

下面代码执行结束时,变量 aaa 的值变成 151515

void add10(int &x) { x += 10; }
int main() {
    int a = 5;
    add10(a);
}
17
判断题2

引用一旦绑定某个变量,就不能再绑定其他变量。( )

18
判断题2

执行下面代码,输出结果为 555

int main() {
    int a[2][3];
    cout << &a[1][2] - &a[0][1] << endl;
    return 0;
}
19
判断题2

下面程序可以正常编译并输出 101010

int calc(int x, int y = 10);
int calc(int x) { return x * 2; }
int calc(int x, int y) { return x * y; }
int main() {
    cout << calc(5);
}
20
判断题2

下面程序执行后输出 2010。

int x = 10;
void f() { int x = 20; cout << x; }
int main() {
    f();
    cout << x;
}
21
判断题2

在 C++ 中,如果声明了一个指针变量但没有显式初始化,该指针会自动被初始化为 nullptr

22
判断题2

下面代码没有语法错误。

struct GameCharacter {
    string name;
    int level;
    float position_x;
    float position_y;
    struct Equipment {
        string weapon;
        int attack_bonus;
        int defense_bonus;
    } equipment;
    struct Skill {
        string name;
        int damage;
    } skills[8];
    int skill_count;
};
23
判断题2

下面程序能够把 Hello 写入 data.txt 文件中。

ofstream fout("data.txt");
cout << "Hello";
fout.close();
24
判断题2

由于选择排序和插入排序的时间复杂度均为 O(n2)O(n^2)O(n2),在任何实际场景下两者的性能表现几乎相同,可以互相替代。

25
判断题2

下面用递推方式计算斐波那契数列第 nnn 项的程序,时间复杂度是 。

int fib(int n) {
    if (n <= 1) return n;
    int f0 = 0, f1 = 1, cur = 0;
    for (int i = 2; i <= n; i++) {
        cur = f0 + f1;
        f0 = f1;
        f1 = cur;
    }
    return cur;
}
GESP 编程操作题
26
编程题25

试题名称:山之谷

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

题目描述

现有一片山地,可以视为一个 NNNMMM 列的网格图,第 iiijjj 列的海拔为 hi,jh_{i,j}hi,j

如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 888 个方向)的海拔,则称该单元格为山谷。

请你数一数该片山地中有多少山谷。

输入格式

第一行包含 222 个整数 N,MN, MN,M,表示山地的大小。

之后 NNN 行,每行包含 MMM 个整数 hi,1,hi,2,⋯ ,hi,Mh_{i,1}, h_{i,2}, \cdots, h_{i,M}hi,1,hi,2,,hi,M,表示海拔。

输出格式

输出 111 行,包含 111 个整数 CCC,表示山谷的数量。

样例输入 #1

3 5
7 6 6 7 9
6 5 6 7 6
6 5 7 8 9

样例输出 #1

3

说明/提示

样例解释

样例 1 如图所示,绿色单元格代表山谷:

:::align{center}

:::

数据范围

保证 1≤N,M≤1001 \leq N, M \leq 1001N,M1001≤hi,j≤1051 \leq h_{i,j} \leq 10^51hi,j105

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

试题名称:礼盒排序

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

题目描述

商店推出了许多礼盒,每个礼盒中包含 kkk 件商品,每件商品都有一个价格。

现在需要对这些礼盒进行排序,排序规则如下:

  1. 先按礼盒总价格从小到大排序;
  2. 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;
  3. 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;
  4. 如果仍然相同,按礼盒编号从小到大排序。

请输出排序后的礼盒编号。

输入格式

第一行包含两个整数 nnnkkk,分别表示礼盒数量和每个礼盒中商品的数量。

接下来 nnn 行,每行包含 kkk 个整数,第 iii 行表示第 iii 个礼盒中各商品的价格。

输出格式

输出一行,包含排序后的礼盒编号(编号从 111 开始),用空格分隔。

样例输入 #1

4 3
3 5 2
4 1 5
2 2 4
3 4 3

样例输出 #1

3 4 2 1

说明/提示

样例解释

编号 商品价格 总价 最大值 最小值
111 3 5 23\ 5\ 23 5 2 1010 10 555 222
222 4 1 54\ 1\ 54 1 5 101010 555 111
333 2 2 42\ 2\ 42 2 4 888 444 222
444 3 4 33\ 4\ 33 4 3 101010 444 333

排序过程:

  1. 按总价排序,333 号礼盒总价最小;
  2. 其余总价均为 101010,再按最大值排序,444 号最大值更小;
  3. 111 号和 222 号最大值相同,再按最小值排序,222 号更小。

最终顺序为:3 4 2 13 \ 4 \ 2 \ 13 4 2 1

数据范围

保证 1≤n≤1031 \leq n \leq 10^31n1031≤k≤101 \leq k \leq 101k101≤1 \leq1 商品价格 ≤104\leq 10^4104

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