2025年12月GESP编程能力认证C++等级考试四级真题(含答案和解析)_第1页
2025年12月GESP编程能力认证C++等级考试四级真题(含答案和解析)_第2页
2025年12月GESP编程能力认证C++等级考试四级真题(含答案和解析)_第3页
2025年12月GESP编程能力认证C++等级考试四级真题(含答案和解析)_第4页
2025年12月GESP编程能力认证C++等级考试四级真题(含答案和解析)_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025年12月GESP编程能力认证C++等级考试四级真题(含答案和解析)一、单选题(每题2分,共30分)。1.小杨想让指针p指向整数变量x,正确写法是()。A.intp=&x;B.int*p=x;C.int*p=&x;D.p=*x;答案:C。解析:指针变量p需要存储变量x的地址,正确写法是int*p=&x。A:intp=&x;错误,p是整型变量,不能存储地址。B:int*p=x;错误,x是整数值,不能直接赋给指针。D:p=*x;错误,x不是指针,不能解引用。2.小杨写了如下的指针接力程序,程序执行完后变量a、*p1和*p2的值分别是()。inta=5;int*p1=&a;int*p2=p1;*p2=10;A.51010B.51015C.101010D.5510答案:C。解析:p1指向a,p2=p1使得p2也指向a,*p2=10修改了a的值为10,所以a、*p1、*p2都是10。A:51010错误,a未被修改。B:51015错误。D:5510错误。3.小杨用一个二维数组表示棋盘,其中1表示有棋子,0表示没有棋子。他想知道第2行第3列有没有棋子,可采用的代码是()。inta[3][4]={{1,0,1,0},{0,1,0,1},{1,1,0,0}};A.cout<<a[1,2]<<endl;B.cout<<a[1][2]<<endl;C.cout<<a(1,2)<<endl;D.cout<<a{1}{2}<<endl;答案:B。解析:C++中二维数组访问使用两个方括号,a[1][2]表示第2行第3列(索引从0开始)。A:a[1,2]是逗号表达式,等价于a[2],类型不匹配。C:a(1,2)是函数调用语法,错误。D:a{1}{2}是初始化列表语法,错误。4.执行完下面的代码后,*(p+5)和arr[1][1]的值分别是()。intarr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int*p=&arr[0][0];A.56B.65C.55D.66答案:D。解析:二维数组在内存中按行连续存储。p指向arr[0][0],*(p+5)跳过5个int,即arr[1][1](第一行4个元素,第二行第一个索引为4,第二个为5),值为6。arr[1][1]也是6。A:56错误。B:65错误。C:55错误。5.执行完下面的代码后,sum的值是()。intarr[2][3][2]={{{1,2},{3,4},{5,6}},{{7,8},{9,10},{11,12}}};intsum=0;for(inti=0;i<2;i++)for(intj=0;j<3;j++)for(intk=0;k<2;k++)if((i+j+k)%2==0)sum+=arr[i][j][k];A.36B.39C.78D.30答案:B。解析:一个三维数组,可以看作是,2层,3行,2列,然后将层、行、列下标之和为偶数的数值累加,结果为39。6.执行完下面的代码后,输出是()。inta=1;voidtest(){inta=2;{inta=3;a++;}a++;cout<<a<<"";}intmain(){test();cout<<a;return0;}A.31B.41C.32D.42答案:A。解析:test()函数内部分三个层次的变量——全局a=1被屏蔽;函数局部a=2;块内局部a=3,块内a++后变为4,不影响函数局部a。块结束后函数局部a自增为3,输出3。main()中输出全局a为1。7.执行完下面的代码后,a、b和c的值分别是()。voidbyValue(intx){x=100;}voidbyRef(int&x){x=200;}voidbyPointer(int*x){*x=300;}intmain(){inta=1,b=2,c=3;byValue(a);byRef(b);byPointer(&c);return0;}A.100200300B.123C.1200300D.12300答案:C。解析:byValue是值传递,不改变实参a;byRef是引用传递,改变实参b;byPointer是指针传递,改变实参c。所以a保持1,b变为200,c变为300。A:100200300错误,值传递不会修改。B:123错误,引用和指针传递会修改。D:12300错误,引用传递会修改b。8.运行如下代码会输出()。structPoint{intx,y;};structRectangle{PointtopLeft;PointbottomRight;};intmain(){Rectanglerect={{10,10},{20,20}};rect.topLeft.x=5;Point*p=&rect.bottomRight;p->y=5;cout<<rect.topLeft.x+rect.bottomRight.y;return0;}A.10B.30C.15D.20答案:A。解析:rect.toLeft.x初始为10,后改为5;rect.bottomRight.y初始为20,通过指针p修改为5。所以rect.toLeft.x+rect.bottomRight.y=5+5=10。B:30错误,未考虑修改。C:15错误。D:20错误。9.给定函数climbStairs(intn)的定义如下,则climbStairs(5)的返回的值是()。intclimbStairs(intn){if(n<=2)returnn;inta=1,b=2;for(inti=3;i<=n;i++){inttemp=a+b;a=b;b=temp;}returnb;}A.5B.8C.13D.10答案:B。解析:函数climbStairs(n)计算爬楼梯方式数,相当于斐波那契数列。climbStairs(5)返回8。A:5错误。C:13错误,那是n=6的结果。D:10错误。10.对如下4个扑克牌进行排序,使用某排序算法按value排序后,结果为:{3,'D'},{3,'B'},{5,'A'},{5,'C'},则这个排序算法是稳定的吗?()。structCard{intvalue;charsuit;//花色。};Cardcards[4]={{5,'A'},{3,'B'},{5,'C'},{3,'D'}};A.稳定,因为相同value的元素相对顺序保持不变。B.不稳定,因为{3,'D'}出现在{3,'B'}之前。C.无法判断D.稳定,因为结果是有序的。答案:B。解析:排序前相同value的元素顺序是(3,'B')在前,(3,'D')在后;排序后结果为(3,'D')在前,(3,'B')在后,相对顺序改变,所以是不稳定排序。A:稳定,错误。C:无法判断,错误。D:稳定,错误。11.下面的函数selectTopK()实现从n个学生中选出前k名成绩最好的学生颁发奖学金(不需要对所有学生完全排序,只需要找出前k名),则横线上应填写()。structStudent{stringname;intscore;};voidselectTopK(Studentstudents[],intn,intk){for(inti=0;i<k;i++){intmaxIdx=i;for(____________________){//在此处填入代码。if(students[j].score>students[maxIdx].score){maxIdx=j;}}if(maxIdx!=i){Studenttemp=students[i];students[i]=students[maxIdx];students[maxIdx]=temp;}}}A.intj=0;j<n;j++B.intj=i+1;j<n;j++C.intj=i;j<n;j++D.intj=1;j<=n;j++答案:B。解析:函数selectTopK选择前k个最高分学生。内层循环应从未排序部分(从i+1到n-1)中寻找最大值。A:intj=0;j<n;j++会重复比较已选出的元素。C:intj=i;j<n;j++包含自己,多余。D:intj=1;j<=n;j++索引从1开始且包含n,错误。12.某游戏的排行榜系统需要实时更新玩家分数。每次只有一个玩家的分数发生变化,排行榜已经是按分数降序排列的。现在需要将更新后的玩家调整到正确位置。下面的函数updateRanking()要实现上述功能,则两处横线上应分别填写()。structPlayer{stringname;intscore;};//玩家索引playerIdx的分数刚刚更新,需要调整位置。voidupdateRanking(Playerplayers[],intsize,intplayerIdx){PlayerupdatedPlayer=players[playerIdx];if(playerIdx>0&&updatedPlayer.score>players[playerIdx-1].score){inti=playerIdx;while(____________________){//在此处填入代码。players[i]=players[i-1];i--;}players[i]=updatedPlayer;}elseif(playerIdx<size-1&&updatedPlayer.score<players[playerIdx+1].score){inti=playerIdx;while(____________________){//在此处填入代码。players[i]=players[i+1];i++;}players[i]=updatedPlayer;}}A.i>0&&updatedPlayer.score>players[i-1].scorei<size-1&&updatedPlayer.score<players[i+1].scoreB.i<size-1&&updatedPlayer.score<players[i+1].scorei>0&&updatedPlayer.score>players[i-1].scoreC.i>0&&updatedPlayer.score<players[i-1].scorei<size-1&&updatedPlayer.score<players[i+1].scoreD.i>0&&updatedPlayer.score<players[i-1].scorei<size-1&&updatedPlayer.score>players[i+1].score答案:A。解析:当玩家分数升高时,需要向前移动,while条件应为i>0&&updatedPlayer.score>players[i-1].score;当分数降低时,需要向后移动,条件应为i<size-1&&updatedPlayer.score<players[i+1].score。13.给定如下算法,其时间复杂度为()。boolf(intarr[],intn,inttarget){for(inti=0;i<n;i++){intsum=0;for(intj=0;j<n;j++){if(i&(1<<j)){sum+=arr[j];}}if(sum==target)returntrue;}returnfalse;}A.O(n)B.O(n2)C.O(n3)D.O(2n)答案:B。解析:外层循环n次,内层循环n次,内层操作常数时间,总时间复杂度为O(n^2)。14.执行下面C++程序,会输出()。intmain(){ofstreamfout("test.txt");fout<<"Happy"<<endl;fout<<"NewYear";fout.close();ifstreamfin("test.txt");strings1,s2;fin>>s1;getline(fin,s2);fin.close();cout<<s1<<"|"<<s2;return0;}A.Happy|NewYearB.Happy|NewYearC.HappyNewYear|D.Happy|答案:D。解析:程序向文件test.txt写入两行内容:第一行"Happy"(含末尾空格)后换行,第二行"NewYear"。读取时,fin>>s1;提取第一个单词"Happy"(跳过前导空白,遇空格停止),指针停在第一行空格处。随后getline(fin,s2);从当前空格开始读取,遇到紧随其后的换行符停止,s2为空格""。输出s1<<"|"<<s2即为"Happy|"(|后有一个空格)。A:s2错误包含"NewYear",实际上getline只读第一行剩余部分。B:同样错误包含"NewYear"。C:拼接顺序错误。15.执行下面C++代码,会输出()。intdivide(inta,intb){if(b==0)throw"Divisionbyzero";returna/b;}intmain(){intresult=0;try{result=divide(10,0);cout<<"A";}catch(constchar*msg){cout<<"B";result=-1;}cout<<result;return0;}A.A0B.B-1C.A10D.程序崩溃答案:B。解析:divide(10,0)中除数为0,抛出异常,后续cout<<"A"不执行。异常被catch捕获,输出"B",result赋值为-1,最后输出result,结果为"B-1"。其他选项分析如下。A:需未抛出异常且正常输出,但除数为0不可能。C:需未抛出异常且结果正确,错误。D:因异常被捕获,程序不会崩溃。二、判断题(每题2分,共20分)。16.小杨正在调试他的温度传感器程序,其中变量x保存当前温度。下面这段代码运行后,变量x的值变成了8。()。intx=5;int*p=&x;3*p=*p+3;答案:正确。解析:p指向x,*p=*p+3等价于x=x+3,x从5变为8。描述正确。17.一个结构体不能包含另一个结构体。()。答案:错误。解析:结构体语句可以嵌套,嵌套后的结构体声明的变量,需要逐层访问。18.在C++中,定义如下二维数组:inta[3][4];数组a在内存中是按行优先连续存放的,即a[0][0]、a[0][1]、a[0][2]、a[0][3]在内存中是连续的。()。答案:正确。解析:C++中二维数组按行优先连续存储。描述正确。19.执行下面程序后,变量a的值会变成15。()。voidadd(int&x){x+=10;}inta=5;add(a);答案:正确。解析:add函数通过引用修改x,a传递进去后增加10,a变为15。描述正确。20.执行下面的C++代码,会输出8,因为两个指针地址相差8个字节(假设int占4字节)。()。intarr[5]={1,2,3,4,5};int*p1=arr;int*p2=arr+2;cout<<p2-p1;//输出结果。答案:错误。解析:指针相减得到的是元素个数,不是字节数。p2-p1等于2,输出2,而不是8。描述错误。21.考虑用如下递推方式计算斐波那契数列,时间复杂度是O(n)。()。intn=10;intf[20];f[0]=0;f[1]=1;for(inti=2;i<=n;i++)f[i]=f[i-1]+f[i-2];答案:正确。解析:循环从2到n,每次常数操作,时间复杂度O(n)。描述正确。22.冒泡排序和插入排序都是稳定排序算法。()。答案:正确。解析:冒泡排序和插入排序都是稳定的排序算法。描述正确。23.下面这段代码实现了选择排序算法。()。voidsort(inta[],intn){for(inti=1;i<n;i++){intx=a[i];intj=i-1;while(j>=0&&a[j]>x){a[j+1]=a[j];j--;}a[j+1]=x;}}答案:错误。解析:代码实现的是插入排序(将元素插入到已排序序列),不是选择排序。描述错误。24.下面代码可以正常编译并输出10。()。#include<iostream>usingnamespacestd;intcalculate(intx,inty=10);intmain(){cout<<calculate(5);//调用1。return0;}intcalculate(intx,inty){returnx*y;}intcalculate(intx){//重载函数。returnx*2;}答案:错误。解析:存在两个calculate函数:一个有两个参数(第二个有默认值),另一个有一个参数。调用calculate(5)有歧义,编译错误。描述错误。25.执行下面代码会输出100。()。intmain(){ofstreamfout("data.txt");fout<<10<<""<<20<<endl;fout<<30<<""<<40;fout.close();ifstreamfin("data.txt");inta,b,c,d;fin>>a>>b>>c>>d;fin.close();cout<<a+b+c+d;return0;}答案:正确。解析:写入四个整数10、20、30、40,读取后求和为100。描述正确。三、编程题(每题25分,共50分)。26.试题名称:建造。时间限制:1.0s。内存限制:512.0MB。题目描述:小A有一张M行N列的地形图,其中第i行第j列的数字aij代表坐标(i,j)的海拔高度。停机坪为一个3×3的区域且内部所有9个点的最大高度和最小高度之差不超过H。小A想请你计算出,在所有适合建造停机坪的区域中,区域内部9个点海拔之和最大是多少。输入格式:第一行三个正整数M,N,H,含义如题面所示。之后M行,第i行包含N个整数ai1,ai2…aiN,代表坐标(i,j)的高度。数据保证总存在一个适合建造停机坪的区域。输出格式:输出一行,代表最大的海拔之和。数据范围:对于所有测试点,保证1≤M,N≤103,1≤H,aij≤105。参考程序。#include<iostream>usingnamespacestd;inta[1010][1010];intmain(){intM,N,H;cin>>M>>N>>H;for(inti=1;i<=M;++i){for(intj=1;j<=N;++j){cin>>a[i][j];}}intmax_sum=0;for(inti=1;i<=M-2;++i){for(intj=1;j<=N-2;++j){intlocal_max=a[i][j],local_min=a[i][j],local_sum=0;for(intx=0;x<3;++x){for(inty=0;y<3;++y){intheight=a[i+x][j+y];local_sum+=height;if(height>local_max)local_max=height;if(height<local_min)local_min=height;}}if(local_max-local_min<=H){if(local_sum>max_sum){max_sum=local_sum;}}}}cout<<max_sum;return0;}解析:遍历所有可能的3x3区域的左上角坐标(i,j),其中i范围0到M-3,j范围0到N-3。对于每个区域,提取9个元素,计算最大值、最小值和总和。如果最大值与最小值之差不超过H,则用总和更新max_sum。输出max_sum。27.试题名称:优先购买。时间限制:1.0s。内存限制:512.0MB。题目描述:小A有M元预算。商店有N个商品,每个商品有商品名S、价格P和优先级V三种属性,其中V为正整数,且V越小代表商品的优先级越高。小A的购物策略为。(1)总是优先买优先级最高的东西。(2)如果有多个最高优先级商品,购买价格最低的。(3)如果有多个优先级最高且价格最低的商品,购买商品名字典序最小的。小A想知道能购买哪些商品。输入格式:第一行两个正整数M,N,代表预算和商品数。之后N行,每行一个商品,依次为SiPiVi,代表第i个商品的商品名、价格、优先级。数据保证不存在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论