视频讲解:GESP2025年9月三级C++真题讲解
一、单选题
第1题

解析:
答案C,a、b都为int,计算不出小数部分,10/3=3
第2题

解析:
答案C,
(10!=10) || (5>=3)
false || true
true
第3题

解析:
答案D,arr[5]数组,最后一个元素的下标是4
第4题

解析:
答案B,

第5题

解析:
答案B,创建函数的格式如下
cpp
返回值类型 函数名(参数列表) {
// 函数体:实现具体功能的代码
语句块;
return 返回值; // 若返回值类型非void,需返回对应类型的值
}
例如创建 "实现加法函数"
int add(int a,int b) {
return a+b;
}
第6题

解析:
答案B,
cpp
int arr[4]={1,2,3}; // arr[0]=1 arr[1]=2 arr[2]=3
arr[3]=arr[0]+arr[2]; //arr[3]=1+3=4
第7题

解析:
答案B,
A选项,void表示无返回参数

B选项,通过函数引用传递,间接返回多个值

C选项,main()调用会导致无限循环

D选项,无法嵌套定义函数

第8题

解析:
答案D,coutinue导致count++一直没有执行
第9题

解析:
答案A,

第10题

解析:
答案C,

第11题

解析:
答案D,int的最大值是2147483647,反转后就是7463847412,7要改为1否则int存储不了,即为1463847412
第12题

解析:
答案C,假设arr[0]是最大值,之后在循环和后面所有数据做比较
第13题

解析:
答案D,
A选项,不只有值传递

B选项,形参调用完后,内存会自动释放

C选项,不声明void,也可以没返回值

第14题

解析:
答案C,
第一处:for循环,不能SIZE,会造成数组越界
第二处:cout<<arr[SIZE] 会造成数组越界
第15题

解析:
答案D,
A选项,char数组需要用strcpy
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
string s1="abc";
char s2[]="abc";
strcpy(s2,"bcd");
cout<<s2;
return 0;
}
B选项,string获取长度用size或length,char数组要用strlen
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
string s1="abc";
char s2[]="abc";
cout<<s1.length()<<" "<<s1.size()<<endl;
cout<<strlen(s2);
return 0;
}
C选项,string的长度就是动态变化的
D选项,string 和 char数组 不能用==判断相等
二、判断题
第1题

解析:
答案×,sizeof是获取数据类型所占内存大小,1是因为 'a'是char类型
第2题

解析:
答案√,
cpp
#include<bits/stdc++.h>
using namespace std;
int a;//全局变量
int main() {
cout<<a;//0
}
第3题

解析:
答案√,会先do,在进行while判断,所以至少执行一次
第4题

解析:
答案√,
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
int a=1;
cout<<a++<<endl;//1
cout<<++a;//3
}
第5题

解析:
答案×,是color类型
cpp
#include <iostream>
using namespace std;
// 定义枚举类型Color
enum Color { RED, GREEN, BLUE };
int main() {
// 枚举常量的类型是Color,而非int
Color c = RED; // 正确:RED是Color类型,可赋值给Color变量
return 0;
}
第6题

解析:
答案×,
cpp
#include <iostream>
using namespace std;
#define SQUARE(x) x*x;
int main() {
cout<<SQUARE(2+3);// 2+3*2+3=11
return 0;
}
第7题

解析:
答案×,是0至127,对应ASCII表

第8题

解析:
答案×,当b是string类型,b=10会不合法
第9题

解析:
答案×,
cpp
#include"file.h" 是从本地文件开始搜索,搜索不到,就查找C++库文件
#include<file.h> 是直接查找c++库文件
第10题

解析:
答案×,
cpp
#include <iostream>
using namespace std;
// 变量定义(分配内存),作用域内仅一次
int a = 10;
int main() {
// extern 声明(仅表明变量在别处定义,可多次出现)
extern int a;
// 若尝试"定义"多次,会报错
int a = 20; // 错误:同一作用域内变量定义重复
return 0;
}
三、编程题
第1题 [GESP202509 三级] 数组清零
题目描述
小 A 有一个由 n 个非负整数构成的数组 a=[a1,a2,...,an]。他会对阵组 a 重复进行以下操作,直到数组 a 只包含 0。在一次操作中,小 A 会依次完成以下三个步骤:
- 在数组 a 中找到最大的整数,记其下标为 k。如果有多个最大值,那么选择其中下标最大的。
- 从数组 a 所有不为零的整数中找到最小的整数 aj。
- 将第一步找出的 ak 减去 aj。
例如,数组 a=[2,3,4] 需要 7 次操作变成 [0,0,0]:
2,3,4\]→\[2,3,2\]→\[2,1,2\]→\[2,1,1\]→\[1,1,1\]→\[1,1,0\]→\[1,0,0\]→\[0,0,0
小 A 想知道,对于给定的数组 a,需要多少次操作才能使得 a 中的整数全部变成 0。可以证明,a 中整数必然可以在有限次操作后全部变成 0。你能帮他计算出答案吗?
输入格式
第一行,一个正整数 n,表示数组 a 的长度。
第二行,n 个非负整数 a1,a2,...,an,表示数组 a 中的整数。
输出格式
一行,一个正整数,表示 a 中整数全部变成 0 所需要的操作次数。
输入输出样例
输入 #1
3
2 3 4
输出 #1
7
输入 #2
5
1 3 2 2 5
输出 #2
13
说明/提示
对于所有测试点,保证 1 ≤ n ≤ 100,0 ≤ ai ≤ 100。
答案
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
//1)填充数据
//1.1)确定大小n
int n;cin>>n;
//1.2)确定数组
int a[110]={};
for(int i=1;i<=n;i++) cin>>a[i];
//2)模拟"数组清零"
int ans=0;
while(true){
int maxx=INT_MIN,max_i,minn=INT_MAX;
for(int i=1;i<=n;i++){
if(a[i]!=0){
//2.1)找到最大值的下标
if(a[i]>=maxx){
maxx=a[i];
max_i=i;
}
//2.2)找到最小值
if(a[i]<minn) minn=a[i];
}
}
//2.3)判断是否找到最大值
if(maxx==INT_MIN) break;
//2.4)修改a[max_i]=a[max_i]-minn;
a[max_i]=a[max_i]-minn;
ans++;
}
cout<<ans;
}
第2题 [GESP202509 三级] 日历制作
题目描述
小 A 想制作 2025 年每个月的日历。他希望你能编写一个程序,按照格式输出给定月份的日历。
具体来说,第一行需要输出 MON TUE WED THU FRI SAT SUN,分别表示星期一到星期日。接下来若干行中依次输出这个月所包含的日期,日期的个位需要和对应星期几的缩写最后一个字母对齐。例如,2025 年 9 月 1 日是星期一,在输出九月的日历时,1 号的个位 1 就需要与星期一 MON 的最后一个字母 N 对齐。九月的日历输出效果如下:
MON TUE WED THU FRI SAT SUN
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
你能帮助小 A 完成日历的制作吗?
输入格式
一行,一个正整数 m,表示需要按照格式输出 2025 年 m 月的日历。
输出格式
输出包含若干行,表示 2025 年 m 月的日历。
输入输出样例
输入 #1
9
输出 #1
MON TUE WED THU FRI SAT SUN
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
输入 #2
6
输出 #2
MON TUE WED THU FRI SAT SUN
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
说明/提示
对于所有测试点,保证 1 ≤ m ≤ 12。
答案
cpp
#include <bits/stdc++.h>
using namespace std;
int main(){
//1)确定月份m
int m;cin>>m;
//2)数组标记 月份 空格
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int kong[13]={0,2,5,5,1,3,6,1,4,0,2,5,0};
//3)输出 顶部英文
cout<<"MON TUE WED THU FRI SAT SUN"<<endl;
//4)输出空格
for(int i=1;i<=kong[m];i++){
cout<<" ";
}
//5)输出数字
for(int i=1;i<=days[m];i++){
printf("%3d ",i);
if( (kong[m]+i)%7==0 ) cout<<endl;
}
}