GESP_2026年06月_C++四级试卷

从PDF导入:GESP_2026年06月_C++四级试卷

C++ 120分钟 总分 100.0 27 题
试卷题目预览
第1题 中级 2.0分 单选
小杨正在编写一个"数字交换器"程序,他希望通过函数交换两个变量的值。请问运行以下代码后,屏幕上输出的是()。

void exchange(int *a, int &b) {
int t = *a;
*a = b;
b = t;
}
int main() {
int x = 100, y = 200;
exchange(&x, y);
cout << x << " " << y;
return 0;
}

A. 100 200
B. 200 100
C. 200 200
D. 编译错误
第2题 中级 2.0分 单选
下面程序想通过函数计算三门课总分,横线处应填入的是()。

int sumScore(int a, int b, int c) {
return a + b + c;
}
int main() {
int chinese = 88, math = 95, english = 90;
int total = ________;
cout << total;
return 0;
}

A. sumScore
B. sumScore(chinese, math, english)
C. sumScore(int chinese, int math, int english)
D. sumScore(a, b, c)
第3题 中级 2.0分 单选
下面程序输出结果是()。

int addOne(int x) {
return x + 1;
}
int main() {
int a = 6;
cout << addOne(a) << " " << addOne(3);
return 0;
}

A. 9
B. 10
C. 7 4
D. 12
第4题 中级 2.0分 单选
关于下面程序,说法正确的是()。

void show() {
int stars = 5;
}
int main() {
cout << stars;
return 0;
}

A. 程序输出5
B. 程序可以通过编译,但输出随机值
C. 程序不能通过编译,因为stars只在show函数中有效
D. 程序不能通过编译,因为cout不能输出变量
第5题 中级 2.0分 单选
小杨在调试一个"等级提升"系统,执行后*p的值是()。

int lv = 5, next_lv = 6;
int *p = &lv;
*p = *p + 1;
p = &next_lv;

A. 5
B. 6
C. lv的地址
D. next_lv的地址
第6题 中级 2.0分 单选

小杨正在开发一款名为“星际网格”的游戏,他用二维数组 int map[5][4]; 来表示地图。已知 int 占字节,如果 map 的内存地址是 0x2000 ,则表达式 &map + 1 的地址值是( )。

A. 0x204c
B. 0x205c
C. 0x2050
D. 0x2058
第7题 中级 2.0分 单选
执行完下面代码后,变量val的值是()。

int data[] = {10, 20, 30, 40, 50};
int *ptr = data + 2;
int val = *(ptr - 1) + *(ptr + 1);

A. 50
B. 60
C. 70
D. 80
第8题 中级 2.0分 单选
某班3个小组、每组4名同学的分数存入下面的二维数组score,则score[1][2]的值是()。

int score[3][4] = {
{80, 81, 82, 83},
{90, 91, 92, 93},
{70, 71, 72, 73}
};

A. 81
B. 90
C. 92
D. 72
第9题 中级 2.0分 单选
小杨定义了一个结构体Hero来表示游戏角色,下面哪种初始化方式会由于语法错误导致编译失败?()。

struct Hero {
string name;
int hp;
};

A. Hero h = {"Arthur", 100};
B. Hero h; h.name = "Arthur"; h.hp = 100;
C. Hero h = new Hero{"Arthur", 100};
D. Hero *p = new Hero{"Arthur", 100};
第10题 中级 2.0分 单选
下面程序输出结果是()。

struct Book {
string title;
int pages;
};
int main() {
Book books[2] = {{"Math", 120}, {"Science", 150}};
cout << books[1].title;
return 0;
}

A. Math
B. Science
C. 120
D. 150
第11题 中级 2.0分 单选
小杨在对"能量晶石"按亮度进行排序。如果两块晶石亮度相同,他希望保持它们在原始序列中的相对顺序。下列关于排序算法稳定性的说法,错误的是()。
A. 冒泡排序是稳定的,因为只有在左边比右边大时才交换
B. 插入排序是稳定的,因为它将元素插入到相等元素的右侧
C. 选择排序是稳定的,因为它每次选出最小元素放在前面
D. 稳定性是指排序后相等元素的相对位置不发生改变
第12题 中级 2.0分 单选
小杨的机器人正在能量踏板上跳跃。跳到第n块踏板的方案数满足递推式f(n)=f(n-1)+f(n-2)。若f(1)=1,f(2)=2,则运行以下代码计算jump(5) 的结果是( )。

int jump(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. 21
第13题 中级 2.0分 单选
在"模拟实验室"程序中,为了防止除以0导致崩溃,小杨使用了异常处理机制。执行以下代码将输出()。

try {
int x = 10, y = 0;
if (y == 0) throw "Zero Error";
cout << x / y;
} catch (int e) {
cout << "Error Code:" << e;
} catch (const char* msg) {
cout << "Caught:" << msg;
}

A. 0
B. Error Code:0
C. Caught:Zero Error
D. 程序直接崩溃
第14题 中级 2.0分 单选
下面代码使用某种排序算法,将数组中的元素按从小到大排序。这段代码使用的排序算法是()。

void mysterysort(double arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int minPos = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minPos]) {
minPos = j;
}
}
double temp = arr[i];
arr[i] = arr[minPos];
arr[minPos] = temp;
}
}

A. 冒泡排序
B. 插入排序
C. 选择排序
D. 非典型排序
第15题 中级 2.0分 单选
小杨正在读取"冒险日志"文件quest.txt。若文件内容为Level 10,执行以下程序后输出为()。

ifstream fin("quest.txt");

string s;
int v;
fin >> s >> v;
cout << s.length() * v;

A. 50
B. 15
C. 70
D. 5
第16题 中级 2.0分 判断
运行以下程序后,变量a的值最终会变为20。

void modify(int *p) {
*p = *p + 10;
}
int main() {
int a = 10;
modify(&a);
return 0;
}

T. 正确
F. 错误
第17题 中级 2.0分 判断
在C++中,引用一旦初始化并绑定到某个变量后,可以通过赋值语句将其重新绑定到另一个变量。
T. 正确
F. 错误
第18题 中级 2.0分 判断
下面程序可以正确计算并输出3名学生的平均成绩。

struct Student {
int id;
int score;
};
int main() {
Student students[3] = {
{1, 90},
{2, 80},
{3, 100}
};
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += students[i].score;
}
double average = sum / 3.0;
cout << average << endl;
return 0;
}

T. 正确
F. 错误
第19题 中级 2.0分 判断
选择排序算法在寻找每一轮最小值时,如果遇到相等的元素不进行交换,则选择排序是一种稳定的排序算法。
T. 正确
F. 错误
第20题 中级 2.0分 判断
如果使用带flag的冒泡排序,且待排序数组一开始就是有序的,那么算法只需一轮扫描即可结束,时间复杂度为O(n)。
T. 正确
F. 错误
第21题 中级 2.0分 判断

在 C++ 中定义二维数组并初始化时,可以省略第一维,但不能省略第二维。因此 int a[][2] = {{1, 2},{3, 4}}; 是合法的,而 int a[][] = {{1, 2}, {3, 4}}; 是不合法的。

T. 正确
F. 错误
第22题 中级 2.0分 判断
下面代码的时间复杂度是O(2^n)。

int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cnt++;
}
}

T. 正确
F. 错误
第23题 中级 2.0分 判断
假设文件output.txt能正常打开,下面代码通过rdbuf将cout的输出重定向到了文件中。

ofstream fout("output.txt");

streambuf *old_buf = cout.rdbuf();
cout.rdbuf(fout.rdbuf());
cout << "GESP Exam";
cout.rdbuf(old_buf);

T. 正确
F. 错误
第24题 中级 2.0分 判断
小杨想通过下面程序给饭卡充值,程序会输出70。

void recharge(int money) {
money += 20;
}
int main() {
int card = 50;
recharge(card);
cout << card;
return 0;
}

T. 正确
F. 错误
第25题 中级 2.0分 判断
下面代码可以通过编译。

int a[5];
a++;

T. 正确
F. 错误
第26题 中级 25.0分 编程
扫雷


【题目描述】小杨同学正在游玩经典游戏「扫雷」,他想自己生成一个「扫雷」的地图。小杨同学希望生成的地图大小为n行m列,一共n×m个区块。其中一些区块为雷区,其它区块不为雷区。小杨同学指定了q个区块为雷区,而其它区块均不为雷区。小杨同学希望你帮忙计算非雷区的区块,每个区块与多少个雷区相邻?我们定义区块相邻,当且仅当两个区块至少有一个公共顶点。

【输入格式】输入包含q+1行。第一行,三个正整数n、m和q,分别表示地图行数和列数,以及雷区数量。接下来的q行,每行有2个整数,分别表示第i个雷区的行号和列号。保证输入的雷区不重复。

【输出格式】输出n行,每行m个字符(使用空格分割),对于第i行第j列,输出地图对应区块的信息:1.如果为雷区,输出*;2.如果不是雷区,输出其相邻雷区数量(输出0到8中的一个数字)。

【样例】
3 4 4
1 1
1 3
2 4
3 2
【样例解释】
<pre class="inline-code">* 2 * 2
2 3 3 *
1 * 1 1
【数据范围】3≤n,m≤500,1≤q≤n×m。输入的雷区必定在地图内且不重复,注意行号和列号均从1开始。
第27题 中级 25.0分 编程
身高体重指数


【题目描述】一个人的身高体重指数(BMI)等于其体重(千克为单位)除以其身高(米为单位)的平方。现在有n个小朋友,第i个小朋友的编号为i,体重为wi,身高为hi。请按照身高体重指数从高到低为小朋友们排序,数据保证不存在两个小朋友的身高体重指数完全相同。输出排序后小朋友的编号。

【输入格式】输入3行,第一行为一个正整数n,表示小朋友的个数;第二行为n个整数w1,w2,...,wn表示小朋友们的体重,单位为kg;第三行为n个浮点数h1,h2,...,hn表示小朋友们的身高,单位为m。

【输出格式】输出一行n个数,表示按照身高体重指数从高到低排序后的编号。

【样例】
3
45 33 39
1.55 1.33 1.44
【样例解释】
3 1 2
【样例解释】三个小朋友(编号依次为1、2、3)的身高体重指数分别为(保留两位小数的结果):18.73、18.66、18.81,故排序后输出的编号为3 1 2。
【数据范围】1≤n≤1000,10≤wi≤100,0.8≤hi≤1.9,hi均恰有两位小数。
💬