2026年03月GESPC++四级真题解析(含视频)
视频讲解:GESP2026年3月四级C++真题讲解
一、单选题
第1题

解析:
答案B,
f()无参数默认为2,输出2*3=6
f(4),输出4*3=12
第2题

解析:
答案B,
int** q = &p; 二级指针q 指向 一级指针p
**q += 7;// 等价与 *p+=7 或 a+=7
第3题

解析:
答案B,
int (*p)[4]=a; //代表“行指针”,指向{1,2,3,4}的第一个元素
*(p+2) 代表行+2
*(*(p+2)+1)代表行+2基础上,列+1
即a[0+2][0+1]=a[2][1]=10
第4题

解析:
答案B,
x值传递(原数据不改变),y引用传递(原数据改变),z指针传递(原数据改变)
第5题

解析:
答案A,

第6题

解析:
答案B,
结构体常见3种 初始化方式
等号形式:Point p={1,2};
大括号形式:Point p{1,2};
指针形式:Point* p = new Point{1,2}
第7题

解析:
答案B,
g()函数值传递,不改变原数据,所以a还是1
h()函数引用传递,改变原数据,所以b变12
第8题

解析:
答案B,
ACD都是递归的描述
第9题

解析:
答案B,这是解决斐波那契数列:1 2 3 5 8 13 ...
第10题

解析:
答案B,排序后,A B D的相对位置不变,是稳定排序
第11题

解析:
答案B,插入排序实现升序,比key大才进行后移
第12题

解析:
答案C,i循环n次,j嵌套循环n次,时间复杂度=n*n=n²
第13题

解析:
答案B,

第14题

解析:
答案B,divi(10,0),0为除数,throw 0; 返回int类型,输出B
第15题

解析:
答案A,
排行榜是降序,分数增加向前排,所以最多排到第一,即i>0
排行榜是降序,分数增加向前排,所以当前分数>前面的,才后移,即cur.score>players[i-1].score
二、判断题
第1题

解析:
答案√,引用传递会改变原数据
第2题

解析:
答案√,

第3题

解析:
答案×,
数组的顺序
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
a[1][2] 和 a[0][1] 相差4个位置,输出4
第4题

解析:
答案×,
调用函数calc(5)
以下两个函数定义都可调用,导致冲突
int calc(int x,int y=10)
int calc(int x)
第5题

解析:
答案√,

第6题

解析:
答案×,全局指针 和 静态指针才会自动初始化
#include <bits/stdc++.h>
using namespace std;
int *p1;//全局指针
int main(){
static int* p2;//静态指针
}
第7题

解析:
答案√,结构体可以嵌套定义
第8题

解析:
答案×,应该为fout<<"Hello";
第9题

解析:
答案×,
选择排序:任何场景下,复杂度固定
插入排序:更适合相对有序的数据
第10题

解析:
答案×,该代码用单层for实现斐波那契数列,复杂度为O(n)
三、编程题
第1题 [GESP202603 四级] 山之谷
题目描述
现有一片山地,可以视为一个 N 行 M 列的网格图,第 i 行 j 列的海拔为 hi,j。
如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 8 个方向)的海拔,则称该单元格为山谷。
请你数一数该片山地中有多少山谷。
输入格式
第一行包含 2 个整数 N,M,表示山地的大小。
之后 N 行,每行包含 M 个整数 hi,1,hi,2,⋯,hi,M,表示海拔。
输出格式
输出 1 行,包含 1 个整数 C,表示山谷的数量。
输入输出样例
输入 #1
3 5
7 6 6 7 9
6 5 6 7 6
6 5 7 8 9
输出 #1
3
说明/提示
样例解释
样例 1 如图所示,绿色单元格代表山谷:

数据范围
保证 1 ≤ N,M ≤ 100,1 ≤ hi,j ≤ 。
答案
#include<bits/stdc++.h>
using namespace std;
int a[105][105];
bool check(int x,int y){
for(int i=x-1;i<=x+1;i++)
for(int j=y-1;j<=y+1;j++)
if(a[i][j] < a[x][y] ) return 0;
return 1;
}
int main(){
//1)填充数据
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
//2)边缘改成max
for(int i=0;i<=n+1;i++) a[i][0]=100005,a[i][m+1]=100005;
for(int j=0;j<=m+1;j++) a[0][j]=100005,a[n+1][j]=100005;
//3)计算 山谷的数量
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if( check(i,j) ) ans++;
cout<<ans;
return 0;
}
第2题 [GESP202603 四级] 礼盒排序
题目描述
商店推出了许多礼盒,每个礼盒中包含 k 件商品,每件商品都有一个价格。
现在需要对这些礼盒进行排序,排序规则如下:
- 先按礼盒总价格从小到大排序;
- 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;
- 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;
- 如果仍然相同,按礼盒编号从小到大排序。
请输出排序后的礼盒编号。
输入格式
第一行包含两个整数 n 和 k,分别表示礼盒数量和每个礼盒中商品的数量。
接下来 n 行,每行包含 k 个整数,第 i 行表示第 i 个礼盒中各商品的价格。
输出格式
输出一行,包含排序后的礼盒编号(编号从 1 开始),用空格分隔。
输入输出样例
输入 #1
4 3
3 5 2
4 1 5
2 2 4
3 4 3
输出 #1
3 4 2 1
说明/提示
样例解释
| 编号 | 商品价格 | 总价 | 最大值 | 最小值 |
|---|---|---|---|---|
| 1 | 3 5 2 | 10 | 5 | 2 |
| 2 | 4 1 5 | 10 | 5 | 1 |
| 3 | 2 2 4 | 8 | 4 | 2 |
| 4 | 3 4 3 | 10 | 4 | 3 |
排序过程:
- 按总价排序,3 号礼盒总价最小;
- 其余总价均为 10,再按最大值排序,4 号最大值更小;
- 1 号和 2 号最大值相同,再按最小值排序,2 号更小。
最终顺序为:3 4 2 1
数据范围
保证 1 ≤ n ≤ ,1 ≤ k ≤ 10,1 ≤ 商品价格 ≤
。
答案
#include<bits/stdc++.h>
using namespace std;
struct goods{
int sum,maxx,minn,id;
}a[1005];
bool cmp(goods a,goods b){
if(a.sum != b.sum) return a.sum < b.sum;
if(a.maxx != b.maxx) return a.maxx < b.maxx;
if(a.minn != b.minn) return a.minn < b.minn;
return a.id < b.id;
}
int main(){
//1)填充数据
int n,k;cin>>n>>k;
for(int i=1;i<=n;i++){
a[i].sum=0;
a[i].maxx=INT_MIN;
a[i].minn=INT_MAX;
for(int j=1;j<=k;j++){
int temp;cin>>temp;
a[i].sum+=temp;
if(a[i].maxx<temp) a[i].maxx=temp;
if(a[i].minn>temp) a[i].minn=temp;
}
a[i].id=i;
}
//2)根据排序规则排序
sort(a+1,a+n+1,cmp);
//3)输出排序后的礼盒id
for(int i=1;i<=n;i++) cout<<a[i].id<<" ";
return 0;
}
更多推荐

所有评论(0)