GESP-C++2026.3四级真题解析

四季读书网 3 0
GESP-C++2026.3四级真题解析
   小羊们好,今天开始我将会带来GESP-C++四级的真题解析,这里希望在分享中能让你突然明白一个易错点那就是有用!       这里不会给出编程题答案,会给出要注意的点或者思路,如果有问题欢迎评论,如果你着急的话也添加我的个人微信(ldw_0711)询问。

写在最前面,希望你能够按照考级的时间要求认真完成后,再来查阅解析!建议用电脑浏览效果更佳!

一、选择题

1.参数x默认为2,无实参调用时结果为6。

答案为B

2.a *p **q

   5 变量a的地址 二级指针(p的地址:a的地址)

   12 12

答案为B

3.(*p)[4]:定义数组指针,指针4个一维数组

*(*(p + 2) + 1)等价于a[2][1]=10。

答案为B

4.函数传参的三种方式:

a拷贝传参不能修改实参的值;

b引用传参修改为+2;

c指针传参修改为+3

x y z

1 1 1

1 3 4

答案为B

5.f(x)局部变量x=10通过引用传参方式修改为12

::x:作用域解析符,强制访问全局作用域的 x,值为 3。

答案为D

6.结构体初始化的语法格式为:

struct 结构体名{

    属性1;

    ......

};

结构体名 结构体变量={属性值1,......};

答案为B

7.函数g(S s):值传递是拷贝传参,

函数h(S &s):引用传递是别名,会修改实参的值

s.a s.b

1 12

答案为B

8.选项A:递归是自己调用自己

选项B:说法正确的

选项C:递推的核心是 “逐步推导”,和问题的复杂度类型无关,既可以解决简单的线性问题,也可以处理复杂问题。

选项D:递推是正向推导:从初值开始,一步步算到目标结果,全程单向推进,不需要回溯。

答案为B

9.i a b c n

1 2 0 6

  3 2 3 3

  4 3 5 5

  5 5 8 8

  6 8 13 13

答案为B

10.排序稳定性指的是相同元素的相对位置不变,只有这一个评判指标,所以选项A错误,选项B正确。

答案为B

11.升序插入排序的核心条件:当已排序元素a[j] > 待插入元素key时,说明a[j]需要向后移动(给 key 腾出位置),直到a[j] <= key或 j 越界,此时j+1就是 key 的正确插入位置。

答案为B

12.注意:时间复杂度关注的是增长趋势,而非具体次数!

答案为C

13.输出重定向到文件中:

选项A:可以实现√

freopen("log.txt", "w", stdout):将标准输出流(stdout)重定向到 log.txt("w" 表示写入模式);

cout 底层依赖 stdout,因此 cout 的输出会被重定向到文件;

选项B:不能实现×

ofstream outFile("log.txt")仅创建了一个指向 log.txt 的文件输出流,但没有将 cout 和这个流关联;

cout << ...仍会输出到控制台(默认标准输出),而非 log.txt;

这个代码只是 “创建了文件但没往里面写内容”,cout 的输出完全没定向到文件。

选项C:可以实现√

cout.rdbuf(log_file.rdbuf())是 C++ 风格的核心重定向方式:替换 cout 的输出缓冲区为文件流的缓冲区;

此时 cout 的所有输出都会写入 log.txt,而非控制台;

选项D:可以实现√

这是最直接的文件写入方式:不依赖 cout 重定向,直接通过ofstream对象outFile将字符串写入 log.txt;

答案为B

14.异常处理:

当b=0时,抛出了int类型异常,所以捕获时对应int类型异常,输出B

答案为B

15.排行榜时分数越高,排名越靠前,所以分数增加后,前一位玩家分数更低时,当前玩家需要继续向前挪,对应代码是:

cur.score > players[i-1].score

而边界条件i>0是必须要限制的

答案为A

二、判断题

1.引用传参会修改实参的值,所以变量a的值变成了15。

答案为√

2.引用的核心原理:变量的别名,绑定后不可更改。

答案为√

3.&a[1][2]-&a[0][1]表示的是元素差,也就是3。

答案为×

4.函数发生了重载,因为在calc(int x, int y = 10)和calc(int x)中,函数名一样,参数个数不同,所以编译失败。

答案为×

5.调用函数f,所以先输出了局部变量x的值20;

接下来输出的就是全局变量x的值10。

答案为√

6.局部未初始化指针是野指针,而非 nullptr。

答案为×

7.这里写的代码是结构体的嵌套,Equipment和Skill作为GameCharacter的内部结构体,定义和成员声没有语法错误。

答案为√

8.ofstream fout("data.txt")仅完成 “打开文件” 的操作,但没有将任何内容写入这个文件流;

cout << "Hello"是将字符串输出到控制台(标准输出),和fout文件流毫无关联。

答案为×

9.适用场景是不同的:

插入排序适用于数据接近有序、数据量小,有稳定性要求;

选择排序适用于交换成本高,不在乎稳定性,注意不适合接近有序的数据(因为不管有序无序,选择都会比较所有数据)。

答案为×

10.这里斐波那契数列的实现方式是迭代,所以时间复杂度是O(n)。

答案为×

三、编程题


小提醒:编程题我这边想了想,最好是你们要先有自己的思考和思路,当然可以参考我的思路,具体代码如果有同学需要,我会看情况发在评论里


1.山之谷

题目描述

现有一片山地,可以视为一个 N 行 M 列的网格图,第 i 行 j 列的海拔为 hi,j。

如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 8 个方向)的海拔,则称该单元格为山谷。

请你数一数该片山地中有多少山谷。

输入格式

第一行包含 2 个整数 N, M,表示山地的大小。

之后 N 行,每行包含 M 个整数 hi,1, hi,2,...,hi,M,表示海拔。

输出格式

输出 1 行,包含 1 个整数 ,表示山谷的数量。

样例

输入样例

3 5

7 6 6 7 9

6 5 6 7 6

6 5 7 8 9

输出样例

3

数据范围

保证 1≤n,m≤100, 1≤hi,j≤10^5。

【解题思路】

方法1:暴力枚举

逐一遍历每个单元格,逐个检查其 8 个方向的相邻单元格:

初始化标记 f = true(默认当前单元格是山谷);

对每个方向,先判断边界合法性(如i-1≥1),再检查 “相邻格海拔 < 当前格海拔”:

若存在任意一个合法相邻格海拔 < 当前格 → 不是山谷(f = false);

利用f短路判断,提前终止无效检查;

若所有合法相邻格海拔 ≥ 当前格(f保持true),则计数 + 1。


方法2:方向数组优化

将 “单元格是否为山谷” 的判断封装为 check 函数,遍历每个单元格调用 check 验证:

定义 8 方向偏移数组dx/dy,统一枚举所有相邻方向;

check 函数逻辑:

遍历 8 个方向,跳过越界单元格;

若存在任意相邻格海拔 ≤ 当前格 → 返回false(不是山谷);

所有合法相邻格都满足条件 → 返回true(是山谷);

遍历所有单元格,统计 check 返回true的数量。

【考纲知识点】二维数组操作、枚举思想

2.礼盒排序

题目描述

商店推出了许多礼盒,每个礼盒中包含 k 件商品,每件商品都有一个价格。

现在需要对这些礼盒进行排序,排序规则如下:

1. 先按礼盒总价格从小到大排序;

2. 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;

3. 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;

4. 如果仍然相同,按礼盒编号从小到大排序。

请输出排序后的礼盒编号。

输入格式

第一行包含两个整数 n 和 k,分别表示礼盒数量和每个礼盒中商品的数量。

接下来 n 行,每行包含 k 个整数,第 i 行表示第 i 个礼盒中各商品的价格。

输出格式

输出一行,包含排序后的礼盒编号(编号从 1 开始),用空格分隔。

样例

输入样例

4 3

3 5 2

4 1 5

2 2 4

3 4 3

输出样例

3 4 2 1

数据范围

保证 1≤n≤10^3,1≤k≤10 ,商品价格≤10^4 。

【解题思路】

按照题意进行结构体排序,输出排序后的id

【考纲知识点】结构体排序


写在最后

如果你有意或也在学习编程,不妨添加懒大王的个人微信(ldw_0711),希望能在你的编程路上提供些许帮助!

抱歉,评论功能暂时关闭!