版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年9月GESP编程能力认证C++等级考试四级真题(含答案和解析)一、单选题(每题2分,共30分)。1.运行下面程序后变量a的值是()。inta=42;int*p=&a;*p=*p+1;A.42B.43C.编译错误D.不确定答案:B。解析:指针`p`指向变量`a`,`*p`是对`p`的解引用(即访问`a`的值)。执行`*p=*p+1`时,相当于`a=42+1`,因此`a`的值变为43。2.以下关于数组的描述中,()是错误的。A.数组名是一个指针常量B.随机访问数组的元素方便快捷C.数组可以像指针一样进行自增操作D.sizeof(arr)返回的是整个数组arr占用的字节数答案:C。解析:A项,数组名多数场景下是指向首元素的指针常量,正确。B:数组元素连续存储,下标随机访问高效,正确。C:数组名是指针常量,不可自增;指针变量可自增,错误。D:sizeof(arr)返回数组总字节数,正确。3.给定如下定义的数组arr,则*(*(arr+1)+2)的值是()。intarr[2][3]={{1,2,3},{4,5,6}};A.2B.5C.4D.6答案:D。解析:arr+1指向二维数组的第二行({4,5,6})首地址。*(arr+1)是第二行的数组名,指向该行第一个元素4。*(arr+1)+2指向第二行第三个元素6。*(*(arr+1)+2)取出该元素的值,即6。4.下面这段代码会输出()。intadd(inta,intb=1);//函数声明。intmain(){cout<<add(2)<<""<<add(2,3);return0;}intadd(inta,intb){//函数定义。returna+b;}A.35B.编译失败:定义处少了默认参数。C.运行错误D.链接失败:未定义引用。答案:A。解析:C++中函数默认参数在声明处指定,定义处可省略。add(2)中b取默认值1,结果为2+1=3;add(2,3)中b为3,结果为2+3=5,最终输出35。5.下面这段代码会输出()。intx=5;voidfoo(){intx=10;cout<<x<<"";}voidbar(){cout<<x<<"";}intmain(){foo();bar();}A.55B.1010C.510D.105答案:D。解析:foo函数中定义了局部变量x=10,会屏蔽全局x,因此输出10。bar函数中无局部x,访问全局变量x=5,因此输出5。最终输出“105”。6.下面程序运行的结果是()。voidincreaseA(intx){x++;}voidincreaseB(int*p){(*p)++;}intmain(){inta=5;increaseA(a);cout<<a<<"";increaseB(&a);cout<<a;}A.67B.66C.56D.55答案:C。解析:increaseA采用传值调用,函数内修改形参不影响实参a,故a仍为5。increaseB采用传址调用,通过指针直接修改实参a,a变为6。最终输出“56”。7.关于结构体初始化,以下哪个选项中正确的是()。structPoint{intx,y;};A.Pointp=(1,2);B.Pointp={1,2};C.Pointp=new{1,2};D.Pointp=<1,2>;答案:B。解析:C++中结构体初始化采用花括号列表初始化。选项A:圆括号(1,2)不是结构体初始化的合法语法,错误。选项B:{1,2}是列表初始化的正确形式,正确。选项C:new用于动态分配内存(返回指针),而p是结构体变量,语法错误。选项D:<1,2>不是结构体初始化的合法语法,错误。8.运行如下代码会输出()。structCat{stringname;intage;};voidbirthday(Cat&c){c.age++;}intmain(){Catkitty{"Mimi",2};birthday(kitty);cout<<<<""<<kitty.age;}A.Mimi2B.Mimi3C.kitty3D.kitty2答案:B。解析:birthday函数通过引用传递(Cat&c)直接修改实参kitty的age。初始kitty.age=2,调用后age++变为3;name保持为"Mimi",最终输出“Mimi3”。9.关于排序算法的稳定性,以下说法错误的是()。A.稳定的排序算法不改变相等元素的相对位置B.冒泡排序是稳定的排序算法C.选择排序是稳定的排序算法D.插入排序是稳定的排序算法答案:C。解析:稳定排序的核心是“不改变相等元素的相对位置”。选项A:符合稳定排序的定义,正确。选项B:冒泡排序中相等元素不交换,是稳定排序,正确。选项C:选择排序会改变相等元素的相对位置(如序列[2,2,1],排序后第一个2会被换到第二个2之后),是不稳定排序,错误。选项D:插入排序中相等元素后插入的不会前移,是稳定排序,正确。10.下面代码试图实现选择排序,使其能对数组nums排序为升序,则横线上应分别填写()。voidselectionSort(vector<int>&nums){intn=nums.size();for(inti=0;i<n-1;++i){intminIndex=i;for(intj=i+1;j<n;++j){if(__________){//在此处填入代码。minIndex=j;}}____________________;//在此处填入代码。}}A.nums[j]<nums[minIndex]swap(nums[i],nums[minIndex])B.nums[j]>nums[minIndex]swap(nums[i],nums[minIndex])C.nums[j]<=nums[minIndex]swap(nums[j],nums[minIndex])D.nums[j]<=nums[minIndex]swap(nums[i],nums[j])答案:A。解析:选择排序需“每次找待排序区间的最小元素,与当前起始位置交换”。第一个空判断nums[j]<nums[minIndex](找更小元素以更新最小索引)。第二个空执行swap(nums[i],nums[minIndex])(将最小元素交换到当前起始位置)。11.下面程序实现插入排序(升序排序),则横线上应分别填写()。voidinsertionSort(intarr[],intn){for(inti=1;i<n;i++){intkey=arr[i];intj=i-1;while(j>=0&&____________________){//在此处填入代码。arr[j+1]=arr[j];j--;}____________________;//在此处填入代码。}}A.arr[j]>keyarr[j+1]=keyB.arr[j]<keyarr[j+1]=keyC.arr[j]>keyarr[j]=keyD.arr[j]<keyarr[j]=key答案:A。解析:插入排序中,需将key(当前待插入元素)插入到前面已排序区间的正确位置。第一个空的条件为arr[j]>key(当前元素比key大,需后移)。循环结束后,将key插入到arr[j+1]的位置,即arr[j+1]=key。12.关于插入排序的时间复杂度,下列说法正确的是()。A.最好情况和最坏情况的时间复杂度都是O(n2)B.最好情况是O(n),最坏情况是O(n2)。C.最好情况是O(n),最坏情况是O(2n)。D.最好情况是O(n2),最坏情况是O(2n)。答案:B。解析:插入排序中,最好情况(数组已升序)只需遍历一次,时间复杂度为O(n)。最坏情况(数组逆序)需频繁移动元素,时间复杂度为O(n²)。13.小杨正在爬楼梯,需要n阶才能到达楼顶,每次可以爬1阶或2阶,求小杨有多少种不同的方法可以爬到楼顶,横线上应填写()。intclimbStairs(intn){if(n<=2)returnn;intprev2=1;intprev1=2;intcurrent=0;for(inti=3;i<=n;++i){________________//在此处填入代码。}returncurrent;}A.prev2=prev1;prev1=current;current=prev1+prev2;B.current=prev1+prev2;prev2=prev1;prev1=current;C.current=prev1+prev2;prev1=current;prev2=prev1;D.prev1=current;prev2=prev1;current=prev1+prev2;答案:B。解析:爬楼梯问题的方法数满足斐波那契递推关系,current=prev1+prev2(第n阶方法数=第n-1阶+第n-2阶)。之后需更新prev2和prev1以推进迭代,即prev2=prev1,prev1=current。选项B的代码逻辑符合这一过程,因此正确。14.假设有一个班级的成绩单,存储在一个长度为n的数组scores中,每个元素是一个学生的分数。老师想要找出所有满足scores[i]+scores[j]+scores[k]==300的三元组,其中i<j<k。下面代码实现该功能,请问其时间复杂度是()。intcnt=0;for(inti=0;i<n;i++){for(intj=i+1;j<n;j++){for(intk=j+1;k<n;k++){if(scores[i]+scores[j]+scores[k]==300){cnt++;}}}}A.O(n)B.O(n2)C.O(n3)D.O(2n)答案:C。解析:代码包含三层嵌套循环,i、j、k的遍历次数大致为n×n×n,因此时间复杂度为O(n³)。15.关于异常处理,以下说法错误的是()。A.try块中的代码可能会抛出异常B.catch块可以有多个,处理不同类型的异常。C.throw语句用于抛出异常D.所有异常都必须被捕获,否则程序会崩溃。答案:D。解析:C++中并非所有异常都必须被捕获,未捕获的异常会导致程序终止,但不是“必须捕获”。选项A、B、C分别符合try块、多catch块、throw语句的正确定义,只有D错误。二、判断题(每题2分,共20分)。16.以下代码能正确初始化指针。inta=5;int*p=a;答案:错误。解析:指针p初始化时应赋值变量a的地址(即&a),而代码中int*p=a;是将a的值(而非地址)赋给指针,语法错误,无法正确初始化指针。17.执行下面C++代码将输出11。()。intx=10;voidf(){intx=x+1;cout<<x<<endl;}intmain(){f();}答案:错误。解析:函数f中定义的局部变量x在初始化时使用了自身(intx=x+1;),此时x未被初始化,属于未定义行为,不会输出11。18.以下C++代码合法。()。structStudent{stringname;intage;floatscore;};Student*students=newStudent[20];答案:正确。解析:代码中通过newStudent[20]动态分配了一个包含20个Student结构体对象的数组,这是C++中合法的动态内存分配语法,因此代码合法。19.执行下面C++代码将输出10。()。voidfunc(int*p){*p=10;}intmain(){inta=5;func(&a);cout<<a<<endl;return0;}答案:正确。解析:func函数接收a的地址(传址调用),在函数内通过解引用*p=10直接修改了main中变量a的值,因此最终输出a为10,该说法正确。20.下面代码将二维数组arr传递给函数f,函数内部用arr[i][j]访问元素,函数参数声明为intarr[][4]是错误的。()。voidf(intarr[][4],introws){//访问arr[i][j]。}intmain(){intarr[3][4]={/*初始化*/};f(arr,3);}答案:错误。解析:C++中传递二维数组时,函数参数需明确列的大小,行可省略。本题中函数参数声明intarr[][4]是合法的,因此题目说法错误。21.递推是在给定初始条件下,已知前一项(或前几项)求后一项的过程。()。答案:正确。解析:递推的核心逻辑是在给定初始条件下,通过已知的前一项或前几项推导后续项,该描述完全符合递推的定义,因此正确。22.虽然插入排序的时间复杂度为O(n2),但由于单元操作相对较少,因此在小数据量的排序任务中非常受欢。()。迎。答案:正确。解析:插入排序的时间复杂度为O(n2),但在小数据量排序时,其元素移动、比较等单元操作相对简单,开销较低,因此在小数据量排序任务中广泛使用,该描述正确。23.对整数数组{4,1,3,1,5,2}进行冒泡排序(将最大元素放到最后),执行一轮之后是{4,1,3,1,2,5}。()。答案:错误。解析:冒泡排序一轮需相邻元素两两比较并将大元素后移。原数组{4,1,3,1,5,2}的一轮比较过程为:初始数组[4,1,3,1,5,2]。第一轮冒泡排序(相邻元素比较并交换)。比较索引0和1:'4'和'1'。'4>1'→交换。数组变为:'[1,4,3,1,5,2]'。比较索引1和2:'4'和'3'。'4>3'→交换。数组变为:'[1,3,4,1,5,2]'。比较索引2和3:'4'和'1'。'4>1'→交换。数组变为:'[1,3,1,4,5,2]'。比较索引3和4:'4'和'5'。'4<5'→不交换。数组保持:'[1,3,1,4,5,2]'。比较索引4和5:'5'和'2'。'5>2'→交换。数组变为:'[1,3,1,4,2,5]'。一轮结束后的数组:[1,3,1,4,2,5]。此时,最大的元素'5'已经被'冒泡'到数组的最后位置。24.以下代码只能捕获int类型异常。()。intmain(){try{throw42;}catch(…){cout<<"Caught"<<endl;}return0;}答案:错误。解析:代码中catch(…)是“捕获所有类型异常”的语法,并非只能捕获int类型异常,因此题目说法错误。25.以下代码将Hello写入文件data.txt。()。ofstreamfile("data.txt");cout<<"Hello"<<endl;file.close();答案:错误。解析:代码中使用cout输出“Hello”,而非向ofstream对象file写入,因此没有将“Hello”写入data.txt,题目说法错误。三、编程题(每题25分,共50分)。26.试题名称:排兵布阵。时间限制:1.0s。内存限制:512.0MB。题目描述:作为将军,你自然需要合理地排兵布阵。地图可以视为n行m列的网格,适合排兵的网格以1标注,不适合排兵的网格以0标注。现在你需要在地图上选择一个矩形区域排兵,这个矩形区域内不能包含不适合排兵的网格。请问可选择的矩形区域最多能包含多少网格?输入格式:第一行,两个正整数n,m,分别表示地图网格的行数与列数。接下来n行,每行ai,1,ai,2……ai,m个整数,表示各行中的网格是否适合排兵。输出格式:一行,一个整数,表示适合排兵的矩形区域包含的最大网格数。数据范围:对于所有测试点,保证1≤n,m≤12,0≤ai,j≤1。参考程序。#include<algorithm>#include<cstdio>usingnamespacestd;constintN=15;intn,m;inta[N][N];intans;intmain(){scanf("%d%d",&n,&m);for(inti=1;i<=n;i++)for(intj=1;j<=m;j++)scanf("%d",&a[i][j]);for(intu=1;u<=n;u++)for(intl=1;l<=m;l++)for(intd=u;d<=n;d++){intchk=1;for(intr=l;r<=m;r++){for(intx=u;x<=d;x++)chk&=a[x][r];if(!chk)break;ans=max(ans,(r-l+1)*(d-u+1));}}printf("%d\n",ans);return0;}解析:暴力枚举所有可能的矩形区域(通过枚举上下左右边界),检查每个矩形内是否全为1,若是则计算其面积,最终记录最大面积并输出。通过四层循环暴力枚举所有可能的矩形区域(枚举上边界u、左边界l、下边界d、右边界r),然后检查矩形内所有格子是否全为1(通过chk标记),若符合则计算其面积(r-l+1)*(d-u+1),并更新最大面积ans。27.试题名称:最长连续段。时间限制:1.0s。内存限制:512.0MB。题目描述:对于k个整数构成的数组[b1,b2……bk],如果对1≤i<k都有bi+1=bi+1,那么称数组b是一个连续段。给定由n个整数构成的数组[a1,a2……
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 固废堆场防渗漏专项检查细则
- 家用冰箱内部清洗除味操作标准
- 农产品冷链物流运输作业指引
- 危险作业审批与安全监督办法
- 废气治理设施运行维护规程
- 门店服务投诉处理流程
- 营销师市场营销学题目及解析
- 居家老人晨晚间护理作业流程
- 营养套餐设计与制作规范
- 劳动防护用品配备发放标准
- 2026年天津市高校大学《辅导员》招聘考试真题库(含答案)
- 2026年贵州人民版小学三年级综合实践活动下册(全册)教案(附目录)
- 蘑菇中毒突发群体事件应急预案演练脚本
- 2026年山东青岛市中考语文考试真题带答案
- 设备安装验收移交规范
- 2026年海南初二地理生物会考试题题库(答案+解析)
- 2026年中国联通黑龙江省分公司校园招聘笔试备考题库及答案解析
- 2026年国际数学奥林匹克国家集训队测试试题真题(含答案详解)
- 2026年社工考试《初级社会工作综合能力》真题及答案
- 2026年长沙民政职业技术学院单招职业倾向性测试题库含答案详解(能力提升)
- GB/T 338-2025工业用甲醇
评论
0/150
提交评论