2026年3月 GESP C++ 4级认证考试真题(含编程操作题部分)
选 单选题(共 15 题,每题 2 分)
执行下面程序后,输出为( )。
int f(int x = 2){
return x * 3;
}
int main(){
cout << f() << " " << f(4);
}
执行下面代码后,输出为( )。
int main() {
int a = 5;
int* p = &a;
int** q = &p;
**q += 7;
cout << a << " " << *p;
}
已知:
int a[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int (*p)[4] = a;
则表达式 ((p + 2) + 1) 的值为( )。
执行下面程序后,输出为( )。
void fun(int a, int &b, int *c){
a += 1;
b += 2;
*c += 3;
}
int main(){
int x = 1, y = 1, z = 1;
fun(x, y, &z);
cout << x << " " << y << " " << z;
}
执行下面程序后输出为( )。
int x = 3;
void f(int& x){
x += 2;
}
int main(){
int x = 10;
f(x);
cout << x << " " << ::x;
}
下列关于结构体初始化的写法,正确的是( )。
执行下面代码后输出为( )。
struct S { int a; int b; };
void g(S s){ s.a += 10; }
void h(S& s){ s.b += 10; }
int main(){
S s{1,2};
g(s);
h(s);
cout << s.a << " " << s.b;
}
关于递推算法的描述,正确的是( )。
执行 climb(6) 的返回值为( )。
int climb(int n){
if(n <= 2) return n;
int a = 1, b = 2, c = 0;
for(int i = 3; i <= n; i++){
c = a + b;
a = b;
b = c;
}
return c;
}
某排序算法对如下数据排序(按 score 升序),则下面关于该排序算法稳定性的描述中,说法正确的是(
)。
初始:(90,'A'), (90,'B'), (80,'C'), (90,'D')
排序后:(80,'C'), (90,'A'), (90,'B'), (90,'D')
下面代码试图把数组按升序进行“插入排序”,横线处应填写( )。
void ins(int a[], int n){
for(int i = 1; i < n; i++){
int key = a[i];
int j = i-1;
while(j >= 0 && __________){
a[j+1] = a[j];
j--;
}
a[j+1] = key;
}
}
下列代码段的时间复杂度为( )。
int cnt=0;
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
if( (i+j) % 3 == 0) cnt++;
}
}
下面哪种方式不能实现将字符串 Welcome to 2026! 输出重定向到文件 log.txt( )。
执行下面程序,输出结果是( )。
int divi(int a,int b){
if(b==0) throw 0;
return a/b;
}
int main(){
try{
cout << divi(10,0);
}catch(const char* msg){
cout << "A";
}catch(int){
cout << "B";
}
}
下列函数实现排行榜中单个元素的位置调整(类似插入排序的相邻搬移)。当某玩家分数增加,需将其向
前移动时,while 循环的条件应为( )。
struct Player{ int score; };
void up(Player players[], int n, int idx){
Player cur = players[idx];
int i = idx;
while( ____________________ ){
players[i] = players[i-1];
i--;
}
players[i] = cur;
}
判 判断题(共 10 题,每题 2 分)
下面代码执行结束时,变量 a 的值变成 15。
void add10(int &x) { x += 10; }
int main() {
int a = 5;
add10(a);
}
引用一旦绑定某个变量,就不能再绑定其他变量。( )
执行下面代码,输出结果为 5。
int main() {
int a[2][3];
cout << &a[1][2] - &a[0][1] << endl;
return 0;
}
下面程序可以正常编译并输出 10。
int calc(int x, int y = 10);
int calc(int x) { return x * 2; }
int calc(int x, int y) { return x * y; }
int main() {
cout << calc(5);
}
下面程序执行后输出 2010。
int x = 10;
void f() { int x = 20; cout << x; }
int main() {
f();
cout << x;
}
在 C++ 中,如果声明了一个指针变量但没有显式初始化,该指针会自动被初始化为 nullptr。
下面代码没有语法错误。
struct GameCharacter {
string name;
int level;
float position_x;
float position_y;
struct Equipment {
string weapon;
int attack_bonus;
int defense_bonus;
} equipment;
struct Skill {
string name;
int damage;
} skills[8];
int skill_count;
};
下面程序能够把 Hello 写入 data.txt 文件中。
ofstream fout("data.txt");
cout << "Hello";
fout.close();
由于选择排序和插入排序的时间复杂度均为 ,在任何实际场景下两者的性能表现几乎相同,可以互相
替代。
下面用递推方式计算斐波那契数列第 n 项的程序,时间复杂度是 。
int fib(int n) {
if (n <= 1) return n;
int f0 = 0, f1 = 1, cur = 0;
for (int i = 2; i <= n; i++) {
cur = f0 + f1;
f0 = f1;
f1 = cur;
}
return cur;
}
编 编程操作题(共 2 题,共 50 分)
试题名称:⼭之⾕
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
现有⼀⽚⼭地,可以视为⼀个 ⾏ 列的⽹格图,第 ⾏ 列的海拔为 。
如果⼀个单元格的海拔不⾼于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 个
⽅向)的海拔,则称该单元格为⼭⾕。
请你数⼀数该⽚⼭地中有多少⼭⾕。
输入格式
第⼀⾏包含 个整数 ,表⽰⼭地的⼤⼩。
之后 ⾏,每⾏包含 个整数 ,表⽰海拔。
输出格式
输出 1 ⾏,包含 1 个整数 ,表⽰⼭⾕的数量。
样例解释
样例 1 如图所⽰,绿⾊单元格代表⼭⾕:
数据范围
保证 , 。
试题名称:礼盒排序
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
商店推出了许多礼盒,每个礼盒中包含 k 件商品,每件商品都有⼀个价格。
现在需要对这些礼盒进⾏排序,排序规则如下:
- 先按礼盒总价格从⼩到⼤排序;
- 如果总价格相同,按礼盒中最贵商品的价格从⼩到⼤排序;
- 如果仍然相同,按礼盒中最便宜商品的价格从⼩到⼤排序;
- 如果仍然相同,按礼盒编号从⼩到⼤排序。
请输出排序后的礼盒编号。
输入格式
第⼀⾏包含两个整数 和 ,分别表⽰礼盒数量和每个礼盒中商品的数量。
接下来 ⾏,每⾏包含 个整数,第 ⾏表⽰第 个礼盒中各商品的价格。
输出格式
输出⼀⾏,包含排序后的礼盒编号(编号从 开始),⽤空格分隔。
样例解释
4 个礼盒分别为:
编号 商品价格 总价 最大值 最小值
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
数据范围
保证 , ,商品价格 。