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

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

C++ 120分钟 总分 100.0 27 题
试卷题目预览
第1题 中级 2.0分 单选
小杨想让指针p指向整数变量x,正确写法是( )。
A. int p = &x;
B. int *p = x;
C. int *p = &x;
D. p = *x;
第2题 中级 2.0分 单选
小杨写了如下的指针接力程序,程序执行完后变量a、*p1和*p2的值分别是( )。

int a = 5;
int* p1 = &a;
int* p2 = p1;
*p2 = 10;

A. 5 10 10
B. 5 10 15
C. 10 10 10
D. 5 5 10
第3题 中级 2.0分 单选
小杨用一个二维数组表示棋盘,其中1表示有棋子,0表示没有棋子。他想知道第2行第3列有没有棋子,可采用的代码是:( )。

int a[3][4] = {
{1, 0, 1, 0},
{0, 1, 0, 1},
{1, 1, 0, 0}
};

A. cout << a[1, 2] << endl;
B. cout << a[1][2] << endl;
C. cout << a(1, 2) << endl;
D. cout << a{1}{2} << endl;
第4题 中级 2.0分 单选
执行完下面的代码后,*(p + 5)和arr[1][1]的值分别是( )。

int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int* p = &arr[0][0];

A. 5 6
B. 6 5
C. 5 5
D. 6 6
第5题 中级 2.0分 单选
执行完下面的代码后,sum的值是( )。

int arr[2][3][2] = {
{{1,2}, {3,4}, {5,6}},
{{7,8}, {9,10}, {11,12}}
};
int sum = 0;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 3; j++)
for(int k = 0; k < 2; k++)
if((i+j+k) % 2 == 0)
sum += arr[i][j][k];

A. 36
B. 39
C. 78
D. 30
第6题 中级 2.0分 单选
执行完下面的代码后,输出是( )。

int a = 1;
void test() {
int a = 2;
{
int a = 3;
a++;
}
a++;
cout << a << " ";
}
int main() {
test();
cout << a;
return 0;
}

A. 3 1
B. 4 1
C. 3 2
D. 4 2
第7题 中级 2.0分 单选
执行完下面的代码后,a、b和c的值分别是( )。

void byValue(int x) { x = 100; }
void byRef(int& x) { x = 200; }
void byPointer(int* x) { *x = 300; }
int main() {
int a = 1, b = 2, c = 3;
byValue(a);
byRef(b);
byPointer(&c);
return 0;
}

A. 100 200 300
B. 1 2 3
C. 1 200 300
D. 1 2 300
第8题 中级 2.0分 单选
运行如下代码会输出( )。

struct Point {
int x, y;
};
struct Rectangle {
Point topLeft;
Point bottomRight;
};
int main() {
Rectangle rect = {{10, 10}, {20, 20}};
rect.topLeft.x = 5;
Point* p = &rect.bottomRight;
p->y = 5;
cout << rect.topLeft.x + rect.bottomRight.y;
return 0;
}

A. 10
B. 30
C. 15
D. 20
第9题 中级 2.0分 单选
给定函数climbStairs(int n)的定义如下,则climbStairs(5)的返回的值是( )。

int climbStairs(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. 5
B. 8
C. 13
D. 10
第10题 中级 2.0分 单选
对如下4个扑克牌进行排序,使用某排序算法按value排序后结果为{3,D},{3,B},{5,A},{5,C},则这个排序算法是稳定的吗?
A. 稳定,因为相同value的元素相对顺序保持不变
B. 不稳定,因为{3,D}出现在{3,B}之前
C. 无法判断
D. 稳定,因为结果是有序的
第11题 中级 2.0分 单选
下面的函数selectTopK()实现从n个学生中选出前k名成绩最好的学生颁发奖学金,则横线上应填写( )。

struct Student {
string name;
int score;
};
void selectTopK(Student students[], int n, int k) {
for (int i = 0; i < k; i++) {
int maxIdx = i;
for (____________________) { // 在此处填入代码
if (students[j].score > students[maxIdx].score) {
maxIdx = j;
}
}
if (maxIdx != i) {
Student temp = students[i];
students[i] = students[maxIdx];
students[maxIdx] = temp;
}
}
}

A. int j = 0; j < n; j++
B. int j = i + 1; j < n; j++
C. int j = i; j < n; j++
D. int j = 1; j <= n; j++
第12题 中级 2.0分 单选

某游戏的排行榜系统需要实时更新玩家分数。每次只有一个玩家的分数发生变化,排行榜已经是按分数降序排列的。现在需要将更新后的玩家调整到正确位置。下面的函数 updateRanking() 要实现上述功能,则两处横线上应分别填写( )。
struct Player {
string name;
int score;
};
// 玩家索引playerIdx的分数刚刚更新,需要调整位置
void updateRanking(Player players[], int size, int playerIdx) {
Player updatedPlayer = players[playerIdx];
if (playerIdx > 0 && updatedPlayer.score > players[playerIdx - 1].score) {
int i = playerIdx;
while (____________________) { // 在此处填入代码
players[i] = players[i - 1];
i--;
}
players[i] = updatedPlayer;
}
else if (playerIdx < size - 1 && updatedPlayer.score < players[playerIdx + 1].score) {
int i = playerIdx;
while (____________________) { // 在此处填入代码
players[i] = players[i + 1];
i++;
}
players[i] = updatedPlayer;
}
}

A. i > 0 && updatedPlayer.score > players[i - 1].score; i < size - 1 && updatedPlayer.score < players[i + 1].score
B. i < size - 1 && updatedPlayer.score < players[i + 1].score; i > 0 && updatedPlayer.score > players[i - 1].score
C. i > 0 && updatedPlayer.score < players[i - 1].score; i < size - 1 && updatedPlayer.score < players[i + 1].score
D. i > 0 && updatedPlayer.score < players[i - 1].score; i < size - 1 && updatedPlayer.score > players[i + 1].score
第13题 中级 2.0分 单选
给定如下算法,其时间复杂度为( )。

bool f(int arr[], int n, int target) {
for (int i = 0; i < 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. O(n)
B. O(n^2)
C. O(n*2^n)
D. O(2^n)
第14题 中级 2.0分 单选
执行下面C++程序,会输出( )。

int main() {
ofstream fout("test.txt");
fout << "Happy" << endl;
fout << "New Year";
fout.close();
ifstream fin("test.txt");
string s1, s2;
fin >> s1;
getline(fin, s2);
fin.close();
cout << s1 << "|" << s2;
return 0;
}

A. Happy|New Year
B. Happy| New Year
C. HappyNew Year|
D. Happy|
第15题 中级 2.0分 单选
执行下面C++代码,会输出( )。

int divide(int a, int b) {
if(b == 0) throw "Division by zero";
return a / b;
}
int main() {
int result = 0;
try {
result = divide(10, 0);
cout << "A";
}
catch(const char* msg) {
cout << "B";
result = -1;
}
cout << result;
return 0;
}

A. A0
B. B-1
C. A10
D. 程序崩溃
第16题 中级 2.0分 判断
小杨正在调试他的温度传感器程序,其中变量x保存当前温度。下面这段代码运行后,变量x的值变成了8。int x = 5; int *p = &x; *p = *p

小杨正在调试他的温度传感器程序,其中变量 x 保存当前温度。下面这段代码运行后,变量 x 的值变成了 8 .
int x = 5;
int *p = &x;
*p = *p + 3;

T. 正确
F. 错误
第17题 中级 2.0分 判断
一个结构体不能包含另一个结构体。
T. 正确
F. 错误
第18题 中级 2.0分 判断
在C++中,定义如下二维数组:int a[3][4];,数组a在内存中是按行优先连续存放的。
T. 正确
F. 错误
第19题 中级 2.0分 判断
执行下面程序后,变量a的值会变成15。

void add(int &x){
x += 10;
}
int a = 5;
add(a);

T. 正确
F. 错误
第20题 中级 2.0分 判断
执行下面的C++代码,会输出8,因为两个指针地址相差8个字节(假设int占4字节)。

int arr[5] = {1, 2, 3, 4, 5};
int* p1 = arr;
int* p2 = arr + 2;
cout << p2 - p1; // 输出结果

T. 正确
F. 错误
第21题 中级 2.0分 判断
考虑用如下递推方式计算斐波那契数列,时间复杂度是O(n)。

int n = 10;
int f[20];
f[0] = 0;
f[1] = 1;
for (int i = 2; i <= n; i++)
f[i] = f[i - 1] + f[i - 2];

T. 正确
F. 错误
第22题 中级 2.0分 判断
冒泡排序和插入排序都是稳定排序算法。
T. 正确
F. 错误
第23题 中级 2.0分 判断
下面这段代码实现了选择排序算法。

T. 正确
F. 错误
第24题 中级 2.0分 判断
下面代码可以正常编译并输出10。

T. 正确
F. 错误
第25题 中级 2.0分 判断
执行下面代码会输出100。

T. 正确
F. 错误
第26题 中级 25.0分 编程
矩阵求和

时间限制:1.0 s 内存限制:512.0 MB
给定一个n行m列的矩阵,求所有元素的和。

【输入格式】
第一行,两个正整数n,m。
接下来n行,每行m个整数。
【输出格式】
一个整数,表示矩阵所有元素的和。
【样例输入】

3 4
1 2 3 4
5 6 7 8
9 10 11 12
【样例输出】

78
第27题 中级 25.0分 编程
字符排序

时间限制:1.0 s 内存限制:512.0 MB
给定一个字符串,将其中的字符按ASCII码值从小到大排序后输出。

【输入格式】
一行,一个字符串。
【输出格式】
一行,排序后的字符串。
【样例输入】

dcba
【样例输出】

abcd
💬