2024年9月 GESP C++ 4级认证考试真题(含编程操作题部分)
选 单选题(共 15 题,每题 2 分)
在 C++ 中,( )正确定义了一个返回整数值并接受两个整数参数的函数。
在 C++ 中,形参与实参的关系描述正确的是( )。
运行以下代码,屏幕上将输出( )。
#include <iostream>
using namespace std;
int var = 100;
void function() {
int var = 200;
cout << var << " ";
cout << ::var << " ";
}
int main() {
cout << var << " ";
function();
var += 100;
cout << var << " ";
return 0;
}
运行下面代码,屏幕上输出是( )。
int arr[3] = {24, 9, 7};
int* p = arr;
p++;
cout << *p << endl;
运行下面代码片段的结果是( )。
int x = 20;
int y = 24;
int* p = &x;
int* q = &y;
p = q;
在 C++ 中,( )正确定义一个名为 student 的结构体,其中包含一个 name 字符数组和一个 age 整数?
在 C++ 中,( )正确声明了一个 $3$ 行 $4$ 列的二维数组。
一个二维数组定义为 int arr[3][4];(假设一个 int 变量占 $4$ 个字节),则 arr[0] 占用( )个字节的内存。
下面代码采用递推算法来实现整数 $n$ 的阶乘($n!$),则横线上应填写( )。
int factorial(int n) {
int result = 1;
for (int i = 2; i <= n; i++) {
________________________________ // 在此处填入代码
}
return result;
}
在排序算法中,稳定性指的是( )。
下面代码实现了冒泡排序函数,则横线上应填写( )。
//交换数组arr的第i个元素和第j个元素
void swap(vector<int> &arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
int bubble_sort(vector<int> &arr) {
for (int i = arr.size() - 1; i > 0; i--) {
bool flag = false; // 标志位
________________________________ { // 在此处填入代码
if (arr[j] > arr[j + 1]) {
swap(arr, i, j);
flag = true;
}
}
if (!flag)
break; // 此轮“冒泡”未交换任何元素
}
}
上一题算法的时间复杂度为( )。
下面代码实现了插入排序函数(升序),则横线上应填写( )。
void insertion_sort(vector<int> &nums) {
for (int i = 1; i < nums.size(); i++) {
int base = nums[i], j = i - 1;
________________________________ { // 在此处填入代码
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = base;
}
}
小杨用文件重定向实现在 log.txt 文件中输出日志,则下面横线上应填写( )。
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
ofstream log_file("log.txt");
streambuf* original_cout = cout.rdbuf();
cout.rdbuf(log_file.rdbuf());
___________________________________ // 在此处填入代码
cout.rdbuf(original_cout); // 恢复原始的标准输出缓冲区
return 0;
}
运行下面的代码,屏幕上将输出( )。
#include <iostream>
using namespace std;
int divide(int a, int b) {
if (b == 0) {
throw runtime_error("division by zero error ");
}
return a / b;
}
int main() {
int x = 10;
int y = 0; // 设为 0 会导致除零错误
try {
int result = divide(x, y);
cout << "result: " << result << endl;
} catch (const runtime_error& e) {
cout << "caught an exception: " << e.what() << endl;
}
return 0;
}
判 判断题(共 10 题,每题 2 分)
代码 int a = 10; int* p = &a; 可以正确定义指针和初始化指针。
在 C++ 中,引用传递允许函数修改传递给它的参数的值。
指针的大小与其所指向的变量的数据类型的大小相同。
二维数组的行的大小必须在定义时确定,列的大小可以动态变化。
递推算法通过逐步求解当前状态和前一个或几个状态之间的关系来解决问题。
选择排序是稳定的排序算法。
插入排序的时间复杂度总是比冒泡排序低。
在 C++ 中,如果没有捕获到异常(没有匹配的 catch 块),程序会继续执行而不会终止。
以下代码用递推法求斐波那契数列的第 $n$ 项,时间复杂度为指数级。
int fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
int f0 = 0; // F(0)
int f1 = 1; // F(1)
int current;
for (int i = 2; i <= n; i++) {
current = f0 + f1; // F(n) = F(n-1) + F(n-2)
f0 = f1;
f1 = current;
}
return current;
}
执行下面 C++ 代码后,输出的是 $20$。
int point(int* p){
return *p * 2;
}
int main() {
int a = 10;
int* p = &a;
*p = point(p);
cout << *p << endl;
}
编 编程操作题(共 2 题,共 50 分)
试题名称:黑白方块
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
小杨有一个 $n$ 行 $m$ 列的网格图,其中每个格子要么是白色,要么是黑色。
小杨想知道网格图中是否存在一个满足如下条件的子矩形:
- 子矩形由 $4$ 行 $4$ 列组成;
- 子矩形的第 $1$ 行和第 $4$ 行只包含白色格子;
- 对于子矩形的第 $2$ 行和第 $3$ 行,只有第 $1$ 个和第 $4$ 个格子是白色的,其余格子都是黑色的;
请你编写程序帮助小杨判断。
输入格式
第一行包含一个正整数 $t$,代表测试用例组数。
接下来是 $t$ 组测试用例。对于每组测试用例,一共 $n+1$ 行。
第一行包含两个正整数 $n,m$,含义如题面所示。
之后 $n$ 行,每行一个长度为 $m$ 的 $01$ 串,代表网格图第 $i$ 行格子的颜色,如果为 $0$,则对应格子为白色,否则为黑色。
输出格式
对于每组测试用例,如果存在,输出 Yes,否则输出 No。
样例输入 #1
3
1 4
0110
5 5
00000
01100
01100
00001
01100
5 5
00000
01100
01110
00001
01100
样例输出 #1
No
Yes
No
说明/提示
样例 1 解释
0000
0110
0110
0000
数据规模与约定
对全部的测试数据,保证 $1 \leq t\leq 10$,$1 \leq n,m \leq 100$。
试题名称:区间排序
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
小杨有一个包含 $n$ 个正整数的序列 $a$。
小杨计划对序列进行多次升序排序,每次升序排序小杨会选择一个区间 $[l,r]$($l \leq r$)并对区间内所有数字,即进行升序 $a_l, a_{l + 1}, \dots a_r$ 排序。每次升序排序会在上一次升序排序的结果上进行。
小杨想请你计算出多次升序排序后的序列。
输入格式
第一行包含一个正整数 $n$,含义如题面所示。
第二行包含 $n$ 个正整数 $a_1, a_2, \dots a_n$,代表序列 $a$。
第三行包含一个正整数 $q$,代表排序次数。
之后 $q$ 行,每行包含两个正整数 $l, r$,代表将区间 $[l_i, r_i]$ 内所有数字进行升序排序。
输出格式
输出一行包含 $n$ 个正整数,代表多次升序排序后的序列。
样例输入 #1
5
3 4 5 2 1
3
4 5
3 4
1 3
样例输出 #1
1 3 4 5 2
说明/提示
样例 1 解释
- 第一次升序排序后,序列为 $[3,4,5,1,2]$;
- 第二次升序排序后,序列为 $[3,4,1,5,2]$;
- 第三次升序排序后,序列为 $[1,3,4,5,2]$;
数据规模与约定
对于全部的测试数据,保证 $1 \leq n, a_i, q \leq 100$,$1 \leq l_i \leq r_i \leq n$。