2026年6月GESP真题及题解(C++四级): 选择题和判断题(题解)
选择题
第1题
题目:小杨正在编写一个“数字交换器”程序,他希望通过函数交换两个变量的值。请问运行以下代码后,屏幕上输出的是( )。
voidexchange(int*a,int&b){intt=*a;*a=b;b=t;}intmain(){intx=100,y=200;exchange(&x,y);cout<<x<<" "<<y;return0;}A. 100 200
B. 200 100
C. 200 200
D. 编译错误
答案:B
解析:a是指向x的指针,b是y的引用。
执行t = *a后,t = 100;执行*a = b后,x = 200;执行b = t后,y = 100。
因此输出200 100,选 B。
第2题
题目:下面程序想通过函数计算三门课总分,横线处应填入的是( )。
intsumScore(inta,intb,intc){returna+b+c;}intmain(){intchinese=88,math=95,english=90;inttotal=______;cout<<total;return0;}A.sumScore
B.sumScore(chinese, math, english)
C.sumScore(int chinese, int math, int english)
D.sumScore(a, b, c)
答案:B
解析:
调用函数时应传入实参,且不能带类型声明。
正确调用形式为sumScore(chinese, math, english),返回三门课总分。
因此选 B。
第3题
题目:下面程序输出结果是( )。
intaddOne(intx){returnx+1;}intmain(){inta=6;cout<<addOne(a)+addOne(3);return0;}A. 9
B. 10
C. 11
D. 12
答案:C
解析:addOne(a)即addOne(6),返回7。addOne(3)返回4。7 + 4 = 11,因此输出11,选 C。
第4题
题目:关于下面程序,说法正确的是( )。
voidshow(){intstars=5;}intmain(){cout<<stars;return0;}A. 程序输出 5
B. 程序可以通过编译,但输出随机值
C. 程序不能通过编译,因为stars只在show函数中有效
D. 程序不能通过编译,因为cout不能输出变量
答案:C
解析:stars是show函数中的局部变量,作用域只在show函数内部。
在main函数中访问stars会因变量未定义而编译失败。
因此选 C。
第5题
题目:小杨在调试一个“等级提升”系统,代码逻辑如下,执行后*p的值是( )。
intlv=5,next_lv=6;int*p=&lv;*p=*p+1;p=&next_lv;A. 5
B. 6
C.lv的地址
D.next_lv的地址
答案:B
解析:
起初p指向lv,执行*p = *p + 1后,lv变为6。
之后p = &next_lv,p改为指向next_lv。
此时*p就是next_lv的值,即6,选 B。
第6题
题目:小杨正在开发一款名为“星际网格”的游戏,他用二维数组int map[5][4];来表示地图。已知int占 4 字节,如果map的内存地址是0x2000,则表达式&map + 1的地址值是( )。
A.0x204c
B.0x205c
C.0x2050
D.0x2058
答案:C
解析:&map的类型是int (*)[5][4],加 1 会跳过整个二维数组。
数组大小为5 × 4 × 4 = 80字节,即0x50。
所以地址为0x2000 + 0x50 = 0x2050,选 C。
第7题
题目:执行完下面代码后,变量val的值是( )。
intdata[]={10,20,30,40,50};int*ptr=data+2;intval=*(ptr-1)+*(ptr+1);A. 50
B. 60
C. 70
D. 80
答案:B
解析:ptr = data + 2,指向data[2],即30。*(ptr - 1)是data[1],值为20。*(ptr + 1)是data[3],值为40。20 + 40 = 60,选 B。
第8题
题目:某班 3 个小组、每组 4 名同学的分数存入下面的二维数组score,则score[1][2]的值是( )。
intscore[3][4]={{80,81,82,83},{90,91,92,93},{70,71,72,73}};A. 81
B. 90
C. 92
D. 72
答案:C
解析:score[1]表示第二行:{90, 91, 92, 93}。score[1][2]表示该行第 3 个元素,即92。
因此选 C。
第9题
题目:小杨定义了一个结构体Hero来表示游戏角色,下面哪种初始化方式会由于语法错误导致编译失败?( )
structHero{string name;inthp;};A.Hero h = {"Arthur", 100};
B.
Hero h;h.name="Arthur";h.hp=100;C.Hero h = new Hero{"Arthur", 100};
D.Hero *p = new Hero{"Arthur", 100};
答案:C
解析:new Hero{"Arthur", 100}返回的是Hero*指针,不能直接赋值给Hero对象。
选项 C 类型不匹配,会导致编译失败。
选项 D 用Hero*接收是正确的。
第10题
题目:下面程序输出结果是( )。
structBook{string title;intpages;};intmain(){Book books[2]={{"Math",120},{"Science",150}};cout<<books[1].title;return0;}A. Math
B. Science
C. 120
D. 150
答案:B
解析:books[1]是第二个元素,其title为"Science"。
因此输出Science,选 B。
第11题
题目:小杨在对“能量晶石”按亮度进行排序。如果两块晶石亮度相同,他希望保持它们在原始序列中的相对顺序。下列关于排序算法稳定性的说法,错误的是( )。
A. 冒泡排序是稳定的,因为只有在左边比右边大时才交换。
B. 插入排序是稳定的,因为它将元素插入到相等元素的右侧。
C. 选择排序是稳定的,因为它每次选出最小元素放在前面。
D. 稳定性是指排序后相等元素的相对位置不发生改变。
答案:C
解析:
选择排序通常是不稳定的。
每轮将最小元素与当前位置交换时,可能把前面的相等元素换到后面,破坏相对顺序。
因此“选择排序是稳定的”这一说法错误,选 C。
第12题
题目:小杨的机器人正在能量踏板上跳跃,踏板编号为 1,2,3,跳到第n块踏板的方案数满足递推式f(n) = f(n - 1) + f(n - 2)。若f(1) = 1, f(2) = 2,则运行以下代码计算jump(5)的结果是( )。
intjump(intn){if(n<=2)returnn;inta=1,b=2,c=0;for(inti=3;i<=n;i++){c=a+b;a=b;b=c;}returnc;}A. 5
B. 8
C. 13
D. 21
答案:B
解析:f(1) = 1,f(2) = 2。f(3) = 1 + 2 = 3。f(4) = 2 + 3 = 5。f(5) = 3 + 5 = 8。
因此jump(5)返回8,选 B。
第13题
题目:在“模拟实验室”程序中,为了防止除以 0 导致崩溃,小杨使用了异常处理机制。执行以下代码将输出( )。
try{intx=10,y=0;if(y==0)throw"Zero Error";cout<<x/y;}catch(inte){cout<<"Error Code:"<<e;}catch(constchar*msg){cout<<"Caught:"<<msg;}A. 0
B. Error Code:0
C. Caught:Zero Error
D. 程序直接崩溃
答案:C
解析:
抛出的是字符串字面量"Zero Error",类型为const char*。
它会匹配第二个catch (const char *msg)。
因此输出Caught:Zero Error,选 C。
第14题
题目:下面代码使用某种排序算法,将数组中的元素按从小到大排序。这段代码使用的排序算法是( )。
voidmystery_sort(doublearr[],intn){for(inti=0;i<n-1;i++){intminPos=i;for(intj=i+1;j<n;j++){if(arr[j]<arr[minPos]){minPos=j;}}doubletemp=arr[i];arr[i]=arr[minPos];arr[minPos]=temp;}}A. 冒泡排序
B. 插入排序
C. 选择排序
D. 非典型排序
答案:C
解析:
每轮从未排序区间中选择最小元素的下标minPos,然后与当前位置i交换。
这是典型的选择排序。
因此选 C。
第15题
题目:小杨正在读取“冒险日志”文件quest.txt。若文件内容为Level 10,执行以下程序后输出为( )。
ifstreamfin("quest.txt");string s;intv;fin>>s>>v;cout<<s.length()*v;A. 50
B. 15
C. 70
D. 5
答案:A
解析:fin >> s >> v;后,s = "Level",v = 10。"Level"的长度为5。5 * 10 = 50,因此输出50,选 A。
判断题
第1题
题目:运行以下程序后,变量a的值最终会变为20。
voidmodify(int*p){*p=*p+10;}intmain(){inta=10;modify(&a);return0;}答案:√
解析:modify(&a)将a的地址传入,函数中*p = *p + 10直接修改了a。a由10变为20。
因此说法正确。
第2题
题目:在 C++ 中,引用一旦初始化并绑定到某个变量后,可以通过赋值语句将其重新绑定到另一个变量。
答案:×
解析:
引用必须在定义时初始化,并且一旦绑定后不能再重新绑定到其他变量。
对引用赋值实际上是修改它所绑定的那个变量的值,而不是改变引用本身。
因此说法错误。
第3题
题目:下面程序可以正确计算并输出 3 名学生的平均成绩。
structStudent{intid;intscore;};intmain(){Student students[3]={{1,90},{2,80},{3,100}};intsum=0;for(inti=0;i<3;i++){sum+=students[i].score;}doubleaverage=sum/3.0;cout<<average<<endl;return0;}答案:√
解析:
程序正确累加了三名学生的score,总和为270。sum / 3.0使用浮点除法,结果为90.0。
因此可以正确计算并输出平均成绩。
第4题
题目:选择排序算法在寻找每一轮最小值时,如果遇到相等的元素不进行交换,则选择排序是一种稳定的排序算法。
答案:×
解析:
选择排序通常不稳定。
即使寻找最小值时不交换相等元素,后面将最小值与当前位置交换时,仍可能跨过相等元素,破坏它们的相对顺序。
因此说法错误。
第5题
题目:如果使用带flag的冒泡排序,且待排序数组一开始就是有序的,那么算法只需一轮扫描即可结束,时间复杂度为O(n)。
答案:√
解析:
带flag的冒泡排序在一轮扫描中没有发生交换时,会提前结束。
若数组初始有序,只需扫描一轮,比较n - 1次,时间复杂度为O(n)。
因此说法正确。
第6题
题目:在 C++ 中定义二维数组并初始化时,可以省略第一维,但不能省略第二维。因此int a[][2] = {{1, 2}, {3, 4}};是合法的,而int a[][1] = {{1, 2}, {3, 4}};是不合法的。
答案:√
解析:
二维数组初始化时可以省略第一维,由初始化列表推导行数,但第二维必须明确给出。int a[][2] = {{1, 2}, {3, 4}};合法。int a[][1] = {{1, 2}, {3, 4}};中每行有 2 个元素,超过第二维长度 1,不合法。
因此说法正确。
第7题
题目:下面代码的时间复杂度是O ( 2 n ) O(2^n)O(2n)。
intcnt=0;for(inti=1;i<=n;i++){for(intj=1;j<=i;j++){cnt++;}}答案:×
解析:
外层循环执行n次,内层循环分别执行1, 2, ..., n次。
总执行次数为n(n + 1) / 2,时间复杂度为O ( n 2 ) O(n^2)O(n2)。
不是O ( 2 n ) O(2^n)O(2n),因此说法错误。
第8题
题目:假设文件output.txt能正常打开,下面代码通过rdbuf将cout的输出重定向到了文件中。
ofstreamfout("output.txt");streambuf*old_buf=cout.rdbuf();cout.rdbuf(fout.rdbuf());cout<<"GESP Exam";cout.rdbuf(old_buf);答案:√
解析:cout.rdbuf(fout.rdbuf())将cout的缓冲区替换为fout的缓冲区。
此后cout << "GESP Exam";会写入output.txt。
最后恢复原来的缓冲区。
因此说法正确。
第9题
题目:小杨想通过下面程序给饭卡充值,程序会输出70。
voidrecharge(intmoney){money+=20;}intmain(){intcard=50;recharge(card);cout<<card;return0;}答案:×
解析:recharge的参数是值传递,函数内修改的是形参money的副本。main中的card不会被修改,仍为50。
因此程序输出50,不是70,说法错误。
第10题
题目:下面代码可以通过编译。
inta[5];a++;答案:×
解析:
数组名a在表达式中通常表示数组首元素地址,但它不是可修改的左值。
不能对数组名执行自增操作a++。
因此代码不能通过编译,说法错误。
各种学习资料,助力大家一站式学习和提升!!!
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转
2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
https://edu.csdn.net/course/detail/41081 点击跳转
3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:
GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转
GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}