外观
2024年3月 GESP C++ 四级真题解析
一、单选题(每题2分,共30分)
选择题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | C | C | D | D | C | C | D | A | C | B | C | C | B | C | C |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 若函数声明为int f(int &x){ x+=3; return x; },则对声明的变量int a=3,下面哪个调用能够改变a的值()。
A. f(&a);
B. f(*a);
C. f(a);
D. f(a-3);
查看解析
**答案:C**
考纲知识点: 引用传参
解析: 形参为int &x,是引用传递,实参需直接写变量名a即可修改原值。A用取地址、B用解引用、D用表达式均不符引用语法。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 下面C++代码执行后,输出的是()。
cpp
int main(){
int x[]={2,0,2,4};
char geSP[]="Grade Examination of SP";
cout << geSP[sizeof(x)] << endl;
return 0;
}1
2
3
4
5
6
2
3
4
5
6
A. G
B. e
C. n
D. P
查看解析
**答案:C**
考纲知识点: 数组与指针运算
解析: sizeof(x)得4*4=16,geSP[16]即第17字符(下标从0),对应字符串第17位字母n。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 下面C++代码执行后输出是()。
cpp
int foo(float *f){
return int(*f*2);
}
int main(){
float fnum[10]={1.1};
fnum[1]=foo(fnum);
cout<<fnum[0]+fnum[1]<<endl;
return 0;
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. 1
B. 1.1
C. 3
D. 3.1
查看解析
**答案:D**
考纲知识点: 类型转换与数组
解析: foo将1.1*2=2.2强转为2存入fnum[1],输出1.1+2=3.1。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 对二维数组int arr[3][16];,则arr[1]占用内存的大小为()字节。
A. 4
B. 16
C. 48
D. 64
查看解析
**答案:D**
考纲知识点: 二维数组存储
解析: arr[1]为第二行,共16个int,每int4字节,大小16*4=64字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 对二维数组int arr[3][16];,若arr的地址是0x28cbc0,则arr[1]的值是()。
A. 0x28cbc4
B. 0x28cbd0
C. 0x28cc00
D. 不确定
查看解析
**答案:C**
考纲知识点: 地址计算
解析: 每行16个int占64字节,地址步长0x40,故arr[1]地址为0x28cbc0+0x40=0x28cc00。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 下面C++代码执行后输出是()。
cpp
int main(){
char *p="I love GESP!";
cout<<p+5<<endl;
return 0;
}1
2
3
4
5
2
3
4
5
A. e
B. I lov
C. e GESP!
D. GESP!
查看解析
**答案:C**
考纲知识点: 指针偏移
解析: p+5指向第6字符(下标5),输出从该位置起的子串"e GESP!"。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 下面C++代码执行以后输出的是()。
cpp
int rc=5;
int main(){
int rc;
cout<<++rc<<endl;
return 0;
}1
2
3
4
5
6
2
3
4
5
6
A. 0
B. 1
C. 6
D. 不确定
查看解析
**答案:D**
考纲知识点: 变量作用域
解析: 局部rc未初始化,使用++rc结果未定义,输出不确定值。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 下面C++函数中采用的算法是()。
cpp
int fib(int n){
int i,f[n]={0,1};
for(int i=2;i<=n;i++)
f[i]=f[i-1]+f[i-2];
return f[n];
}1
2
3
4
5
6
2
3
4
5
6
A. 递推
B. 递归
C. 迭代
D. 循环
查看解析
**答案:A**
考纲知识点: 算法思想
解析: 按顺序从前两项计算后一项,典型递推(动态规划思想)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 插入排序在最好情况下的时间复杂度是()。
A. O(1)
B. O(N/2)
C. O(N)
D. O(N²)
查看解析
**答案:C**
考纲知识点: 排序复杂度
解析: 已有序时只需线性扫描比较,时间复杂度O(N)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 在如下的C++代码执行后,设第11和12行的输出地址值分别为X和Y,则下面正确的是()。
cpp
struct pass{
int no;
char name[20];
int level;
};
int main(){
struct pass XiaoYang;
cout<<"&XiaoYang="<<&XiaoYang<<endl; //第11行
cout<<"&(XiaoYang.no)="<<&(XiaoYang.no)<<endl; //第12行
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
A. X>Y
B. X==Y
C. X<Y
D. 不确定
查看解析
答案:B
考纲知识点: 结构体内存布局
解析: 结构体地址即首成员地址,no为首个成员,故&XiaoYang 和 &(XiaoYang.no) 是同一个地址。所以X==Y。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 如果文件1.txt中的内容如下,则执行下面C++代码时,注释了####那行代码所输出的x的值为()。
50 2024 3.16 I
love
GESP!
int main(){
ifstream fin;
string line;
int x;
fin.open("1.txt",ios::in);
for(int i=0;i<2;i++){
fin>>line;
cout<<line<<endl;
}
fin>>x;
cout<<x<<endl; //####
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
A. 5
B. 2024
C. 3
D. 0
查看解析
**答案:C**
考纲知识点: 文件输入
解析: 前两行读入line后,文件指针指向第三行首单词3.16,fin>>x将3读入x。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 执行下列C++代码时输出中的第2行是()。
cpp
int main(){
char *s[]={(char*)"2024",(char*)"3.16",(char*)"GESP"};
for(int i=0;i<2;i++){
cout<<*s+i<<endl;
}
return 0;
}1
2
3
4
5
6
7
2
3
4
5
6
7
A. 2024
B. 3.16
C. 024
D. 3
查看解析
**答案:C**
考纲知识点: 指针数组
解析: *s+i即s[0]+i,i=1时输出"2024"从第2字符起的子串"024"。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. C++语言中下面哪个关键字能够限定对象的作用域()。
A. extern
B. static
C. inline
D. public
查看解析
**答案:B**
考纲知识点: 关键字作用
解析: static可限制变量或函数作用域为文件内部或函数内部。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是()。
A. 小程序
B. 计时器
C. 操作系统
D. 神话人物
查看解析
**答案:C**
考纲知识点: 常识
解析: 鸿蒙是华为自主研发的操作系统。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是()。
A. 制造自动驾驶汽车
B. 创立培训学校
C. 发明汉字激光照排系统
D. 成立方正公司
查看解析
**答案:C**
考纲知识点: 计算机史
解析: 王选院士主导发明汉字激光照排技术,推动印刷革命。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | √ | √ | × | √ | × | × | × | × | √ | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 对int a[7]={2,0,2,4,3,1,6},执行第一趟选择排序处理后a中数据变为{0,2,2,4,3,1,6}。()
查看解析
**答案:√**
考纲知识点: 选择排序
解析: 选择排序第一趟找最小值0并交换到首位,数组变为{0,…}。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 如果待排序数据不能都装进内存,需要使用外排序算法。()
查看解析
**答案:√**
考纲知识点: 外排序
解析: 数据量超内存时需借助磁盘的外排序,如多路归并。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 定义变量int a=5,则cout<<++a会输出6。()
查看解析
**答案:×**
考纲知识点: 自增运算
解析: ++a先自增再输出,结果应为6,但题目表述缺少cout上下文,严谨性不足。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 两个函数之间可以使用全局变量来传递数据。()
查看解析
**答案:√**
考纲知识点: 全局变量
解析: 全局变量可被所有函数访问,是跨函数通信手段之一。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 定义数组int a[2024][3][16]={...},则cout<<a[2023][2][15]的结果不确定。()
查看解析
**答案:×**
考纲知识点: 数组初始化
解析: 剩余元素自动初始化为0,结果确定输出0。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 在C++语言中,函数的参数为指针时,可以在函数内部修改该参数的值。()
查看解析
**答案:×**
考纲知识点: 指针参数
解析: 函数参数为指针时,可以在函数内部修改该指针所指向的对象的值,但不能直接修改指针本身的值(即不能让指针指向别处),除非参数是“指针的引用”或“指向指针的指针”。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 在C++语言中try子句里抛出的结构体等类型的异常无法被catch捕获。()
查看解析
**答案:×**
考纲知识点: 异常处理
解析: 结构体异常可被catch(...)或对应类型捕获。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. C++语言中cout<<9^2<<endl;会输出81。()
查看解析
**答案:×**
考纲知识点: 运算符
解析: ^是按位异或,9^2=11,而非幂运算。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 小杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接入到WIFI盒子才能收看节目,那这个WIFI盒子具有路由器的功能。()
查看解析
**答案:√**
考纲知识点: 网络设备
解析: WIFI盒子集成路由功能,负责网络分发。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 任何一个for循环都可以转化为等价的while循环。()
查看解析
**答案:√**
考纲知识点: 循环转换
解析: for(;;)可改写为while结构,逻辑等价。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(每题25分,共50分)
1. 相似字符串
问题描述
对于两个字符串 A 和 B,如果 A 可以通过删除一个字符,或插入一个字符,或修改一个字符变成 B,那么我们说 A 和 B 是相似的。请勿在输入、输出中附带任何提示信息。 例如:
- apple → applee(插入)
- apple → appe(删除)
- apple → bpple(修改)
特别地,完全相同的两个字符串也是相似的。 给定 T 组 A 和 B,请你分别判断是否相似。
输入描述
第一行一个正整数 T。 接下来 T 行,每行两个用空格隔开的字符串 A 和 B。 保证 T ≤ 100,A、B 的长度不超过 50,且只含小写字母。
输出描述
输出 T 行,对每个 A、B:
- 相似 → 输出
similar - 不相似 → 输出
not similar
样例输入1
5
apple applee
apple appe
apple bpple
applee bpple
apple apple1
2
3
4
5
6
2
3
4
5
6
样例输出1
similar
similar
similar
not similar
similar1
2
3
4
5
2
3
4
5
数据范围
T ≤ 100,|A|, |B| ≤ 50。
解题思路
查看解题思路
考纲知识点: 字符串处理、双指针、贪心
简化题意:
给出两个字符串,判断是否最多只相差一个字符:
- 可以在任意位置插入、删除或替换一个字符;
- 也可以完全相同。
解题思路:
- 长度差:若 |lenA-lenB|>1,直接不相似。
- 长度相等:统计不同字符个数,≤1 则相似。
- 长度差 1:把短串和长串对齐,只允许一次错位,其余字符必须相同。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
#include <string>
using namespace std;
bool isSimilar(string A, string B) {
int m = A.size(), n = B.size();
if (abs(m - n) > 1) return false;
if (m == n) {
int diff = 0;
for (int i = 0; i < m; ++i) {
if (A[i] != B[i]) {
if (++diff > 1) return false;
}
}
return diff <= 1;
} else {
string& shorter = (m < n) ? A : B;
string& longer = (m < n) ? B : A;
int i = 0, j = 0, diff = 0;
while (i < shorter.size() && j < longer.size()) {
if (shorter[i] != longer[j]) {
if (++diff > 1) return false;
++j;
} else {
++i; ++j;
}
}
return true;
}
}
int main() {
int T;
cin >> T;
while (T--) {
string A, B;
cin >> A >> B;
if (isSimilar(A, B)) cout << "similar" << endl;
else cout << "not similar" << endl;
}
return 0;
}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
31
32
33
34
35
36
37
38
39
40
41
42
43
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
31
32
33
34
35
36
37
38
39
40
41
42
43
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 做题
题目描述
小杨同学为了提高自已的实力制定了做题计划,在第k天时,他必须要完成k道题,否则他就会偷懒。
小杨同学现在找到了一个题库,一共有n套题单,每一套题单中有一定数量的题目。但是他十分挑剔,每套题单他只会使用一次,每一天也只能使用一套题单里的题目,之后那套题单就会被弃之不用。对于每套题单,他不必完成题单内所有的题。
那么问题来了,小杨同学最多会做题几天才偷懒呢?
输入格式
第一行,1个数为n,表示有多少套题单。
第二行,n个整数a₁,a₂,…,aₙ,分别表示每套题单有多少道题。
输出格式
输出一行,小杨同学偷懒前最多做题天数。
样例输入1
4
3 1 4 11
2
2
样例输出1
31
数据范围
1 ≤ n ≤ 1e6,1 ≤ aᵢ ≤ 1e9。
解题思路
查看解题思路
考纲知识点: 贪心、排序
简化题意:
把每套题单的题数看成一个数字,每天需要的天数依次是1、2、3…,问最多能撑到第几天。
时间复杂度: O(n log n)。
样例解释:
排序后题单为[1,1,3,4]。
- 第1天:用第1套1题,剩余题单[1,3,4]
- 第2天:用第2套1题,此时已用2题≥2,剩余题单[3,4]
- 第3天:用第3套3题≥3,剩余题单[4]
- 第4天:需要4题,但剩余只有4-3=1<4,停止。
最多坚持3天。
解题思路:
- 将所有题单按题数从小到大排序。
- 从小到大依次消耗题单:
第1天需要1题,第2天需要再补1题(共2题),第3天再补1题(共3题)…… - 当某一步剩余题单无法补足当天所需题数时,停止计数。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 6;
long long a[MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) scanf("%lld", &a[i]);
sort(a, a + n); // 贪心:从小到大排序
long long ans = 0, sum = 0;
for (int i = 0; i < n; ++i) {
sum += a[i]; // 累计已用题量
if (sum >= ans + 1) // 足够第 ans+1 天
++ans;
else
break; // 后面再大也补不齐
}
printf("%lld\n", ans);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限