试卷总分: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

E776 CCF-GESP编程能力等级认证-C++ -202506GESPC++四级试卷-考试

选择题 共15道

01 在C++中,声明一个指向整型变量的指针的正确语法是( )。 2分
登录后查看选项
02 下面的函数接收一个 行 列的二维数组并输出其中元素,则横线上不能填写( )。
void printArray(________) { 
    for (int i = 0; i < 3; ++i) 
        for (int j = 0; j < 4; ++j) 
            std::cout << arr[i][j] << " "; 
}
2分
登录后查看选项
03

在C++中, int arr[3][4] 和 int* arr = new int[12] 均可模拟一个 行 列的二维数组。关于这两种方式,下面说法错误的是( )。

2分
登录后查看选项
04

关于以下 C++代码,说法正确的是( )。

int main() {

   greet();

   return 0;

}


void greet() {

   cout << "Hello!" << endl;

}

2分
登录后查看选项
05

在C++中,如果希望通过函数修改传入的结构体对象的内容,应该使用哪种参数传递方式?

2分
登录后查看选项
06

以下哪个选项正确描述了C++中形参和实参的区别?

2分
登录后查看选项
07

运行如下代码会输出( )。

int value = 100;


void print1() {

   int value = 50;

   cout << value << " ";

   cout << ::value << " ";

}


   void print2() {

       cout << value << " ";

}


print1();

print2();

2分
登录后查看选项
08

小杨在整理一副扑克牌的所有红心扑克牌,使其从小到大排列。他的做法是:最开始抓到第1张扑克牌被认为已经排好序;然后抓第2张扑克牌,将其插入至有序部分的正确位置;不断循环步骤,每次将新抓到扑克牌插入至有序部分,直至抓完所有扑克牌,这样抓牌结束时就完成了扑克牌的排序。小杨这种整理扑克牌的方式与( )排序的方式最接近。

2分
登录后查看选项
09

以下哪种情况是使用插入排序的合适场景?

2分
登录后查看选项
10

以下关于递推算法基本思想的描述,正确的是( )。

2分
登录后查看选项
11

给定如下算法,其时间复杂度为( )。

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;

}

2分
登录后查看选项
12

下述斐波那契数列计算的时间复杂度是( )。

int fibonacci(int n) {

   if (n == 0) return 0;

   if (n == 1) return 1;

   return fibonacci(n - 1) + fibonacci(n - 2);

}

2分
登录后查看选项
13

关于下面 C++ 程序的描述,( )最准确。

ifstream in("data.txt");

string line;

while (getline(in, line)) {

       cout << line << endl;

}

2分
登录后查看选项
14

在C++中,异常处理机制(try-catch块)的主要目的是( )。

2分
登录后查看选项
15

为了提高冒泡排序的效率,如果某轮“冒泡”中没有执行任何交换操作,说明数组已经完成排序,可直接返回结果,则两条横线上分别应该填写( )。

void bubbleSortWithFlag(vector &nums) {
	for (int i = nums.size() - 1; i > 0; i--) {
		bool flag;    
		______ // 在此处填入代码
		for (int j = 0; j < i; j++) {    
			if (nums[j] > nums[j + 1]) {    
				swap(nums[j], nums[j + 1]);
				__________ // 在此处填入代码
			}    
		}
		if (!flag)    
			break;
	}
}
2分
登录后查看选项

判断题 共10道

16

下面C++代码正确声明了一个返回 int 类型、接受两个 int 参数的函数。

int add(int, int);

2分
登录后查看选项
17

下面C++代码的输出是 15 。

void foo(int x) {

   x += 5;

}

int main() {

   int a = 10;

   foo(a);

   cout << a << endl;

}

2分
登录后查看选项
18

下面c++代码在一个结构体中又定义了别的结构体。这种结构嵌套定义的方式语法不正确。

#include <string>

#include <vector>


using namespace std;


struct Library {

       struct Book {

               struct Author {

                       string name;

                       int birthYear;

               };


               string title;

               int year;

               Author author;

       };


       string name;

       vector<Book> books;

};

2分
登录后查看选项
19

在C++中,相比于值传递,使用引用传递作的优点可以直接操作和修改原始变量,避免数据拷贝,提高效率。

2分
登录后查看选项
20

下面这段代码不合法,因为每一行都必须显式初始化 个元素。

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

2分
登录后查看选项
21

以下程序中使用了递推方式计算阶乘(n!=1*2...*n),计算结果正确。

int factorial(int n) {

int res = 1;

for (int i = 0; i < n; ++i) {

res *= i;

}

return res;

}

2分
登录后查看选项
22

无论初始数组是否有序,选择排序都执行O(n^2)次比较。

2分
登录后查看选项
23

以下C++代码,尝试对有 n 个整数的数组 arr 进行排序。这个代码实现了选择排序算法。

for (int i = 0; i < n - 1; ++i) {

       int minIndex = i;

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

               if (arr[j] < arr[minIndex])

                       minIndex = j;

       }

       if (minIndex != i)

               swap(arr[i], arr[minIndex]);

}

2分
登录后查看选项
24

如果一个异常在 try 块中抛出但没有任何 catch 匹配,它将在编译时报错。

2分
登录后查看选项
25

下面C++代码实现将 Hello 写入 data.txt 。

ofstream out("data.txt");

out << "Hello";

out.close();

2分
登录后查看选项

编程题 共2道

26

画布裁剪


题目描述

小A 在高为 ( h ) 宽为 ( w ) 的矩形画布上绘制了一幅画。由于画布边缘留白太多,小A 想适当地裁剪画布,只保留画的主体。具体来说,画布可以视为 ( h ) 行 ( w ) 列的字符矩阵,其中的字符均为 ASCII 码位于 ( 33 ~ 126 ) 之间的可见字符,小A 只保留画布中由第 ( x1 ) 行到第 ( x2 ) 行、第 ( y1 ) 列到第 ( y2 ) 列构成的子矩阵。

小A 将画布交给你,你能帮他完成画布的裁剪吗?


输入格式

第一行,两个正整数 (h, w),分别表示画布的行数与列数。 第二行,四个正整数 (x_1, x_2, y_1, y_2),表示保留的行列边界。 接下来 (h) 行,每行一个长度为 (w) 的字符串,表示画布内容。


输出格式

输出共 (x2 - x1 + 1) 行,每行一个长度为 (y2 - y1 + 1) 的字符串,表示裁剪后的画布。


输入样例 1
3 5
2 2 2 4
.....
.>_<.
.....
输出样例 1
>_<
输入样例 2
5 5
1 2 3 4
AbCdE
fGhIk
LmNoP
qRsTu
VwXyZ
输出样例 2
Cd
hI

数据范围

对于所有测试点,保证 ( 1 <= h, w <= 100 ),( 1 <= x1 <= x2 <= h ),( 1 <= y1 <= y2 <= w )。

25分
登录后作答
27

排序


题目描述

体育课上有 n 名同学排成一队,从前往后数第 i 位同学的身高为 hi,体重为 wi。
目前排成的队伍看起来参差不齐,老师希望同学们能按照身高从高到低的顺序排队,如果身高相同则按照体重从重到轻排序。
在调整队伍时,每次只能交换相邻两位同学的位置。
老师想知道,最少需要多少次交换操作,才能将队伍调整成目标顺序。

输入格式

第一行,一个正整数 n,表示队伍人数。
接下来 n 行,每行两个正整数 hi 和 wi,表示第 i 个同学的身高和体重。


输出格式

输出一行,包含一个整数,表示最小的交换次数。


输入样例 1
5
1 60
3 70 
2 80 
4 55
4 50
输出样例 1
8
输入样例 2
5
4 0
4 0
2 0
3 0
1 0
输出样例 2
1
数据范围

对于所有测试点,保证1<=n<=3000,0<=hi,wi<=10^9

25分
登录后作答