2024年3月GESPC++四级真题解析

一、单选题(每题2分,共30分)

题目123456789101112131415
答案

C

C

D

D

C

C

D

A

C

B

C

C

B

C

C

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

【考纲知识点】函数参数传递的概念

【解析】本题属于考察函数引用传递参数,函数的参数为变量的引用,函数f直接传入参数a即可改变a的值。


2.下⾯C++代码执⾏后 ,输出的是( )。
int main()

{

int x[]={2, 0, 2, 4};

char geSP[]="Grade Examination of SP";

cout << geSP[sizeof(x)] << endl;

cout << endl;

return 0;

}

A.G

B.e

C.n

D.P

【答案】C

【考纲知识点】基本数据类型大小、数组

【解析】本题属于考察数据大小的知识。一个int数据的大小通常为4字节,那么x数组的大小为16个字节。数组下标从0开始,故geSP[16] =  ‘n’,输出n。

3.下⾯C++代码执⾏后输出是( )。
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;

cout << endl;

return 0;

}

A.1

B.1.1

C.3

D.3.1
【答案】D

【考纲知识点】指针,函数参数传递

【解析】本题属于考察C++指针知识。foo函数的功能是传入一个float指针f,返回值为f指针指向的内容乘2的整数部分。数组fnum也是指针地址,指向数组第一个元素,fnum[1] = int(2*1.1) = 2, fnum[0] + fnum[1] = 1.1+2 = 3.1, 输出3.1。

4.对⼆维数组int arr[3][16]; ,则arr[1]占⽤内存的⼤⼩为() 字节。
A.4

B.16

C.48

D.64

【答案】D

【考纲知识点】int数据类型,二维数组大小

【解析】本题属于考察int类型数组大小知识,一个int类型的数据通常占4个字节,arr[1]中有16个int数据,总共占16*4 = 64个字节大小。

5.对⼆维数组int arr[3][16]; ,若arr的地址是0x28cbc0,则arr[1]的值是( )。

A.0x28cbc4

B.0x28cbd0

C.0x28cc00

D.不确定
【答案】C

【考纲知识点】二维数组、地址、十六进制计算

【解析】本题属于考察二维数组的地址的转换。arr[1]的地址等于arr[0]的地址加上arr[0]的大小,即0x28cbc0加上10进制的16*4,转换为十六进制答案为0x28cc00。

6.下⾯C++代码执⾏后输出是(   )。
int main()

{

char *p="I love GESP!";

cout << p+5 << endl;

cout << endl;

return 0;

}

A. e

B. I lov

C. e GESP!

D. GESP!
【答案】C

【考纲知识点】字符串、指针

【解析】本题属于考察C++字符串知识,将p视为指针,指向字符串第1个字符,(p+5)指向第6个字符,输出(p+5)则输出从第6个字符到字符串结尾。

7.下⾯C++代码执⾏以后输出的是(   )。
int rc=5;

int main()

{

int rc;

cout << ++rc << endl;

cout << endl;

return 0;

}

A. 0

B. 1

C. 6

D. 不确定

【答案】D

【考纲知识点】参数作用域

【解析】本题属于考察C++中参数的作用域知识。虽然定义了全局变量rc,但有局部变量时局部变量优先,main函数中的局部变量没有赋初值,所以(++rc)的值不确定。

8.下面C++函数中采用的算法是( )。
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];

}

A. 递推

B. 递归

C. 迭代

D. 循环


【答案】A

【考纲知识点】递推算法

【解析】本题属于考察递推算法。递推算法是由已知的条件出发,根据递推关系(本题递推关系是f[i] = f[i-1] + f[i-2],即求斐波那契数列),逐次推算出中间结果及最后结果。

9.插入排序在最好情况下的时间复杂度是( )。

A.  O(1)

B.  O(N/2)

C.  O(N)

D.  O(N2)
【答案】C

【考纲知识点】插入排序、时间复杂度

【解析】本题属于考察插入排序的时间复杂度。根据插入排序原理,当数列已经排好序的情况下,时间复杂度是最低的,为O(n)。

10.在如下的C++代码执行后,设第11和12行的输出地址值分别为 X 和 Y ,则下面正确的是( )。
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行

cout << endl;

return 0;

}

A. X>Y

B. X==Y

C. X<Y

D. 不确定
【答案】B

【考纲知识点】结构体

【解析】本题属于考察C++结构体知识。结构体地址与结构体中第一个元素的地址一样,所以X等于Y。


 

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; //####

cout << endl;

return 0;

}

A. 5

B. 2024

C. 3

D. 0
【答案】C

【考纲知识点】文件读写操作,数据类型转换,循环结构

【解析】本题属于考察文件读写操作、数据类型强制转换、循环结构这三个知识点。题中定义的fin每次读入一个数据,读入规则与cin一样,for循环处一共读入输出两个数据,为50和2024,由于x的数据类型是int,所以接下来读入3存入x,输出x答案为3。

12.执行下列C++代码时输出中的第2行是( )。
int main()

{

char *s[]={(char*)"2024",(char*)"3.16",(char*)"GESP"};

for (int i=0; i< 2; i++){

cout << *s+i << endl;

}

cout << endl;

return 0;

}

A. 2024

B. 3.16

C. 024

D. 3

【答案】C

【考纲知识点】字符串、数组、指针

【解析】本题属于考察C++字符串数组和指针地址这两个知识点。将字符串数组变量s视为指针地址,指向数组一个元素,即(char*)“2024”,地址等同,输出*s将输出数组第一个元素,即‘2024’。for循环中,第一行输出*s+0, 即‘2024’,第二行输出*s+1,即‘024’,向后移一位,与字符串的输出规则一样。

13.C++语言中下面哪个关键字能够限定对象的作用域( )。

A. extern

B. static

C. inline

D. public
【答案】B

【考纲知识点】作用域、关键字

【解析】本题属于考察C++中关键字及其作用知识。

extern用于声明一个变量或函数是在其他文件中定义的,即它的定义不在当前文件中。它告诉编译器在其他文件中寻找这个变量或函数的定义

static主要用于限定对象的作用域,使其只能在声明它的文件中可见,而不能在其他文件中使用

inline用于向编译器提出一个请求,将函数体内的代码在调用点处直接展开,而不是像普通函数一样生成函数调用。这样做的目的是减少函数调用的开销。

public用于定义类的访问控制权限,它指定的类成员可以被类外的代码访问。

14.小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是( )。

A. 小程序

B. 计时器

C. 操作系统

D. 神话人物
【答案】C

【考纲知识点】计算机基础知识

【解析】本题属于考察计算机基础知识。鸿蒙为华为研发的操作系统。

15.中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是( )。

A. 制造自动驾驶汽车

B. 创立培训学校

C. 发明汉字激光照排系统

D. 成立方正公司



【答案】C

【考纲知识点】计算机历史

【解析】本题属于考察计算机历史,CCF中王选先生的重大贡献为发明汉字激光照排系统。

二、判断题(每题2分,共20分)

题目12345678910
答案

×

×

×

×

×

1.对 int a[]={2,0,2,4,3,1,6} ,执行第一趟选择排序处理后 a 中数据变为 {0,2,2,4,3,1,6} 。( )

【答案】正确

【考纲知识点】选择排序

【解析】本题考察选择排序算法。根据选择排序算法逻辑,一趟排序后数据为{0,2,2,4,3,1,6}

2.如果待排序数据不能都装进内存,需要使用外排序算法。( )

【答案】正确

【考纲知识点】排序算法

【解析】本题考察排序算法。如果数据无法都存入内存,就需要使用外部存储空间进行读取和写入。

3.定义变量 int a=5 , 则 cout << &++a 会输出 6 。( )

【答案】错误

【考纲知识点】指针、基本运算

【解析】本题考察C++取址、算符优先级知识点。&++a语句中,“++”操作的优先级更高,所以先执行“++”,然后执行取址操作。由于还是对a进行取址,所以输出a的地址,而不是a的值,故错误。

4.两个函数之间可以使用全局变量来传递数据。 ( )

【答案】正确

【考纲知识点】全局变量

【解析】本题考察C++全局变量知识。全局变量可以进行赋值,故可以用来传递数据。

5.定义数组 int a[2024][3][16]={2,0,2,4,3,1,6} ,则 cout << a[2023][2][15] 的结果不确定。( )

【答案】错误

【考纲知识点】三维数组

【解析】本题考察C++数组的初始化知识点。当对数组进行初始化后,给定的元素存入数组,其他元素全部置0,所以输出a[2023][2][15]的值为0。

6.在C++语言中,函数的参数为指针时,可以在函数内部修改该参数的值。( )

【答案】错误

【考纲知识点】指针

【解析】本题考察C++指针的使用。函数参数为指针时,可以在函数内部修改指针所指向的值,但无法修改该指针的值。

7.在C++语言中 try 子句里抛出的结构体等类型的异常无法被 catch 捕获。( )

【答案】错误

【考纲知识点】异常处理

【解析】本题考察C++中异常处理。try中抛出类型异常可以被catch捕获。

8.C++语言中 cout << 9^2 << endl; 会输出81。( )

【答案】错误

【考纲知识点】基本运算、位运算

【解析】本题考察C++的基本运算和位运算。在C++中,“^”是异或符号,不是指数运算符,根据异或的运算规则,答案输出应为10。

9.小杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接入到WIFI盒子才能收看节目,那这个WIFI盒子具有路由器的功能。( )

【答案】正确

【考纲知识点】计算机网络

【解析】本题考察计算机网络知识。WIFI盒子这里具有路由器的功能,将设备接入网络。

10.任何一个 for 循环都可以转化为等价的 while 循环( )。

【答案】正确

【考纲知识点】循环语句

【解析】本题考察循环语句。for循环和while循环在逻辑上是等价的,只是语法不同。

三、编程题(每题25分,共50分)

1、相似字符串

【问题描述】

对于两个字符串A和B,如果A可以通过删除一个字符,或插入一个字符,或修改一个字符变成B,那么我们说A和B是相似的。

比如apple可以通过插入一个字符变成applee,可以通过删除一个字符变成appe,也可以通过修改一个字符变成bpple,因此apple和applee、appe、bpple都是相似的。但applee并不能通过任意一个操作变成bpple,因此它们并不相似。

特别地,完全相同的两个字符串也是相似的。

给定T组A,B,请你分别判断他们是否相似。

【输入描述】

第一行一个正整数T。

接下来T行,每行两个用空格隔开的字符串A和B。保证T≤100,A,B的长度不超过50。保证A和B只包含小写字母。

【输出描述】

输出T行,对于每组A,B,如果它们相似,则输出similar,否则输出not similar。

【样例输入 1】

5

apple applee

apple appe

apple bpple

applee bpple

apple apple

【样例输出 1】

similar

similar

similar

not similar

similar

【题目大意】

给定T组输入,每组输入有两个单词,判断两个单词能否通过增加、删除或者修改一个字符变得相同,如果可以就是相似。

【考纲知识点】
输入输出语句、循环语句、函数定义及调用、基本运算

【解题思路】

根据题目要求定义需要的变量,并实现输入

输入T行,每行两个字符串,表示两个单词。

判断两个单词是否相似。

如果两个的单词的长度差超过1,就不相似。

当两个单词的长度相同时:如果不同的字母个数大于1个,肯定不相似;如果不同的字母个数等于1个,就可以通过一次操作变成一样

当两个单词长度差为1时:寻找两者不同的字符,如果有多个不同的字符,则不相似;如果只有一个,则相似。比对时,在较长的单词中找到这个字母,跳过该字母后继续比对即可。

调用函数,输出答案。

【参考程序】
#include<bits/stdc++.h>

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;

int 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;

}

2、做题

【问题描述】

小杨同学为了提高自己的实力制定了做题计划,在第 天时,他必须要完成 道题,否则他就会偷懒。

小杨同学现在找到了一个题库,一共有 套题单,每一套题单中有一定数量的题目。但是他十分挑剔,每套题单他

只会使用一次,每一天也只能使用一套题单里的题目,之后那套题单就会被弃之不用。对于每套题单,他不必完成

题单内所有的题。

那么问题来了,小杨同学最多会做题几天才偷懒呢?

【输入描述】

第一行,1个数为n,表示有多少套题单。

第二行,n个整数a1,a2....,an,分别表示每套题单有多少道题。

【输出描述】

输出一行,小杨同学偷懒前最多做题天数。

【样例输入 1】

4

3 1 4 1

【样例输出 1】

3

【题目大意】

给定一个数列,每次选出一个数,要求选出的第k个数的数值大于等于k,直到无法选出。问最多能选出多少个数。

【考纲知识点】
基本运算、输入输出语句、排序算法、循环

【解题思路】

按题目要求
1.定义好需要的变量,并实现输入

2.要尽可能多的选择,那么可以贪心地每次选出最小的数,看是否符号条件,不符合条件就跳过。

3.利用排序算法,从小到大排列,设置变量s,表示当前已经使用的元素下标,第j 天的时候,到数组中从s下标开始寻找,直到找到大于等于j的数组元素,将s更新为该元素的下标,答案加1。直到无法再进行这样的寻找。

【参考程序】
#include<bits/stdc++.h>

#define maxn 1000006

using namespace std;

long long a[maxn];int n;

int main(){

int m,ans=0;

cin>>n;m=n;int s=1;

for(int i=1;i<=n;i++)

{

cin>>a[i];

}

sort(a+1,a+n+1);

for(int j=1;j<=m;j++)

{

for(int k=s;k<=n;k++)

{

if(j<=a[k])

{

ans++;

a[k]=j;

s=k;

break;

}

}

}

cout<<ans;

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值