选择题 共15道

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


判断题 共10道

16 17 18 19 20 21 22 23 24 25


编程题 共2道

26 27

E1087 2026-09 CCF-GESP C++四级真题-练习

选择题 共15道
01

小杨使用指针修改计数器的值。执行下面程序后,输出结果是()。

int count = 8;
int *p = &count;
*p += 4 ;
cout << count << " " << *p ;
return 0 ;
2分
登录后查看选项
02

关于下面指针声明的说法,正确的是()。

int a = 10 ;
int b = 20 ;
const int *p = &a;
2分
登录后查看选项
03

小杨用二维数组记录仓库货物数量。执行下面代码后,变量x 的值是()。

int goods [3][4] = {{2 , 4 , 6 , 8 }, {10 , 12 , 14 , 16}, {18 , 20 , 22 , 24}};
int (*p)[4] = goods ;
int x = *(*(p + 1) + 2);
2分
登录后查看选项
04

下面函数用于将一个3 行5 列二维数组的第r 行元素全部加1,横线处正确的形参写法是()。

void addOne(_______, int r) {
	for (int j = 0 ; j < 5 ; j++) {
		arr [r][j]++;
	}
}
2分
登录后查看选项
05

执行下面程序后,输出结果是()。

int score = 60 ;
void update(int &score) {
	score += 5 ;
}
int main() {
	int score = 80 ;
	update(score);
	cout << score << " " << ::score ;
	return 0 ;
}
2分
登录后查看选项
06

执行下面程序后,输出结果是()。

struct Device {
	int id ;
	int state;
};
void reset(Device d) {
	d .state = 0 ;
}
void start(Device &d) {
	d .state += 1;
}
int main() {
	Device d {7 , 2 };
	reset(d);
	start(d);
	cout << d.id << " " << d .state;
	return 0 ;
}
2分
登录后查看选项
07

小杨定义了结构体数组,并使用指针访问其中的元素。执行下面代码后输出的是()。

struct Book {
	string name ;
	int pages ;
};
int main() {
	Book books [2] = {{"C++", 120}, {"Math ", 150}};
	Book *p = books + 1;
	p->pages += 10 ;
	cout << books [1].name << " " << books [1].pages ;
	return 0 ;
}
2分
登录后查看选项
08

关于冒泡排序、插入排序和选择排序,下列说法正确的是()。

2分
登录后查看选项
09

某机器人每次可以向前移动1 格或2 格,到达第n 格的方法数由下面函数计算。ways(6) 的返回值是()。

int ways(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 b ;
}
2分
登录后查看选项
10

对一组struct student 的学生按成绩(score)升序排序。排序前后的数据如下。关于该排序的稳定性,判断正确的是()。

struct student {
	int score ;
	char id ;
};

排序前:

(90 , 'A '), (80 , 'B '), (90 , 'C '), (80 , 'D ')

排序后:

(80 , 'B '), (80 , 'D '), (90 , 'C '), (90 , 'A ')
2分
登录后查看选项
11

下面代码使用插入排序将数组按升序排列,横线处应填写()。

void insertionSort(int a [], int n) {
	for (int i = 1; i < n ; i++) {
		int key = a [i];
		int j = i - 1;
		while (j >= 0 &&     ) {
			a [j + 1] = a [j];
			j--;
		}
		a [j + 1] = key;
	}
}
2分
登录后查看选项
12

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

int countPairs(int a [], int n) {
	int cnt = 0 ;
	for (int i = 0 ; i < n ; i++) {
		for (int j = i + 1; j < n ; j++) {
			if (a [i] + a [j] == 100) {
				cnt++;
			}
		}
	}
	return cnt ;
}
2分
登录后查看选项
13

假设文件data .txt 的内容如下:

Blue Sky

执行下面程序后,输出结果是()。

int main() {
	ifstream fin("data .txt");
	string a , b ;
	fin >> a >> b ;
	cout << b << "-" << a ;
	fin .close();
	return 0 ;
}
2分
登录后查看选项
14

执行下面程序后,输出结果是()。

int main() {
	try {
		int age = -1;
		if (age < 0)
			throw age ;
		cout << "A ";
	} catch (const char *msg) {
		cout << "B ";
	} catch (int value) {
		cout << "C " << value ;
	}
	return 0 ;
}
2分
登录后查看选项
15

下面函数使用冒泡排序将数组按升序排列。为了在数组已经有序时提前结束,两处横线应分别填写()。

void bubbleSort(int a [], int n) {
	for (int i = n - 1; i > 0 ; i--) {
		bool changed =     ;
		for (int j = 0 ; j < i; j++) {
			if (a [j] > a [j + 1]) {
				int t = a [j];
				a [j] = a [j + 1];
				a [j + 1] = t ;
				changed =     ;
			}
		}
		if (!changed)
			break;
	}
}
2分
登录后查看选项
判断题 共10道
16

执行下面程序后,变量a 的值为15。

int a = 10 ;
int *p = &a;
*p += 5 ;
2分
登录后查看选项
17

一个函数必须在调用之前既声明又定义。

2分
登录后查看选项
18

下面二维数组在内存中按行优先连续存储,因此*(*(a + 1) + 0) 的值为5。

int a [2][4] = {{1 , 2 , 3 , 4 }, {5 , 6 , 7 , 8 }};
2分
登录后查看选项
19

执行下面程序后会输出20。

void change(int x) {
	x = 20 ;
}
int main() {
	int x = 10 ;
	change(x);
	cout << x;
	return 0 ;
}
2分
登录后查看选项
20

下面结构体初始化语句是合法的。

struct Point {
	int x;
	int y;
};
Point p {3 , 4 };
2分
登录后查看选项
21

对于按升序实现的稳定插入排序,移动元素的条件通常应为a [j] >= key,这样能够保证相等元素的相对顺序不变。

while (j >= 0 && a [j] >= key) {
	a [j + 1] = a [j];
	j--;
}
2分
登录后查看选项
22

下面递推程序计算。当n = 4 时,返回值为24 。

int factorial(int n) {
	int result = 1;
	for (int i = 1; i <= n ; i++) {
		result *= i;
	}
	return result ;
}
2分
登录后查看选项
23

下面两层循环的时间复杂度是O(n2)。

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

假设文件能够正常打开,下面程序会把Welcome 写入log.txt。

int main() {
	ofstream fout("log .txt");
	fout << "Welcome ";
	fout .close();
	return 0 ;
}
2分
登录后查看选项
25

执行下面程序时,catch (int e) 能够捕获由throw "Error " 抛出的异常,因此程序输出Caught。

int main() {
	try {
		throw "Error ";
	} catch (int e) {
		cout << "Caught ";
	}
	return 0 ;
}
2分
登录后查看选项
编程题 共2道
26

新汉诺塔

题目描述

汉诺塔问题是最经典的递推问题之一:

有三个可以放圆盘柱子,编号为A、B和C。开始时柱子A上套着 n 个圆盘,它们从上到下按照从小到大的顺序排列。我们的任务是要把这 n 个圆盘移到柱子C上,并保持它们的原有顺序不变。

在移动圆盘的过程中,需要遵守以下规则:

1.圆盘只能从一根柱子顶部拿出,从另一根柱子顶部放入。

2.每次只能移动一个圆盘。

3.小圆盘必须时刻位于大圆盘之上。

小杨在学习了汉诺塔问题后,决定添加一个新规则:

4.每一次移动,圆盘只能从A移动到B,从B移动到C,或者从C移动到A;其它移动是不允许的。

在新规则下,给定圆盘数量n,试问最少移动步数是多少?

输入

输入一个正整数 n,表示圆盘的数量。

输出

输出一个整数,表示在新规则下将 n 个圆盘从 A 移动到 C 所需的最少移动步数。

数据范围

n≤20

输入样例1

2

输出样例1

7

输入样例2

3

输出样例2

21

25分
登录后作答
27

有序网格

题目描述

小A有一个 n 行 m 列格子组成的二维网格,从上到下依次是第 1 行到第 n 行,从左到右依次是第 1 列到第 m 列。

每个格子里有一个数字,第 i 行第 j 列的格子里的数字是ai,j。

小A想让二维网格变得有序,因此他先对每一行从左到右按升序排序,再对每一列从上到下按升序排序。以下是一个先完成行排序再完成列排序的例子:

小 A 想知道二维网格经过以上排序后的结果。你能编写程序帮助他吗?

输入

第一行,两个正整数n,m,分别二维网格的行数与列数。

接下来n行,每行m个整数a_(i,1),...,a_(i,m),表示二维网格种的数字。

输出

输出n行,每行m个整数,表示二维网格先完成行排序再完成列排序后的结果。

数据范围

2≤n≤10,2≤m≤10,1≤a_(i,j)≤100

输入样例1

3 2

6 5

4 3

2 1

输出样例1

1 2

3 4

5 6

输入样例2

3 4

1 3 2 5

6 2 4 4

5 4 1 3

输出样例2

1 2 3 5

1 3 4 5

2 4 4 6

25分
登录后作答