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

下载本文档

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

文档简介

2026年6月GESP编程能力认证C++等级考试四级真题(含答案)一、判断题(共10题,每题2分,总计20分)1.在C++中,定义二维数组inta[3][4];则数组a在内存中按行优先顺序存储,假设int类型占4字节,该数组总共占用48字节的连续内存空间。2.若函数定义中形参为数组类型,例如voidfunc(intarr[]);调用该函数时将实参数组传入,函数内部对arr元素的修改会同步作用到原实参数组上。3.对于字符串"GESP2026",使用C++string类的length()成员函数获取的字符串长度为9,返回值包含系统自动添加的'\0'结束符。4.递归函数必须存在明确的递归终止条件,否则会出现无限递归,最终可能导致栈溢出错误。5.定义结构体类型Student时,必须在定义类型的同时声明结构体变量,否则后续无法使用该类型创建变量。6.使用冒泡排序对长度为n的数组进行升序排序,最坏情况下的时间复杂度为O(n²)。7.若有定义chars[]="Hello";则s数组的实际存储长度为5个字符,对应'H'、'e'、'l'、'l'、'o'五个元素。8.二分查找算法只能用于已经按照升序或降序排序完成的有序数组,无法直接在无序数组上使用。9.二维数组定义时必须明确指定第一维和第二维的长度,因此intb[][3]={{1,2,3},{4,5,6}};属于非法定义,编译时会报错。10.枚举算法的核心思想是逐一验证所有可能的候选解,检查其是否满足题目给定的约束条件,因此若问题的正确解存在于枚举的候选解范围内,枚举算法一定能找到该解。二、单选题(共15题,每题3分,总计45分)1.下列数组定义语句中,符合C++语法规范且能正确初始化的是()。A.inta[5]={1,2,3,4,5,6};B.intb[];C.intc[3][4]={{1,2},{3},{4,5,6,7}};D.chard[5]="Hello";2.已知有函数定义如下:intcalc(intx,inty){returnx*2+y;}若执行语句intres=calc(calc(1,2),calc(3,4));则变量res的值为()。A.18B.22C.20D.163.有C风格字符串定义charstr[]="GESP2026June";则表达式strlen(str)的返回值是()。A.12B.13C.14D.154.下列关于递归函数的描述中,错误的是()。A.递归函数通常包含递归过程和边界终止条件两个核心部分B.递归函数在执行过程中会存在多次自身调用的行为C.递归函数的执行效率一定高于同功能的非递归实现D.递归函数调用时,系统会使用栈空间存储每次调用的局部变量、返回地址等信息5.定义如下结构体类型,若要声明一个该类型的变量stu,并将其score成员赋值为95,下列写法正确的是()。structStudent{stringname;intage;intscore;};A.Studentstu;stu.score=95;B.stu.score=95;Studentstu;C.structstu;stu.score=95;D.Studentstu;score=95;6.对长度为7的升序有序数组[3,7,12,18,25,31,42]使用二分查找查找元素12,假设每次比较取区间中间位置的元素,若区间长度为偶数则取中间偏左的位置,需要经历的比较次数为()。A.2B.3C.4D.57.下列关于C++中string类操作的说法,正确的是()。A.strings="abc";s+="def";执行后s的值为"abcdef"B.strings1="hello",s2="world";则s1>s2的结果为trueC.strings="test";则s[4]表示字符串的最后一个字符't'D.strings;cin>>s;若输入"HelloWorld",则s的值为"HelloWorld"8.使用选择排序对数组[5,3,8,1,2]进行升序排序,第一轮排序(即第一次遍历整个未排序区间选择最小值并交换到区间起始位置)完成后,数组的状态为()。A.[1,3,8,5,2]B.[3,5,1,2,8]C.[3,5,8,1,2]D.[1,2,3,5,8]9.下列代码执行后,输出的结果是()。usingnamespacestd;intfunc(intn){if(n<=1)return1;returnfunc(n-1)+func(n-2);}intmain(){cout<<func(5)<<endl;return0;}A.5B.8C.13D.310.下列关于二维数组的描述中,正确的是()。A.二维数组定义时第二维的长度在初始化时可以省略,第一维长度必须明确指定B.二维数组可以视为特殊的一维数组,其每个元素本身又是一个一维数组C.inta[2][3];数组中a[1][2]是第1行第2列的元素,对应数组行优先存储的第4个位置(从0开始计数)D.对二维数组进行遍历时,只能先行后列遍历,不能先列后行遍历11.下列代码的运行结果是()。usingnamespacestd;voidchange(intarr[],intn){for(inti=0;i<n;i++){arr[i]=arr[i]*2;}}intmain(){inta[5]={1,2,3,4,5};change(a,5);intsum=0;for(inti=0;i<5;i++){sum+=a[i];}cout<<sum<<endl;return0;}A.15B.30C.25D.2012.若要枚举所有由1、2、3三个数字组成的没有重复数字的三位数,总共需要枚举的合法候选数个数是()。A.3B.6C.9D.2713.对于一个长度为n的一维数组,下列操作的时间复杂度为O(1)的是()。A.顺序查找数组中值为x的元素的位置B.修改数组第k个位置的元素值C.对数组进行冒泡升序排序D.统计数组中所有元素的平均值14.有C风格字符串chars[20]="2026GESP";若要将字符串"C++"拼接到s的末尾,使得s的内容变为"2026GESPC++",下列函数调用正确的是()。A.strcat(s,"C++");B.strcpy(s,"C++");C.strlen(s,"C++");D.strcmp(s,"C++");15.下列递推问题中,递推关系描述错误的是()。A.爬楼梯问题中,每次可以爬1级或2级台阶,f(n)表示爬n级台阶的方法数,则递推式为f(n)=f(n-1)+f(n-2),边界f(1)=1,f(2)=2B.斐波那契数列中,f(n)表示第n项,若f(1)=1,f(2)=1,则递推式为f(n)=f(n-1)+f(n-2)C.n阶台阶问题中,每次可以爬任意不超过当前剩余台阶数的级数,f(n)表示爬n级台阶的总方法数,则递推式为f(n)=2*f(n-1),边界f(1)=1D.求1到n的整数和时,f(n)表示累加和,则递推式为f(n)=f(n-1)+n-1,边界f(1)=1三、编程题(共2题,第一题15分,第二题20分,总计35分)1.(15分)成绩统计题目描述:某班级共有n名学生参加了GESP四级模拟考试,每个学生的成绩为0到100之间的整数。请编写程序,统计班级中的最高分、最低分,以及成绩大于等于80分的优秀学生人数。输入格式:第一行输入一个正整数n(1≤n≤1000),表示班级学生总数;第二行输入n个0到100之间的整数,依次表示每个学生的成绩,整数之间用单个空格分隔。输出格式:输出共三行,第一行输出一个整数表示班级最高分,第二行输出一个整数表示班级最低分,第三行输出一个整数表示成绩大于等于80分的优秀学生人数。输入样例:57892856690输出样例:92663样例说明:5名学生的成绩分别为78、92、85、66、90,其中最高分为92,最低分为66,成绩大于等于80分的学生有92、85、90共3人,与输出结果一致。注意事项:代码中需要使用数组存储所有学生的成绩,不得直接在输入过程中跳过存储完成统计,需体现一维数组的定义、读取、遍历操作,符合四级考试考点要求。2.(20分)矩阵转置题目描述:给定一个m行n列的整数矩阵,请编写程序将该矩阵转置后输出。矩阵转置是线性代数中的基础操作,指将原矩阵的行元素和列元素互换,形成一个n行m列的新矩阵:原矩阵中第i行第j列的元素,在转置后的矩阵中位于第j行第i列的位置。输入格式:第一行输入两个正整数m和n(1≤m,n≤100),分别表示原矩阵的行数和列数;接下来m行,每行输入n个整数,整数之间用单个空格分隔,表示原矩阵中的元素,每个元素的取值范围为-1000到1000。输出格式:输出共n行,每行m个整数,整数之间用单个空格分隔,表示转置后的矩阵,每行末尾不得出现多余空格。输入样例:23123456输出样例:142536样例说明:原矩阵是2行3列的矩阵,转置后为3行2列:第一行由原矩阵第一列的1、4两个元素组成,第二行由原矩阵第二列的2、5两个元素组成,第三行由原矩阵第三列的3、6两个元素组成。注意事项:代码中需要使用二维数组存储原矩阵数据,不得边读边输出跳过二维数组存储过程;输出时需要严格控制空格格式,行尾多余空格会导致格式判分错误。参考答案与解析(一)判断题答案与解析1.答案:√。解析:C++中二维数组默认采用行优先的连续内存存储规则,即先存储第一行的所有元素,再依次存储后续行的元素。当int类型占4字节时,3行4列的二维数组共包含3*4=12个int类型元素,总内存占用为12*4=48字节,题目描述完全符合C++语法规则。2.答案:√。解析:C++中数组作为函数形参时,不会对整个数组进行值拷贝,而是传递实参数组首元素的内存地址,形参与实参共享同一块连续内存空间,因此函数内部对形参数组元素的修改,会直接反映到原实参数组上,这也是数组作为参数区别于普通值传递参数的核心特点。3.答案:×。解析:C++string类的length()(与size()方法等价)返回的是字符串中有效字符的个数,统计范围是从字符串起始位置到末尾标识前的所有字符,不包含系统为了兼容C风格字符串自动维护的'\0'结束符。字符串"GESP2026"包含G、E、S、P、2、0、2、6共8个有效字符,因此length()的返回值为8,题目描述错误。4.答案:√。解析:递归函数的执行逻辑是“将大问题分解为同结构的小问题,通过调用自身求解小问题,再合并结果”,必须设置明确的终止条件(即最小规模问题的直接解)才能结束递归调用。如果缺少终止条件,函数会无限制地调用自身,每次调用都会在程序栈上存储局部变量、返回地址等上下文信息,最终会因栈内存耗尽触发栈溢出错误,导致程序崩溃。5.答案:×。解析:结构体类型的定义本质是创建一个自定义的数据类型模板,定义过程中不需要同时声明该类型的变量;类型定义完成后,可以在程序的任意合法位置使用该类型名声明变量,题目描述错误。6.答案:√。解析:冒泡排序的核心逻辑是通过相邻元素的比较和交换,将较大的元素逐步“冒泡”到数组末尾。当待排序数组完全逆序时,冒泡排序需要执行n-1轮遍历,每轮遍历需要比较当前未排序区间的所有相邻元素,总比较次数为n(n-1)/2,对应的时间复杂度为O(n²),属于经典的平方级排序算法。7.答案:×。解析:使用双引号包裹的字符串常量初始化C风格字符数组时,编译器会自动在字符串的末尾添加一个'\0'作为结束标识,因此字符串"Hello"包含5个可见字符和1个隐藏的'\0'结束符,共6个字符,对应的char数组长度为6,题目描述错误。8.答案:√。解析:二分查找的高效性来源于“每次比较排除一半候选区间”的逻辑,该逻辑成立的核心前提是数组元素有序(升序或降序)。如果数组是无序的,比较中间元素后无法确定目标值所在的子区间,因此无法直接使用二分查找,只能采用顺序查找等无序列表的查找方法。9.答案:×。解析:C++中定义二维数组时,必须明确指定第二维的长度(因为需要根据第二维长度计算每行元素的内存偏移),而第一维的长度可以在初始化时省略,编译器会根据初始化列表中的元素总数和第二维长度自动计算第一维的大小。题目中给出的intb[][3]定义,初始化列表包含6个元素,第二维长度为3,因此编译器自动计算第一维长度为2,该定义是完全合法的,题目描述错误。10.答案:√。解析:枚举算法又称为穷举算法,核心思路是把问题所有可能的解逐一列举,逐个验证每个候选解是否满足题目给出的约束条件,最终筛选出符合要求的解。只要枚举过程没有遗漏候选范围,且问题的正确解属于候选范围,枚举算法就一定能找到正确解,其缺点是当候选范围过大时执行效率较低。(二)单选题答案与解析1.答案:C。解析:选项A中初始化列表包含6个整数,超过了数组定义的长度5,会触发编译错误;选项B定义一维数组时既没有指定数组长度,也没有提供初始化列表供编译器推导长度,属于非法定义;选项C的二维数组定义明确指定第二维长度为4,初始化列表中每行元素不足的位置会自动初始化为0,符合C++语法规则;选项D中字符串"Hello"需要6字节的存储空间(含'\0'),但数组长度定义为5,无法存储完整字符串,属于非法初始化。2.答案:A。解析:函数嵌套调用时,按照“先内层、后外层”的顺序计算:首先计算calc(1,2),代入公式得1*2+2=4;再计算calc(3,4),代入公式得3*2+4=10;最后计算外层calc(4,10),代入公式得4*2+10=18,因此res变量的最终值为18。3.答案:A。解析:strlen()是C标准库中用于计算C风格字符串长度的函数,其计数规则是从字符串起始地址开始逐字节计数,直到遇到第一个'\0'停止,计数结果不包含'\0'本身。字符串"GESP2026June"中的有效字符依次为G、E、S、P、2、0、2、6、J、u、n、e,共12个字符,因此strlen返回值为12。需要注意的是,存储该字符串的字符数组实际长度为13(包含末尾的'\0'),但strlen不统计结束符。4.答案:C。解析:递归函数虽然在描述某些具有递归结构的问题(如汉诺塔、树形问题)时逻辑更清晰,但由于存在频繁的函数调用开销和栈空间占用,其执行效率通常低于同功能的非递归(迭代)实现,当递归深度过大时还可能触发栈溢出,因此选项C的描述错误。其余选项均符合递归函数的核心特性。5.答案:A。解析:使用自定义结构体类型声明变量时,需要先写结构体类型名,再写变量名;访问结构体成员时,需要通过“变量名.成员名”的格式。选项B的变量声明顺序错误,在给stu赋值时stu还未被声明;选项C声明变量时未使用正确的结构体类型名Student,属于语法错误;选项D访问score成员时未指定所属的结构体变量,编译器无法识别score对应的变量,属于语法错误。6.答案:B。解析:按照题目给定的二分查找规则,查找12的过程如下:初始查找区间为下标0到6,计算中间位置为(0+6)/2=3,对应元素为18,12<18,因此将右边界调整为2;第二次查找区间为下标0到2,中间位置为(0+2)/2=1,对应元素为7,12>7,因此将左边界调整为2;第三次查找区间为下标2到2,中间位置为2,对应元素为12,查找成功,总共经历3次比较。7.答案:A。解析:string类重载了+=运算符,支持直接将另一个字符串拼接到当前字符串末尾,因此选项A的操作后s的值为"abcdef",描述正确。选项B中字符串比较按照逐字符ASCII码比较的规则,第一个字符'h'的ASCII码为104,'w'的ASCII码为119,因此s1小于s2,s1>s2的结果为false;选项C中strings="test"的有效下标范围是0到3,s[4]属于越界访问,会触发未定义行为,且最后一个字符是s[3]对应的't';选项D中cin>>读取字符串时遇到空格、换行等空白字符会停止读取,因此输入"HelloWorld"时s只能获取到空格前的"Hello"。8.答案:A。解析:选择排序升序排序的第一轮需要遍历整个未排序区间(即全部5个元素),找到区间内的最小值1,将其与区间第一个位置的元素5交换,交换后的数组为[1,3,8,5,2]。选项C是数组初始状态,选项B是冒泡排序第一轮的结果,选项D是排序完成后的最终结果。9.答案:B。解析:该递归函数实现的是经典的斐波那契数列变体,边界条件为n≤1时返回1,依次计算可得:func(0)=1,func(1)=1,func(2)=func(1)+func(0)=2,func(3)=func(2)+func(1)=3,func(4)=func(3)+func(2)=5,func(5)=func(4)+func(3)=8,因此输出结果为8。10.答案:B。解析:选项A错误,二维数组定义时第一维长度可以在初始化时省略,第二维长度必须指定;选项B正确,C++中二维数组的本质是一维数组,其每个元素都是一个长度为第二维大小的一维数组;选项C错误,行优先存储下,a[i][j]的存储位置偏移为i*列数+j,因此a[1][2]的偏移量为1*3+2=5,是第6个存储位置(从0开始计数);选项D错误,C++语法不限制二维数组的遍历顺序,既可以先行后列遍历,也可以先列后行遍历,只是先列后行遍历会降低CPU缓存命中率,效率较低,但语法完全合法。11.答案:B。解析:change函数接收数组首地址后,遍历数组将每个元素的值乘以2,由于数组参数传递的是地址,修改会直接作用于原数组。原数组a经过函数调用后,元素变为2、4、6、8、10,累加求和的结果为30。12.答案:B。解析:组成无重复数字的三位数时,百位有3种数字可选;百位选定后,十位有剩余2个数字可选;十位选定后,个位只有剩余1个数字可选,因此总共有3*2*1=6个合法三位数,枚举时需要覆盖所有6种排列。13.答案:B。解析:数组的核心特点是支持随机访问,通过下标可以直接定位到任意位置的元素,时间复杂度为O(1),因此修改第k个位置元素的操作时间复杂度为O(1)。顺序查找元素需要逐个比较,统计平均值需要遍历所有元素,时间复杂度均为O(n);冒泡排序需要双重循环遍历,时间复杂度为O(n²)。14.答案:A。解析:strcat函数的功能是将第二个参数指向的字符串拼接到第一个参数指向的字符串末尾,要求第一个参数指向的字符数组有足够的剩余空间容纳拼接的内容,题目中s数组长度为20,存储"2026GESP"(8个有效字符)后仍有11字节的剩余空间,足够拼接"C++"(3个有效字符加'\0'),调用符合要求。strcpy是字符串覆盖拷贝函数,会将原内容替换;strlen只接收一个参数,用于计算字符串长度;strcmp用于比较两个字符串的字典序,均不符合需求。使用C风格字符串函数时需注意包含<cstring>头文件,正式考试中建议明确引入头文件避免编译错误。15.答案:D。解析:1到n的整数和递推逻辑应为:前n个数的和等于前n-1个数的和加上第n个整数n,即递推式f(n)=f(n-1)+n,边界f(1)=1。选项D中的递推式为f(n)=f(n-1)+n-1,例如计算1+2=3时,f(2)=f(1)+1=2,与实际结果不符,描述错误。其余选项的递推关系均正确:选项C的爬楼梯问题,每次可以爬任意级数时,f(n)=f(n-1)+f(n-2)+…+f(0),递推可得f(n)=2*f(n-1),f(1)=1时f(n)=2^(n-1),与实际组合数结果一致。(三)编程题参考代码1.成绩统计参考代码```cppusingnamespacestd;intmain(){intn;cin>>n;intscores[1005];//数组开1005大小,覆盖n最大1000的边界for(inti=0;i<n;i++){cin>>scores[i];}intmax_score=s

温馨提示

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

最新文档

评论

0/150

提交评论