GESP 2024年9月_C++四级试卷

从PDF导入:GESP 2024年9月_C++四级试卷

C++ 120分钟 总分 100.0 27 题
试卷题目预览
第1题 中级 2.0分 单选
在C++中,( )正确定义了一个返回整数值并接受两个整数参数的函数。
A. int add(int a, int b) { return a + b; }
B. void add(int a, int b) { return a + b; }
C. int add(a, b) { return a + b; }
D. void add(int a, int b) { return a - b; }
第2题 中级 2.0分 单选
在C++中,形参与实参的关系描述正确的是( )。
A. 形参在函数调用时指定,实参在函数定义时传递
B. 形参在函数定义时指定,实参在函数调用时传递
C. 形参和实参可以互换
D. 形参和实参必须是完全相同的类型
第3题 中级 2.0分 单选
运行以下代码,屏幕上将输出( )。

int x = 20;
int y = 24;
int* p = &x;
int* q = &y;
p = q;

A. 100 200 100 200
B. 100 200 100 300
C. 100 200 200 200
D. 100 200 200 300
第4题 中级 2.0分 单选
运行下面代码,屏幕上输出是( )。

int arr[3] = {24, 9, 7};
int* p = arr;
p++;
cout << *p << endl;

A. 24
B. 9
C. 7
D. 不确定
第5题 中级 2.0分 单选
运行下面代码片段的结果是( )。

int x = 20;
int y = 24;
int* p = &x;
int* q = &y;
p = q;

A. 将x赋值为24
B. 将y赋值为20
C. 将p指向c的地址
D. 将p指向y的地址
第6题 中级 2.0分 单选
在C++中,( )正确定义一个名为student的结构体,其中包含一个name字符数组和一个age整数?
A. struct student { char name[20]; int age; };
B. student struct { char name[20]; int age; };
C. student struct { string name; int age; };
D. struct student { char[20] name; int age; };
第7题 中级 2.0分 单选
在C++中,( )正确声明了一个3行4列的二维数组。
A. int arr[3, 4];
B. int arr[3][4];
C. int arr[4][3];
D. int arr(3, 4);
第8题 中级 2.0分 单选
一个二维数组定义为int arr[3][4];(假设一个int变量占4个字节),则arr[0]占用( )个字节的内存。
A. 3
B. 4
C. 12
D. 16
第9题 中级 2.0分 单选
下面代码采用递推算法来实现整数n的阶乘,则横线上应填写( )。

int factorial(int n) {
int result = 1;
for (int i = 2; i <= n; i++) {
// 在此处填入代码
}
return result;
}

A. result *= i;
B. result += i;
C. result *= result;
D. result += result;
第10题 中级 2.0分 单选
在排序算法中,稳定性指的是( )。
A. 排序后数据不会丢失
B. 排序后相同元素的相对顺序保持不变
C. 排序后数据不会被修改
D. 排序后数据的时间复杂度不变
第11题 中级 2.0分 单选
下面代码实现了冒泡排序函数,则横线上应填写( )。

for (int i = 0; i < arr.size() - 1; i++) {
bool flag = false;
________________ {
if (arr[j] > arr[j + 1]) {
swap(arr, i, j);
flag = true;
}
}
if (!flag) break;
}

A. for (int j = 0; j < arr.size() - 1; j++)
B. for (int j = arr.size() - 1; j > 0; j--)
C. for (int j = 0; j < i; j++)
D. for (int j = i-1; j <= 0; j--)
第12题 中级 2.0分 单选
上一题算法的时间复杂度为( )。
A. O(n²)
B. O(2ⁿ)
C. O(1)
D. O(n)
第13题 中级 2.0分 单选
下面代码实现了插入排序函数(升序),则横线上应填写( )。

void insertion_sort(vector &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;
}
}

A. while (j >= 0 && nums[j] > base)
B. while (j > 0 && nums[j] > base)
C. while (j >= 0 && nums[j] < base)
D. while (j > 0 && nums[j] < base)
第14题 中级 2.0分 单选
小杨用文件重定向实现在log.txt文件中输出日志,则下面横线上应填写( )。

#include
#include
#include
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;
}

A. cout << "This output will go to the log file." << endl;
B. log_file << "This output will go to the log file." << endl;
C. cout >> "This output will go to the log file." >> endl;
D. log_file >> "This output will go to the log file." >> endl;
第15题 中级 2.0分 单选
运行下面的代码,屏幕上将输出( )。

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;
try {
int result = divide(x, y);
cout << "result: " << result << endl;
} catch (const runtime_error& e) {
cout << "caught an exception: " << e.what() << endl;
}
return 0;
}

A. division by zero error result: caught an exception:
B. result: caught an exception: division by zero error
C. caught an exception: division by zero error
D. division by zero error caught an exception: division by zero error
第16题 中级 2.0分 判断
代码int a = 10; int* p = &a;可以正确定义指针和初始化指针。
T. 正确
F. 错误
第17题 中级 2.0分 判断
在C++中,引用传递允许函数修改传递给它的参数的值。
T. 正确
F. 错误
第18题 中级 2.0分 判断
指针的大小与其所指向的变量的数据类型的大小相同。
T. 正确
F. 错误
第19题 中级 2.0分 判断
二维数组的行的大小必须在定义时确定,列的大小可以动态变化。
T. 正确
F. 错误
第20题 中级 2.0分 判断
递推算法通过逐步求解当前状态和前一个或几个状态之间的关系来解决问题。
T. 正确
F. 错误
第21题 中级 2.0分 判断
选择排序是稳定的排序算法。
T. 正确
F. 错误
第22题 中级 2.0分 判断
插入排序的时间复杂度总是比冒泡排序低。
T. 正确
F. 错误
第23题 中级 2.0分 判断
在C++中,如果没有捕获到异常(没有匹配的catch块),程序会继续执行而不会终止。
T. 正确
F. 错误
第24题 中级 2.0分 判断
以下代码用递推法求斐波那契数列的第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++) {
return current
current = f0+ f1; // F(n) = F(n-1) + F(n-2)
f0 = f1;
f1 = current;
}
;
}

T. 正确
F. 错误
第25题 中级 2.0分 判断
执行下面C++代码后,输出的是20。

int point(int* p){
return *p * 2;
}
int main() {
int a = 10;
int* p = &a;
*p = point(p);
cout << *p << endl;
}

T. 正确
F. 错误
第26题 中级 25.0分 编程
黑白方块

时间限制:1.0s 内存限制:512.0MB
小杨有一个n行m列的网格图,其中每个格子要么是白色,要么是黑色。小杨想知道网格图中是否存在一个满足如下条件的子矩形:
• 子矩形由4行4列组成
• 子矩形的第1行和第4行只包含白色格子
• 对于子矩形的第2行和第3行,只有第1个和第4个格子是白色的,其余格子都是黑色的

【输入格式】
第一行包含一个正整数t,代表测试用例组数。对于每组测试用例:第一行包含两个正整数n,m。之后n行,每行一个长度为m的01串,0代表白色,1代表黑色。
【输出格式】
对于每组测试用例,如果存在,输出Yes,否则输出No。
【样例输入】
3
1 4
0110
5 5
00000
01100
01100
00001
01100
5 5
00000
01100
01110
00001
01100
【样例输出】
No
Yes
No
对于全部数据,保证有1≤t≤10,1≤n,m≤100。
第27题 中级 25.0分 编程
区间排序

时间限制:1.0s 内存限制:512.0MB
小杨有一个包含n个正整数的序列a₁,a₂,...,an。小杨计划对序列进行多次升序排序,每次选择一个区间[lᵢ,rᵢ]并对区间内所有数字进行升序排序。每次升序排序会在上一次升序排序的结果基础上进行。请你输出多次升序排序后的序列。

【输入格式】
第一行包含一个正整数n。第二行包含n个正整数a₁,a₂,...,an。第三行包含一个正整数q。之后q行,每行包含两个正整数lᵢ,rᵢ。
【输出格式】
输出一行包含n个正整数,代表多次升序排序后的序列。
【样例输入】
5
3 4 5 2 1
3
4 5
3 4
1 3
【样例输出】
1 3 4 5 2
对于全部数据,保证有1≤n≤100,1≤q≤100,1≤lᵢ≤rᵢ≤n。
💬