编程未来 Coding Future

2026年9月 GESP C++ 4级

GESP · 4级 · 2026-09

60:00
满分 100.0
时长 60 分钟
27

2026年9月 GESP C++ 4级认证考试真题(客观题部分)

单选题(共 15 题,每题 2 分)

1

小杨使用指针修改计数器的值。执行下面程序后,输出结果是( )。

int count = 8;
int *p = &count;
*p += 4;
cout << count << " " << *p;
return 0;
2

关于下面指针声明的说法,正确的是( )。

int a = 10;
int b = 20;
const int *p = &a;
3

小杨用二维数组记录仓库货物数量。执行下面代码后,变量 x 的值是( )。

int goods[3][4] = {{2, 4, 6, 8}, {10, 12, 14, 16}, {18, 20, 22, 24}};
int (*p)[4] = goods;
int x = *(*(p + 1) + 2);
4

下面函数用于将一个 3 行 5 列二维数组的第 r 行元素全部加 1,横线处正确的形参写法是( )。

void addOne(________, int r) {
    for (int j = 0; j < 5; j++) {
        arr[r][j]++;
    }
}
5

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

int score = 60;

void update(int &score) {
    score += 5;
}

int main() {
    int score = 80;
    update(score);
    cout << score << " " << ::score;
    return 0;
}
6

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

struct Device {
    int id;
    int state;
};

void reset(Device d) {
    d.state = 0;
}

void start(Device &d) {
    d.state += 1;
}

int main() {
    Device d{7, 2};
    reset(d);
    start(d);
    cout << d.id << " " << d.state;
    return 0;
}
7

小杨定义了结构体数组,并使用指针访问其中的元素。执行下面代码后输出的是( )。

struct Book {
    string name;
    int pages;
};

int main() {
    Book books[2] = {{"C++", 120}, {"Math", 150}};
    Book *p = books + 1;
    p->pages += 10;
    cout << books[1].name << " " << books[1].pages;
    return 0;
}
8

关于冒泡排序、插入排序和选择排序,下列说法正确的是( )。

9

某机器⼈每次可以向前移动 1 格或 2 格,到达第 n 格的方法数由下面函数计算。ways(6) 的返回值是
( )。

int ways(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 b;
}
10

对一组 struct student 的学生按成绩(score)升序排序。排序前后的数据如下。关于该排序的稳定
性,判断正确的是( )。

struct student {
    int score;
    char id;
};

排序前:
1 (90, 'A'), (80, 'B'), (90, 'C'), (80, 'D')
排序后:
1 (80, 'B'), (80, 'D'), (90, 'C'), (90, 'A')

11

下面代码使用插入排序将数组按升序排列,横线处应填写( )。

void insertionSort(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;
    }
}
12

下面代码的时间复杂度是( )。

int countPairs(int a[], int n) {
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (a[i] + a[j] == 100) {
                cnt++;
            }
        }
    }
    return cnt;
}
13

假设文件 data.txt 的内容如下:
1 Blue Sky
执行下面程序后,输出结果是( )。

int main() {
    ifstream fin("data.txt");
    string a, b;
    fin >> a >> b;
    cout << b << "-" << a;
    fin.close();
    return 0;
}
14

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

int main() {
    try {
        int age = -1;
        if (age < 0)
        throw age;
        cout << "A";
    } catch (const char *msg) {
        cout << "B";
    } catch (int value) {
        cout << "C" << value;
    }
    return 0;
}
15

下面函数使用冒泡排序将数组按升序排列。为了在数组已经有序时提前结束,两处横线应分别填写
( )。

void bubbleSort(int a[], int n) {
    for (int i = n - 1; i > 0; i--) {
        bool changed = __________;
        for (int j = 0; j < i; j++) {
            if (a[j] > a[j + 1]) {
                int t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
                changed = __________;
            }
        }
        if (!changed)
        break;
    }
}

判断题(共 10 题,每题 2 分)

16

执行下面程序后,变量 a 的值为 15。

int a = 10;
int *p = &a;
*p += 5;
17

一个函数必须在调用之前既声明⼜定义。

18

下面二维数组在内存中按行优先连续存储,因此 ((a + 1) + 0) 的值为 5。
1 int a[2][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}};

19

执行下面程序后会输出 20。

void change(int x) {
    x = 20;
}

int main() {
    int x = 10;
    change(x);
    cout << x;
    return 0;
}
20

下面结构体初始化语句是合法的。

struct Point {
    int x;
    int y;
};

Point p{3, 4};
21

对于按升序实现的稳定插入排序,移动元素的条件通常应为 a[j] >= key,这样能够保证相等元素的相对
顺序不变。

while (j >= 0 && a[j] >= key) {
    a[j + 1] = a[j];
    j--;
}
22

下面递推程序计算 。当 n = 4 时,返回值为 24。

int factorial(int n) {
    int result = 1;
    for (int i = 1; i <= n; i++) {
        result *= i;
    }
    return result;
}
23

下面两层循环的时间复杂度是 。

for (int i = 0; i < n; i++) {
    for (int j = 1; j < n; j *= 2) {
        cout << i + j;
    }
}
24

假设文件能够正常打开,下面程序会把 Welcome 写入 log.txt。

int main() {
    ofstream fout("log.txt");
    fout << "Welcome";
    fout.close();
    return 0;
}
25

执行下面程序时,catch (int e) 能够捕获由 throw "Error" 抛出的异常,因此程序输出 Caught。

int main() {
    try {
        throw "Error";
    } catch (int e) {
        cout << "Caught";
    }
    return 0;
}

编程操作题(共 2 题,共 50 分)

26
编程操作题 25分

试题名称:新汉诺塔

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

题目描述

汉诺塔问题是最经典的递推问题之一:

有三个可以放圆盘柱子,编号为 $A$、$B$ 和 $C$。

开始时柱子 $A$ 上套着 $n$ 个圆盘,它们从上到下按照从小到大的顺序排列。

我们的任务是要把这 $n$ 个圆盘移到柱子 $C$ 上,并保持它们的原有顺序不变。

在移动圆盘的过程中,需要遵守以下规则:

  1. 圆盘只能从一根柱子顶部拿出,从另一根柱子顶部放入。
  2. 每次只能移动一个圆盘。
  3. 小圆盘必须时刻位于大圆盘之上。

小杨在学习了汉诺塔问题后,决定添加一个新规则:

  1. 每一次移动,圆盘只能从 $A$ 移动到 $B$,从 $B$ 移动到 $C$,或者从 $C$ 移动到 $A$;其它移动是不允许的。

在新规则下,给定圆盘数量 $n$,试问最少移动步数是多少?

输入格式

输入一个正整数 $n$,表示圆盘的数量。

输出格式

输出一个整数,表示在新规则下将 $n$ 个圆盘从 $A$ 移动到 $C$ 所需的最少移动步数。

样例输入 #1

2

样例输出 #1

7

样例输入 #2

3

样例输出 #2

21

说明/提示

样例解释 1

以下步骤是最佳的(编号为 1 的是小盘,为 2 的是大盘):

  1. 将 1 从 $A$ 移动到 $B$;
  2. 将 1 从 $B$ 移动到 $C$;
  3. 将 2 从 $A$ 移动到 $B$;
  4. 将 1 从 $C$ 移动到 $A$;
  5. 将 2 从 $B$ 移动到 $C$;
  6. 将 1 从 $A$ 移动到 $B$;
  7. 将 1 从 $B$ 移动到 $C$。

可以证明没有更少步骤可以完成这个任务。

数据范围

对于所有数据,$n \le 20$。

27
编程操作题 25分

试题名称:有序网格

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

题目描述

小 A 有一个 $n$ 行 $m$ 列格子组成的二维网格,从上到下依次是第 $1$ 行到第 $n$ 行,从左到右依次是第 $1$ 列到第 $m$ 列。每个格子里有一个数字,第 $i$ 行第 $j$ 列的格子里的数字是 $a_{i,j}$。

小 A 想让二维网格变得有序,因此他先对每一行从左到右按升序排序,再对每一列从上到下按升序排序。以下是一个先完成行排序再完成列排序的例子:

$$ \begin{array}{|c|c|c|c|}\hline 1&3&2&5\\\hline 6&2&4&4\\\hline 5&4&1&3\\\hline\end{array}\xrightarrow{\text{每行升序排序}}\begin{array}{|c|c|c|c|}\hline 1&2&3&5\\\hline 2&4&4&6\\\hline 1&3&4&5\\\hline\end{array}\xrightarrow{\text{每列升序排序}}\begin{array}{|c|c|c|c|}\hline 1&2&3&5\\\hline 1&3&4&5\\\hline 2&4&4&6\\\hline\end{array} $$

小 A 想知道二维网格经过以上排序后的结果。你能编写程序帮助他吗?

输入格式

第一行,两个正整数 $n,m$,分别表示二维网格的行数与列数。

接下来 $n$ 行,每行 $m$ 个整数 $a_{i,1},\ldots,a_{i,m}$,表示二维网格中的数字。

输出格式

输出 $n$ 行,每行 $m$ 个整数,表示二维网格先完成行排序再完成列排序后的结果。

样例输入 #1

3 2
6 5
4 3
2 1

样例输出 #1

1 2
3 4
5 6

样例输入 #2

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

样例输出 #2

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

说明/提示

数据范围

对于所有测试点,保证 $2 \le n \le 10$,$2 \le m \le 10$,$1 \le a_{i,j} \le 100$。

已答 0/27