#TK1166. 2025年9月CCF-GESP编程能力等级认证C++编程四级真题

2025年9月CCF-GESP编程能力等级认证C++编程四级真题

GESP C++ 四级 2025年09月考试试卷

1 单选题(每题 2 分,共 30 分)

第 1 题

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

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

{{ select(1) }}

  • 42
  • 43
  • 编译错误
  • 不确定

第 2 题

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

  • 数组名是一个指针常量
  • 随机访问数组的元素方便快捷
  • 数组可以像指针一样进行自增操作
  • sizeof(arr) 返回的是整个数组arr 占用的字节数

第 3 题

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

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

{{ select(3) }}

  • 2
  • 5
  • 4
  • 6

第 4 题

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

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;
}

{{ select(4) }}

  • 3 5
  • 编译失败:定义处少了默认参数
  • 运行错误
  • 链接失败:未定义引用

第 5 题

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

int x = 5;

void foo() { 
    int x = 10; 
    cout << x << " ";
}

void bar() {
    cout << x << " ";
}

int main() {
    foo(); 
    bar();
}

{{ select(5) }}

  • 5 5
  • 10 10
  • 5 10
  • 10 5

第 6 题

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

void increaseA(int x) {
    x++;
}

void increaseB(int* p) {
    (*p)++;
}

int main() { 
    int a = 5;
    increaseA(a);
    cout << a << " "; 
    increaseB(&a);
    cout << a;
}

{{ select(6) }}

  • 6 7
  • 6 6
  • 5 6
  • 5 5

第 7 题

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

struct Point {int x,y;};

{{ select(7) }}

  • Point p = (1,2);
  • Point p = {1,2};
  • Point p = new {1,2};
  • Point p = <1,2>;

第 8 题

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

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;
}

{{ select(8) }}

  • Mimi 2
  • Mimi 3
  • kitty 3
  • kitty 2

第 9 题

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

  • 稳定的排序算法不改变相等元素的相对位置
  • 冒泡排序是稳定的排序算法
  • 选择排序是稳定的排序算法
  • 插入排序是稳定的排序算法

第 10 题

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

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;
            }
        }
        ____________________; // 在此处填入代码
    }
}

{{ select(10) }}

  • nums[j] < nums[minIndex]swap(nums[i], nums[minIndex])
  • nums[j] > nums[minIndex]swap(nums[i], nums[minIndex])
  • nums[j] <= nums[minIndex]swap(nums[j], nums[minIndex])
  • nums[j] <= nums[minIndex]swap(nums[i], nums[j])

第 11 题

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

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--;
        }
        __________; // 在此处填入代码
    }
}

{{ select(11) }}

  • arr[j] > keyarr[j + 1] = key
  • arr[j] < keyarr[j + 1] = key
  • arr[j] > keyarr[j] = key
  • arr[j] < keyarr[j] = key

第 12 题

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

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

第 13 题

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

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;
}

{{ select(13) }}

  • current = prev1 + prev2; prev1 = current; prev2 = prev1;
  • current = prev1 + prev2; prev2 = prev1; prev1 = current;
  • prev2 = prev1; prev1 = current; current = prev1 + prev2;
  • prev1 = current; prev2 = prev1; current = prev1 + prev2;

第 14 题

假设有一个班级的成绩单,存储在一个长度为 n 的数组 scores 中,每个元素是一个学生的分数。老师想要找出所有满足 scores[i] + scores[j] + scores[k] == 300 的三元组,其中 i < 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++;
            }
        }
    }
}

{{ select(14) }}

  • (O(n))
  • (O(n\log n))
  • (O(n^{3}))
  • (O(2^{n}))

第 15 题

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

  • try 块中的代码可能会抛出异常
  • catch 块可以有多个,处理不同类型的异常
  • throw 语句用于抛出异常
  • 所有异常都必须被捕获,否则程序会崩溃

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

第 16 题

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

int a = 5; 
int *p = a;

{{ select(16) }}

  • 正确
  • 错误

第 17 题

执行下面C++代码将输出 11。( )

int x = 10;

void f() { 
    int x = x + 1;
    cout << x << endl;
}

int main() { 
    f();
}

{{ select(17) }}

  • 正确
  • 错误

第 18 题

以下C++代码合法。( )

struct Student {
    string name; 
    int age;
    float score;
}; 
Student* students = new Student[20];

{{ select(18) }}

  • 正确
  • 错误

第 19 题

执行下面C++代码将输出 10。( )

void func(int* p) {
    *p = 10;
}

int main() { 
    int a = 5;
    func(&a);
    cout << a << endl; 
    return 0;
}

{{ select(19) }}

  • 正确
  • 错误

第 20 题

下面代码将二维数组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);
}

{{ select(20) }}

  • 正确
  • 错误

第 21 题

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

  • 正确
  • 错误

第 22 题

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

  • 正确
  • 错误

第 23 题

对整数数组{4, 1, 3, 1, 5, 2}进行冒泡排序(将最大元素放到最后),执行一轮之后是{4, 1, 3, 1, 2, 5}。( ) {{ select(23) }}

  • 正确
  • 错误

第 24 题

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

int main() {
    try {
        throw 42;
    } catch (...) { 
        cout << "Caught" << endl;
    } 
    return 0;
}

{{ select(24) }}

  • 正确
  • 错误

第 25 题

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

ofstream file("data.txt");
cout << "Hello" << endl; 
file.close();

{{ select(25) }}

  • 正确
  • 错误