信奥刷题站
GESP 认证 4级2024-09

2024年9月 GESP C++ 4级

题量
27 题
客观题
25 题
建议时长
60 分钟
卷面总分
100 分

2024年9月 GESP C++ 4级认证考试真题(含编程操作题部分)

开始整卷模拟计时作答 · 交卷即时判分 · 错题自动进错题本(需登录)2 道编程大题:在线只判客观题,编程题请自行前往洛谷等 OJ 提交验证

// questions

题目预览

1
单选题2

在 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

在 C++ 中,形参与实参的关系描述正确的是( )。

A

形参在函数调用时指定,实参在函数定义时传递

B

形参在函数定义时指定,实参在函数调用时传递

C

形参和实参可以互换

D

形参和实参必须是完全相同的类型,不能有任何差异。

3
单选题2

运行以下代码,屏幕上将输出( )。

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

100 200 100 200

B

100 200 100 300

C

100 200 200 200

D

100 200 200 300

4
单选题2

运行下面代码,屏幕上输出是( )。

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

242424

B

999

C

777

D

不确定

5
单选题2

运行下面代码片段的结果是( )。

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

xxx 赋值为 242424

B

yyy 赋值为 202020

C

p 指向 q 的地址

D

q 指向 p 的地址

6
单选题2

在 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

在 C++ 中,( )正确声明了一个 333444 列的二维数组。

A

int arr[3, 4];

B

int arr[3][4];

C

int arr[4][3];

D

int arr(3, 4);

8
单选题2

一个二维数组定义为 int arr[3][4];(假设一个 int 变量占 444 个字节),则 arr[0] 占用( )个字节的内存。

A

333

B

444

C

121212

D

161616

9
单选题2

下面代码采用递推算法来实现整数 nnn 的阶乘(n!n!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

在排序算法中,稳定性指的是( )。

A

排序后数据不会丢失

B

排序后相同元素的相对顺序保持不变

C

排序后数据不会被修改

D

排序后数据的时间复杂度不变

11
单选题2

下面代码实现了冒泡排序函数,则横线上应填写( )。

//交换数组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; // 此轮“冒泡”未交换任何元素
    }
}
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

上一题算法的时间复杂度为( )。

A
B
C
D
13
单选题2

下面代码实现了插入排序函数(升序),则横线上应填写( )。

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

小杨用文件重定向实现在 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;
}
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

运行下面的代码,屏幕上将输出( )。

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

代码 int a = 10; int* p = &a; 可以正确定义指针和初始化指针。

17
判断题2

在 C++ 中,引用传递允许函数修改传递给它的参数的值。

18
判断题2

指针的大小与其所指向的变量的数据类型的大小相同。

19
判断题2

二维数组的行的大小必须在定义时确定,列的大小可以动态变化。

20
判断题2

递推算法通过逐步求解当前状态和前一个或几个状态之间的关系来解决问题。

21
判断题2

选择排序是稳定的排序算法。

22
判断题2

插入排序的时间复杂度总是比冒泡排序低。

23
判断题2

在 C++ 中,如果没有捕获到异常(没有匹配的 catch 块),程序会继续执行而不会终止。

24
判断题2

以下代码用递推法求斐波那契数列的第 nnn 项,时间复杂度为指数级。

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;
}
25
判断题2

执行下面 C++ 代码后,输出的是 202020

int point(int* p){
    return *p * 2;
}
int main() {
    int a = 10;
    int* p = &a;
    *p = point(p);
    cout << *p << endl;
}
GESP 编程操作题
26
编程题25

试题名称:黑白方块

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

小杨有一个 nnnmmm 列的网格图,其中每个格子要么是白色,要么是黑色。 小杨想知道网格图中是否存在一个满足如下条件的子矩形:

  • 子矩形由 444444 列组成;
  • 子矩形的第 111 行和第 444 行只包含白色格子;
  • 对于子矩形的第 222 行和第 333 行,只有第 111 个和第 444 个格子是白色的,其余格子都是黑色的;

请你编写程序帮助小杨判断。

输入格式

第一行包含一个正整数 ttt,代表测试用例组数。
接下来是 ttt 组测试用例。对于每组测试用例,一共 n+1n+1n+1 行。
第一行包含两个正整数 n,mn,mn,m,含义如题面所示。
之后 nnn 行,每行一个长度为 mmm010101 串,代表网格图第 iii 行格子的颜色,如果为 000,则对应格子为白色,否则为黑色。

输出格式

对于每组测试用例,如果存在,输出 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≤t≤101 \leq t\leq 101t101≤n,m≤1001 \leq n,m \leq 1001n,m100

本题为编程大题:请复制题面到洛谷 / GESP OJ 等平台编写并提交代码(本站不判分)
27
编程题25

试题名称:区间排序

时间限制:1.0 s | 内存限制:512.0 MB

题目描述

小杨有一个包含 nnn 个正整数的序列 aaa

小杨计划对序列进行多次升序排序,每次升序排序小杨会选择一个区间 [l,r][l,r][l,r]l≤rl \leq rlr)并对区间内所有数字,即进行升序 al,al+1,…ara_l, a_{l + 1}, \dots a_ral,al+1,ar 排序。每次升序排序会在上一次升序排序的结果上进行。

小杨想请你计算出多次升序排序后的序列。

输入格式

第一行包含一个正整数 nnn,含义如题面所示。
第二行包含 nnn 个正整数 a1,a2,…ana_1, a_2, \dots a_na1,a2,an,代表序列 aaa
第三行包含一个正整数 qqq,代表排序次数。
之后 qqq 行,每行包含两个正整数 l,rl, rl,r,代表将区间 [li,ri][l_i, r_i][li,ri] 内所有数字进行升序排序。

输出格式

输出一行包含 nnn 个正整数,代表多次升序排序后的序列。

样例输入 #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,5,1,2][3,4,5,1,2]
  • 第二次升序排序后,序列为 [3,4,1,5,2][3,4,1,5,2][3,4,1,5,2]
  • 第三次升序排序后,序列为 [1,3,4,5,2][1,3,4,5,2][1,3,4,5,2]

数据规模与约定

对于全部的测试数据,保证 1≤n,ai,q≤1001 \leq n, a_i, q \leq 1001n,ai,q1001≤li≤ri≤n1 \leq l_i \leq r_i \leq n1lirin

本题为编程大题:请复制题面到洛谷 / GESP OJ 等平台编写并提交代码(本站不判分)