外观
2024年6月 GESP C++ 四级真题解析
一、单选题(每题2分,共30分)
选择题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | B | B | B | D | B | D | D | A | A | B | A | D | A | B | D |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 下列代码中,输出结果是()。
cpp
#include<iostream>
using namespace std;
int func(int x,int y){
int a=x,b=y;
int t;
t=a;
a=b;
b=t;
cout<<a<<" "<<b<<" ";
}
int main(){
int c,d;
c=12;
d=24;
func(12,24);
cout<<c<<" "<<d<<endl;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
A. 12 24 24 12
B. 24 12 12 24
C. 12 12 24 24
D. 24 24 12 12
查看解析
答案:B
考纲知识点: 函数参数传递、值传递不影响实参
解析: 调用func(12,24)时,实参值单向传递给形参,函数内交换的是形参a、b,不影响main中的c、d。输出先交换后的形参值24 12,再输出main中的c d仍为12 24,因此结果为24 12 12 24。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 下面函数不能正常执行的是()。
A.
cpp
#include<iostream>
using namespace std;
int func()
{
//...
}
int main()
{
//...
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
B.
cpp
#include<iostream>
using namespace std;
int main()
{
func();
}
int func()
{
//...
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
C.
cpp
#include<iostream>
using namespace std;
int func()
{
//...
}
int main()
{
func();
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
D.
cpp
#include<iostream>
using namespace std;
int func();
int main()
{
func();
}
int func()
{
//...
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
查看解析
答案:B
考纲知识点: 函数声明与定义顺序
解析: 选项B中main函数调用了func,但func的定义出现在main之后且没有前置声明,会导致编译错误“未声明的标识符”。其余选项均正确声明或定义了func。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 下面程序输出的是()。
cpp
#include<iostream>
using namespace std;
int main(){
int i=2;
cout<<i<<endl;
for(int x=0;x<1;x++){
int i=10;
cout<<i<<endl;
}
i=i+1;
cout<<i<<endl;
i=i*i;
cout<<i<<endl;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
A. 2 2 3 9
B. 2 10 3 9
C. 2 10 11 121
D. 2 10 3 100
查看解析
答案:B
考纲知识点: 变量作用域
解析: for循环内定义的i是局部变量,不影响外部的i。输出依次为:外部2、局部10、外部3、外部9。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 假设变量a的地址是0x6ffe14,下面程序的输出是()。
cpp
#include<iostream>
using namespace std;
int main(){
int *p;
int a=10;
p=&a;
p++;
cout<<p<<endl;
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. 10
B. 0x6ffe14
C. 0x6ffe15
D. 0x6ffe18
查看解析
答案:D
考纲知识点: 指针运算、地址自增
解析: p指向int类型,指针自增1相当于地址加4字节(32位系统),因此0x6ffe14+4=0x6ffe18。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 如果下列程序输出的地址是0x6ffe00,则cout<<a+1<<endl;输出的是()。
cpp
#include<iostream>
using namespace std;
int main(){
int a[2][3]={0};
cout<<a<<endl;
}1
2
3
4
5
6
2
3
4
5
6
A. 0x6ffe04
B. 0x6ffe0c
C. 0x6ffe08
D. 0x6ffe00
查看解析
答案:B
考纲知识点: 二维数组地址计算
解析: a是int[2][3]类型,a+1指向下一行(跳过3*4=12字节),因此地址为0x6ffe00+12=0x6ffe0c。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. C++中,关于文件路径说法错误的是()。
A. "GESP.txt":指定与当前工作目录中的程序文件相同目录中的GESP.txt文件。
B. "../data/GESP.txt":指定与当前工作目录中的程序文件上一级目录下的data目录中的GESP.txt文件。
C. "./data/GESP.txt":指定与当前工作目录中的程序文件同级目录下的data目录中的GESP.txt文件。
D. "GESP.txt"是绝对路径。
查看解析
答案:D
考纲知识点: 文件路径表示
解析: "GESP.txt"是相对路径,表示当前目录下的文件,绝对路径需从根目录开始(如"C:/data/GESP.txt")。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 关于直接插入排序,下列说法错误的是()。
A. 插入排序的最好情况是数组已经有序,此时只需要进行n-1次比较,时间复杂度为O(n)。
B. 最坏情况是数组逆序排序,此时需要进行n(n-1)/2次比较以及n-1次赋值操作(插入)。
C. 平均来说插入排序算法的复杂度为O(n^2)。
D. 空间复杂度上,直接插入法是就地排序,空间复杂度为O(n)。
查看解析
答案:D
考纲知识点: 插入排序复杂度
解析: 插入排序是原地排序,仅需常数级辅助空间,空间复杂度为O(1),而非O(n)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 下列程序横线处,应该输入的是()。
cpp
#include<iostream>
using namespace std;
int n,a[10001];
void swap(int &a,int &b){
int t=a;
a=b;
b=t;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n;i>1;i--)
for(int j=1;j<i;j++)
if(a[j]>a[j+1]) ________;
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
A. swap(a[j],a[j+1]);
B. swap(a[j-1],a[j]);
C. swap(a[j-1],a[j+1]);
D. swap(&a[j-1],&a[j+1]);
查看解析
答案:A
考纲知识点: 冒泡排序实现
解析: 冒泡排序每次比较相邻元素,若逆序则交换,应使用swap(a[j],a[j+1])。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 下面关于递推的说法不正确的是()。
A. 递推表现为自己调用自己。
B. 递推是从简单问题出发,一步步的向前发展,最终求得问题。是正向的。
C. 递推中,问题的n要求是在计算中确定,不要求计算前就知道n。
D. 斐波那契数列可以用递推实现求解。
查看解析
答案:A
考纲知识点: 递推与递归区别
解析: 自己调用自己是递归的特征,递推是正向迭代计算,不调用自身。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 关于几种排序算法的说法,下面说法错误的是()。
A. 选择排序不是一个稳定的排序算法。
B. 冒泡排序算法不是一种稳定的排序算法。
C. 插入排序是一种稳定的排序算法。
D. 如果排序前2个相等的数在序列中的前后位置顺序和排序后它们2个的前后位置顺序相同,则称为一种稳定的排序算法。
查看解析
答案:B
考纲知识点: 排序算法稳定性
解析: 冒泡排序是稳定的排序算法,相等元素不会交换位置。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 数组{45,66,23,1,10,97,52,88,5,33}进行从小到大冒泡排序过程中,第一遍冒泡过后的序列是()。
A. {45,23,1,10,66,52,88,5,33,97}
B. {45,66,1,23,10,97,52,88,5,33}
C. {45,66,23,1,10,52,88,5,33,97}
D. {45,66,23,1,10,97,52,88,33,5}
查看解析
答案:A
考纲知识点: 冒泡排序过程
解析: 第一遍冒泡将最大值97沉到末尾,过程中依次交换66与23、66与1、66与10,得到序列{45,23,1,10,66,52,88,5,33,97}。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 下面的排序算法程序中,横线处应该填入的是()。
cpp
int a[8]={2,3,4,5,6,2,3,1};
for(int i=1;i<8;i++){
int key=a[i];
int j=i-1;
while(a[j]>key && j>=0){
________;
j -= 1;
}
a[j+1]=key;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
A. a[j]=a[j-1];
B. a[j]=a[j+1];
C. a[j+1]=a[j-1];
D. a[j+1]=a[j];
查看解析
答案:D
考纲知识点: 插入排序实现
解析: 插入排序将大于key的元素后移,应填入a[j+1]=a[j]。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 下面的程序中,如果输入10 0,会输出()。
cpp
#include<iostream>
using namespace std;
double Division(int a,int b){
if(b==0)
throw "Division by zero condition!";
else
return ((double)a/(double)b);
}
void func(){
int len, time;
cin >> len >> time;
cout << Division(len, time) << endl;
}
int main(){
try{
func();
}
catch(const char* errmsg){
cout << errmsg << endl;
}
catch(const int errmsg){
cout << errmsg << 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
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
A. Division by zero condition!
B. 0
C. 10
D. 100
查看解析
答案:A
考纲知识点: 异常处理
解析: 输入10 0导致除数为0,抛出字符串异常,被catch(const char*)捕获,输出Division by zero condition!。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 10条直线,最多可以把平面分为多少个区域()。
A. 55
B. 56
C. 54
D. 58
查看解析
答案:B
考纲知识点: 平面划分问题
解析: n条直线最多将平面分为n(n+1)/2+1个区域,代入n=10得10×11/2+1=56。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 下面程序中,如果语句cout<<p<<endl;输出的是0x6ffe00,则cout<<++p<<endl;输出的是()。
cpp
int x[10][10][10]={{0}};
int *p;
p=&x[0][0][0];
cout<<p<<endl;
cout<<++p<<endl;1
2
3
4
5
2
3
4
5
A. 0x6ffe0c
B. 0x6ffe09
C. 0x6ffe06
D. 0x6ffe04
查看解析
答案:D
考纲知识点: 指针运算
解析: p指向int类型,++p使地址增加sizeof(int)=4字节,因此0x6ffe00+4=0x6ffe04。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | × | √ | √ | √ | × | √ | √ | √ | √ | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. int&a和&a是一样的,都是取a的地址。
查看解析
答案:×
考纲知识点: 引用与取地址符
解析: int&a是引用声明,&a是取地址操作,两者含义不同。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 以下代码不能够正确执行。
cpp
#include<iostream>
using namespace std;
int main(){
int a=20;
int& ra;
ra=&a;
cout<<ra<<endl;
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
查看解析
答案:√
考纲知识点: 引用初始化
解析: 引用ra必须在声明时初始化,不能先声明后赋值,代码无法通过编译。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 引用是一个指针常量。
查看解析
答案:√
考纲知识点: 引用底层实现
解析: 引用在底层实现上通常是一个指针常量,一旦绑定不可更改。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 下面程序两个输出结果是一样的。
cpp
#include<iostream>
using namespace std;
int main(){
int a[2][3]={0};
cout<<a<<endl;
cout<<&a[0][0]<<endl;
}1
2
3
4
5
6
7
2
3
4
5
6
7
查看解析
答案:√
考纲知识点: 数组名与首地址
解析: 二维数组名a表示首行首地址,&a[0][0]也表示首元素地址,两者值相同。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 函数不可以调用自己。
查看解析
答案:×
考纲知识点: 递归
解析: 函数可以通过递归调用自身。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 函数参数传递过程中,如果传常量值、常量引用和常量指针都是不能被修改的,它们可以防止函数对实参的值或地址进行修改。
查看解析
答案:√
考纲知识点: 常参数保护
解析: 使用const修饰参数可以防止函数内部修改实参的值或地址。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 下面代码输出的值等于0。
cpp
#include<iostream>
using namespace std;
int main(){
int *p=NULL;
cout<<p<<endl;
}1
2
3
4
5
6
2
3
4
5
6
查看解析
答案:√
考纲知识点: 空指针输出
解析: NULL指针输出为0(或0x0)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 在下面这个程序里,a[i][j]和一个普通的整型变量一样使用。
cpp
#include<iostream>
using namespace std;
int main(){
int a[10][10]={0};
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(i==j){
a[i][j]=1;
}
}
}
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
查看解析
答案:√
考纲知识点: 数组元素访问
解析: 二维数组元素a[i][j]可以像普通整型变量一样参与运算和赋值。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 一个一维数组,至少含有一个自然数N,是一个合法的数列。可以在一维数组末尾加入一个自然数M,M不能超过一维数组末尾元素的一半,形成一个新的合法的一维数组,如果N=6,那么可以有6个不同的合法数组。
查看解析
答案:√
考纲知识点: 组合数学
解析: 从6开始,每次添加不超过当前末尾一半的自然数,可以生成6种不同合法序列。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 插入排序算法中,平均时间复杂度是O(n^2),最坏的情况逆序情况下,达到最大时间复杂度。
查看解析
答案:√
考纲知识点: 插入排序复杂度
解析: 插入排序平均和最坏时间复杂度均为O(n^2),逆序时达到最坏情况。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(每题25分,共50分)
1. 黑白方块
题目描述
小杨有一个n行m列的网格图,其中每个格子要么是白色,要么是黑色。
对于网格图中的一个子矩形,小杨认为它是平衡的当且仅当其中黑色格子与白色格子数量相同。
小杨想知道最大的平衡子矩形包含了多少个格子。
输入格式
第一行包含两个正整数n,m,含义如题面所示。
之后n行,每行一个长度为m的01串,代表网格图第i行格子的颜色,如果为0,则对应格子为白色,否则为黑色。
输出格式
输出一个整数,代表最大的平衡子矩形包含格子的数量,如果不存在则输出0。
样例输入1
text
4 5
00000
01111
00011
000111
2
3
4
5
2
3
4
5
样例输出1
text
161
样例解释1
对于样例1,假设(i,j)代表第i行第j列,最大的平衡子矩形的四个顶点分别为(1,2)、(1,5)、(4,2)、(4,5)。
数据范围
对于全部数据,保证有1 ≤ n,m ≤ 10。
解题思路
查看解题思路
考纲知识点: 枚举、二维前缀和
简化题意: 找出最大的子矩形,其中0和1的数量相等。
样例解释:
- 样例1:2×8的子矩形含8个0和8个1,共16格。
解题思路:
- 枚举所有可能的子矩形(左上角和右下角坐标)。
- 对每个子矩形统计0和1的数量。
- 若0和1数量相等,则更新最大面积。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int w[N][N];
int n,m;
bool check(int xa,int ya,int xb,int yb){
int a[2]={0,0};
for(int i = xa;i<=xb;i++){
for(int j=ya;j<=yb;j++){
a[w[i][j]]++;
}
}
return a[0]==a[1];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
string s;
cin>>s;
for(int j=1;j<=m;j++){
w[i][j]=s[j-1]-'0';
}
}
int ans = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int ii=i;ii<=n;ii++){
for(int jj=j;jj<=m;jj++){
if(check(i,j,ii,jj)){
ans = max(ans,(ii-i+1)*(jj-j+1));
}
}
}
}
}
cout<<ans<<"\n";
}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
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
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 宝箱
题目描述
小杨发现了n个宝箱,其中第i个宝箱的价值是a_i。
小杨可以选择一些宝箱放入背包并带走,但是小杨的背包比较特殊,假设小杨选择的宝箱中最大价值为x,最小价值为y,小杨需要保证x-y ≤ k,否则小杨的背包会损坏。
小杨想知道背包不损坏的情况下,自己能够带走宝箱的总价值最大是多少。
输入格式
第一行包含两个正整数n,k,含义如题面所示。
第二行包含n个正整数a_1,a_2,...,a_n,代表宝箱的价值。
输出格式
输出一个整数,代表带走宝箱的最大总价值。
样例输入1
text
5 1
1 2 3 1 21
2
2
样例输出1
text
71
样例解释1
在背包不损坏的情况下,小杨可以拿走两个价值为2的宝箱和一个价值为3的宝箱。
数据范围
对于全部数据,保证有1 ≤ n ≤ 1000,0 ≤ k ≤ 1000,1 ≤ a_i ≤ 1000。
解题思路
查看解题思路
考纲知识点: 滑动窗口、贪心
简化题意: 选若干数,使最大减最小不超过k,求和最大。
样例解释:
- 样例1:排序后1,1,2,2,3,选2,2,3满足3-2≤1,和为7。
解题思路:
- 将宝箱价值排序。
- 对每个右端点i,向左找满足a[i]-a[j]≤k的j。
- 计算区间和,更新最大总价值。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N];
int n,k;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int ans=0;
for(int i=1;i<=n;i++){
int sum=0;
for(int j=i;j>=1;j--){
if(a[i]-a[j]<=k){
sum+=a[j];
}else break;
}
ans=max(ans,sum);
}
cout<<ans<<"\n";
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限