试卷总分:100分


选择题 15题 30分

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15


判断题 10题 20分

16 17 18 19 20 21 22 23 24 25


编程题 2题 50分

26 27

E1094 CCF-GESP编程能力等级认证-C++ -2026-06 CCF-GESP C++四级真题-考试

选择题 共15道

01

小杨正在编写一个“数字交换器”程序,他希望通过函数交换两个变量的值。请问运行以下代码后,屏幕上输出的是( )。

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;
}
2分
登录后查看选项
02

下面程序想通过函数计算三门课总分,横线处应填入的是( )。

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;
}
2分
登录后查看选项
03

下面程序输出结果是( )。

int addOne(int x) {
	return x + 1;
}
int main() {
	int a = 6;
	cout << addOne(a) + addOne(3);
	return 0;
}
2分
登录后查看选项
04

关于下面程序,说法正确的是( )。

void show() {
	int stars = 5;
}
int main() {
	cout << stars;
	return 0;
}
2分
登录后查看选项
05

小杨在调试一个“等级提升”系统,代码逻辑如下,执行后 *p 的值是( )。

int lv = 5, next_lv = 6;
int *p = &lv;
*p = *p + 1;
p = &next_lv;
2分
登录后查看选项
06

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

2分
登录后查看选项
07

执行完下面代码后,变量 val 的值是( )。

int data[] = {10, 20, 30, 40, 50};
int *ptr = data + 2;
int val = *(ptr - 1) + *(ptr + 1);
2分
登录后查看选项
08

某班 3 个小组、每组 4 名同学的分数存入下面的二维数组 score ,则 score[1][2] 的值是( )。

int score[3][4] = {
	{80, 81, 82, 83},
	{90, 91, 92, 93},
	{70, 71, 72, 73}
};
2分
登录后查看选项
09

小杨定义了一个结构体 Hero 来表示游戏角色,下面哪种初始化方式会由于语法错误导致编译失败?

struct Hero {
	string name;
	int hp;
};
2分
登录后查看选项
10

下面程序输出结果是( )。

struct Book {
	string title;
	int pages;
};
int main() {
	Book books[2] = {{"Math", 120}, {"Science", 150}};
	cout << books[1].title;
	return 0;
}
2分
登录后查看选项
11

小杨在对“能量晶石”按亮度进行排序。如果两块晶石亮度相同,他希望保持它们在原始序列中的相对顺序。下列关于排序算法稳定性的说法,错误的是( )。

2分
登录后查看选项
12

小杨的机器人正在能量踏板上跳跃,踏板编号为 1,2,3,..。跳到第 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;
}
2分
登录后查看选项
13

在“模拟实验室”程序中,为了防止除以 导致崩溃,小杨使用了异常处理机制。执行以下代码将输出( )。

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;
}
2分
登录后查看选项
14

下面代码使用某种排序算法,将数组中的元素按从小到大排序。这段代码使用的排序算法是( )。

void mystery_sort(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;
	}
}
2分
登录后查看选项
15

小杨正在读取“冒险日志”文件 quest.txt 。若文件内容为 Level 10 ,执行以下程序后输出为( )。

ifstream fin("quest.txt");
string s;
int v;
fin >> s >> v;
cout << s.length() * v;
2分
登录后查看选项

判断题 共10道

16

运行以下程序后,变量 a 的值最终会变为 20 。

void modify(int *p) {
	*p = *p + 10;
}
int main() {
	int a = 10;
	modify(&a);
	return 0;
}
2分
登录后查看选项
17

在 C++ 中,引用一旦初始化并绑定到某个变量后,可以通过赋值语句将其重新绑定到另一个变量。

2分
登录后查看选项
18

下面程序可以正确计算并输出 名学生的平均成绩。

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;
}
2分
登录后查看选项
19

选择排序算法在寻找每一轮最小值时,如果遇到相等的元素不进行交换,则选择排序是一种稳定的排序算法。

2分
登录后查看选项
20

如果使用带 flag 的冒泡排序,且待排序数组一开始就是有序的,那么算法只需一轮扫描即可结束,时间复杂度为 O(n) 。

2分
登录后查看选项
21

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

2分
登录后查看选项
22

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

int cnt = 0;
for (int i = 1; i <= n; i++) {
	for (int j = 1; j <= i; j++) {
		cnt++;
	}
}
2分
登录后查看选项
23

假设文件 output.txt 能正常打开,下面代码通过 rdbuf 将 cout 的输出重定向到了文件中。

ofstream fout("output.txt");
streambuf* old_buf = cout.rdbuf();
cout.rdbuf(fout.rdbuf());
cout << "GESP Exam";
cout.rdbuf(old_buf);
2分
登录后查看选项
24

小杨想通过下面程序给饭卡充值,程序会输出 70 。

void recharge(int money) {
	money += 20;
}
int main() {
	int card = 50;
	recharge(card);
	cout << card;
	return 0;
}
2分
登录后查看选项
25

下面代码可以通过编译。

int a[5];
a++;
2分
登录后查看选项

编程题 共2道

26

扫雷

题目描述

小杨同学正在游玩经典游戏「扫雷」,他想自己生成一个「扫雷」的地图。

小杨同学希望生成的地图大小为 n 行 m 列,一共 n×m 个区块。区块行号为 1,2,...,n,列号为 1,2,...,m。其中一些区块为雷区,其它区块不为雷区。

小杨同学指定了 q 个区块为雷区,而其它区块均不为雷区。小杨同学希望你帮忙计算非雷区的区块,每个区块与多少个雷区相邻?

我们定义区块相邻,当且仅当两个区块至少有一个公共顶点(也就是说对于不在地图边缘的区块,周围 8 个区块均与其相邻)。

输入

输入包含 q+1 行。

第一行,三个正整数 n,m和q,分别表示地图行数和列数,以及雷区数量。

接下来的 q 行,每行有 2 个整数,分别表示第 i 个雷区的行号和列号。

保证输入的雷区不重复。

输出

输出 n 行,每行 m 个字符(使用空格分割),对于第 i 行第 j 列,输出地图对应区块的信息:

1. 如果为雷区,输出 * ;

2. 如果不是雷区,输出其相邻雷区数量(输出 0 到 8 中的一个数字)。

数据范围

3≤n,m≤500,1≤q≤n*m

输入的雷区必定在地图内且不重复,注意行号和列号均从 1 开始。

输入样例1

3 4 4

1 1

1 3

2 4

3 2

输出样例1

* 2 * 2

2 3 3 *

1 * 2 1

25分

C0735
登录后作答
27

身高体重指数

题目描述

一个人的身高体重指数(BMI)等于其体重(千克为单位)除以其身高(米为单位)的平方。例如,一个体重为 50kg,身高为 1.6m 的人的身高体重指数为 50kg/1.6m/1.6m=19.53125kg/m2。

现在有 n 个小朋友,第 i 个小朋友的编号为 i,体重为 wi,身高为 hi。

请按照身高体重指数从高到低为小朋友们排序,数据保证不存在两个小朋友的身高体重指数完全相同。输出排序后小朋友的编号。

输入

输入 3 行,

第一行为一个正整数 n,表示小朋友的个数;

第二行为 n 个整数 w1,w2,...,wn 表示小朋友们的体重,单位为 ;

第三行为 n 个浮点数 h1,h2,...,hn 表示小朋友们的身高,单位为 m。

输出

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

数据范围

1≤n≤1000,10≤wi≤100,0.8≤hi≤1.9,hi均恰有两位小数。

输入样例1

3

45 33 39

1.55 1.33 1.44

输出样例1

3 1 2

25分

C0736
登录后作答