GESP 2025年9月_C++四级试卷

从PDF导入:GESP 2025年9月_C++四级试卷

C++ 120分钟 总分 100.0 27 题
试卷题目预览
第1题 中级 2.0分 单选
运行下面程序后变量a的值是( )。

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

A. 42
B. 43
C. 编译错误
D. 不确定
第2题 中级 2.0分 单选
以下关于数组的描述中,( )是错误的。
A. 数组名是一个指针常量
B. 随机访问数组的元素方便快捷
C. 数组可以像指针一样进行自增操作
D. sizeof(arr)返回的是整个数组arr占用的字节数
第3题 中级 2.0分 单选
给定如下定义的数组arr,则*(*(arr + 1) + 2)的值是( )。

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

A. 2
B. 5
C. 4
D. 6
第4题 中级 2.0分 单选
下面这段代码会输出( )。

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. 3 5
B. 编译失败:定义处少了默认参数
C. 运行错误
D. 链接失败:未定义引用
第5题 中级 2.0分 单选
下面这段代码会输出( )。

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

A. 5 5
B. 10 10
C. 5 10
D. 10 5
第6题 中级 2.0分 单选
下面程序运行的结果是( )。

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

A. 6 7
B. 6 6
C. 5 6
D. 5 5
第7题 中级 2.0分 单选
关于结构体初始化,以下哪个选项中正确的是( )。

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.0分 单选
运行如下代码会输出( )。

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.0分 单选
关于排序算法的稳定性,以下说法错误的是( )。
A. 稳定的排序算法不改变相等元素的相对位置
B. 冒泡排序是稳定的排序算法
C. 选择排序是稳定的排序算法
D. 插入排序是稳定的排序算法
第10题 中级 2.0分 单选
下面代码试图实现选择排序,使其能对数组nums排序为升序,则横线上应分别填写( )。

void selectionSort(vector& 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.0分 单选
下面程序实现插入排序(升序排序),则横线上应分别填写( )。

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.0分 单选
关于插入排序的时间复杂度,下列说法正确的是( )。
A. 最好情况和最坏情况的时间复杂度都是O(n^2)
B. 最好情况是O(n),最坏情况是O(n^2)
C. 最好情况是O(n^2),最坏情况是O(n)
D. 最好情况是O(n),最坏情况是O(n log n)
第13题 中级 2.0分 单选
小杨正在爬楼梯,需要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;
}

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.0分 单选

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

A. O(n)
B. O(n^2)
C. O(n^3)
D. O(n log n)
第15题 中级 2.0分 单选
关于异常处理,以下说法错误的是( )。
A. try块中的代码可能会抛出异常
B. catch块可以有多个,处理不同类型的异常
C. throw语句用于抛出异常
D. 所有异常都必须被捕获,否则程序会崩溃
第16题 中级 2.0分 判断
以下代码能正确初始化指针。

int a = 5;
int *p = a;

T. 正确
F. 错误
第17题 中级 2.0分 判断
执行下面C++代码将输出11。int x = 10; void f() { int x = x + 1; cout << x << endl; } int ma

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

T. 正确
F. 错误
第18题 中级 2.0分 判断
以下C++代码合法。

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

T. 正确
F. 错误
第19题 中级 2.0分 判断
执行下面C++代码将输出10。void func(int* p) { *p = 10; } int main() { int a = 5; func(&a);

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

T. 正确
F. 错误
第20题 中级 2.0分 判断
下面代码将二维数组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);
}

T. 正确
F. 错误
第21题 中级 2.0分 判断
递推是在给定初始条件下,已知前一项(或前几项)求后一项的过程。
T. 正确
F. 错误
第22题 中级 2.0分 判断
虽然插入排序的时间复杂度为O(n^2),但由于单元操作相对较少,因此在小数据量的排序任务中非常受欢迎。
T. 正确
F. 错误
第23题 中级 2.0分 判断
对整数数组{4, 1, 3, 1, 5, 2}进行冒泡排序(将最大元素放到最后),执行一轮之后是{4, 1, 3, 1, 2, 5}。
T. 正确
F. 错误
第24题 中级 2.0分 判断
以下代码只能捕获int类型异常。

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

T. 正确
F. 错误
第25题 中级 2.0分 判断
以下代码将Hello写入文件data.txt。

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

T. 正确
F. 错误
第26题 中级 25.0分 编程
排兵布阵

时间限制:1.0 s 内存限制:512.0 MB
作为将军,你自然需要合理地排兵布阵。地图可以视为n行m列的网格,适合排兵的网格以1标注,不适合排兵的网格以0标注。
现在你需要在地图上选择一个矩形区域排兵,这个矩形区域内不能包含不适合排兵的网格。请问可选择的矩形区域最多能包含多少网格?

【输入格式】
第一行,两个正整数n,m,分别表示地图网格的行数与列数。
接下来n行,每行m个整数ai,j,表示各行中的网格是否适合排兵。
【输出格式】
一行,一个整数,表示适合排兵的矩形区域包含的最大网格数。
【样例输入】

4 3
0 1 1
1 0 1
0 1 1
1 1 1
【样例输出】

4
第27题 中级 25.0分 编程
最长连续段

时间限制:1.0 s 内存限制:512.0 MB
对于n个整数构成的数组A,如果对i都有A[i+1]=A[i]+1,那么称数组A是一个连续段。
给定一个长度为n的数组A,请求出其中最长的连续段的长度。

【输入格式】
第一行,一个正整数n。
第二行,n个整数A[1],A[2],...,A[n]。
【输出格式】
一行,一个整数,表示最长连续段的长度。
【样例输入】

5
1 2 3 5 6
【样例输出】

3
💬