在CCF主办的GESP(编程能力等级认证)体系中,前三级主要考察顺序结构、分支循环以及数组和字符串的基础语法。然而,当学生迈入GESP四级的考场时,他们面临的将是一个全新的挑战:从“流水账式”的写代码,跨越到具备初步“模块化”与“算法抽象”思维的编程新阶段。
根据GESP官方大纲,四级的核心考点包括:函数与递归、参数传递(值传递与引用传递)、结构体、栈和队列的概念,以及进制转换。通过四级,意味着学生的水平已经达到了“CSP-J 基础”阶段,具备了向更高阶信奥竞赛冲击的底子。
今天,我们将从历年GESP四级考试的知识点库中,精选提炼出最具代表性的典型真题,重点对函数参数传递(引用与指针的概念延伸)、结构体应用以及递归算法进行深度精讲。
一、 参数传递:值传递 vs 引用传递
在四级考试中,函数参数是如何在内存中传递的,是必考的选择题和程序阅读题考点。许多初学者在这里会产生困惑:为什么我在函数里修改了变量,主函数里的变量却没有变?
这里实际上涉及到了内存地址的概念。在C++中,参数传递主要分为“值传递”和“引用传递”(引用的底层逻辑与指针密切相关)。

典型考题一:变量交换的陷阱
题目描述(程序阅读):
请问以下程序的输出结果是什么?
#include <iostream>using namespace std;void swap_value(int a, int b) { int temp = a; a = b; b = temp;}void swap_reference(int &a, int &b) { int temp = a; a = b; b = temp;}int main() { int x = 10, y = 20; swap_value(x, y); cout << x << " " << y << endl; swap_reference(x, y); cout << x << " " << y << endl; return 0;}真题精讲:
这道题考察的是作用域与参数传递方式。
1.swap_value(x, y) 使用的是值传递。当调用函数时,系统在内存中开辟了新的空间给局部变量 a 和 b,并把 x 和 y 的数值(10和20)复印了一份放进去。函数内部交换的是复印件,主函数中的原件 x 和 y 毫无影响。因此第一行输出依然是 10 20。
2.swap_reference(int &a, int &b) 使用的是引用传递。符号 & 在这里表示引用,它相当于给主函数里的 x 和 y 起了个别名。在底层,这其实是通过传递内存地址(类似指针的操作)来实现的。此时函数内部的交换,直接作用于原件所在的内存空间。因此第二行输出成功交换的结果:20 10。
备考建议:
理解内存空间的变化是关键。可以将值传递想象成“传真文件”,修改传真件不影响原件;将引用传递(或使用指针)想象成“给同一把锁配了两把钥匙”,任何一把钥匙打开门拿走东西,房间里的东西就真的少了。
二、 结构体(Struct):复杂数据的打包艺术
在现实世界中,数据往往是多维度的。比如一个学生不仅有姓名(字符串),还有年龄(整数)和成绩(浮点数)。GESP四级引入了结构体(struct),要求考生掌握如何自定义数据类型。
典型考题二:结构体数组的访问
题目描述(单选题):
定义如下结构体和数组,若要将 students 数组中第二个学生的成绩赋值为 95.5,正确的代码是?
struct Student { int id; double score;};Student students[5];A. students[2].score = 95.5;
B. students[1].score = 95.5;
C. Student[1].score = 95.5;
D. students.score[1] = 95.5;
真题精讲:
正确答案是 B。
首先,在C++中,数组的索引是从 0 开始的。因此“第二个学生”对应的数组下标是 1,即 students[1]。
其次,访问结构体内部的成员变量,需要使用点运算符 .。所以完整的访问路径是“数组名[下标].成员名”,即 students[1].score。
A选项修改的是第三个学生;C选项错误地使用了类型名而不是变量名;D选项语法完全错误。
典型考题三:结构体与排序结合
在四级编程大题中,经常会出现“给出N个学生的信息,按照成绩从高到低排序,成绩相同则按学号从小到大排序”的题目。这就需要考生不仅掌握结构体,还要能手写排序算法(如冒泡排序或选择排序),并在比较时加入多重条件判断。这考验的是代码的综合组织能力。
三、 递归算法:自己调用自己的魔法
递归是GESP四级最难的考点,也是向CSP-J进阶的必经之路。递归的核心在于两点:边界条件(递归出口) 和 递归关系式(递推公式)。
典型考题四:递归求解阶乘
题目描述(程序填空):
以下是一个计算正整数 n 阶乘(n!)的递归函数,请补全缺失的代码。
int factorial(int n) { if (______) { // 填空处 return 1; } return n * factorial(n - 1);}真题精讲:
填空处应为 n == 1 或 n == 0(根据具体题意,0的阶乘也是1)。
如果没有这行判断,函数就会陷入无限循环的“死胡同”,最终导致栈溢出(Stack Overflow)。这就是递归中最重要的“边界条件”。
当输入 n=3 时,内存中的调用栈变化如下:
1.factorial(3) 暂停,等待 factorial(2) 的结果;
2.factorial(2) 暂停,等待 factorial(1) 的结果;
3.factorial(1) 触碰边界条件,返回 1;
4.factorial(2) 拿到结果 1,计算 2 * 1 = 2,返回 2;
5.factorial(3) 拿到结果 2,计算 3 * 2 = 6,返回 6。

四、 栈、队列与进制转换
除了上述核心代码题,四级的选择题还会考察基础数据结构的概念和数学计算。
典型考题五:栈的特性
概念解析:
栈(Stack)的特点是“后进先出”(LIFO)。就像我们在桌面上叠盘子,最后放上去的盘子,必须最先拿下来。四级大纲虽然不要求手写复杂的栈结构,但必须理解其概念,这与前面讲到的“递归调用栈”在底层逻辑上是一致的。
典型考题六:进制转换
概念解析:
四级要求掌握二、八、十、十六进制之间的相互转换。例如将二进制 1011 转换为十进制:
1(2^3) + 0(2^2) + 1(2^1) + 1(2^0) = 8 + 0 + 2 + 1 = 11。
这类题目只要掌握了按权展开求和的方法,就是考场上的送分题。
备考工具推荐:如何高效攻克GESP四级?
看懂了上面的真题解析,离真正在考场上拿高分还有一段距离。编程是一门实践性极强的学科,尤其是到了四级,递归逻辑和指针/引用的内存报错,往往让自学者抓狂。配置本地环境(如Dev-C++)也常常因为编译器版本问题耗费大量时间。
为了让备考过程更顺畅,推荐大家使用 AdaCpp(AI驱动的C++在线学习平台)。作为专为信奥竞赛和GESP考级打造的工具,它能完美解决四级备考中的痛点:
1. 零配置,随时随地刷真题
打开浏览器就能直接写C++代码,无需任何安装配置。更重要的是,AdaCpp内置了自动爬取并结构化处理的 78套GESP历年真题(覆盖2023年9月至最新考试),1-8级全覆盖。你可以直接在平台上进行在线评测(OJ系统),写完代码一键运行,系统自动判对错。
2. AI 智能辅导:看不懂递归?让 AI 逐行讲给你听
四级的递归和结构体非常抽象。在 AdaCpp 中,如果你对某段代码(比如上面的 factorial 函数)感到困惑,只需选中代码,平台内置的顶级 AI 模型(如 Claude 3.5 Sonnet 或 GPT-4o)就会为你逐行讲解代码逻辑。
如果代码编译报错,AI 会将晦涩的 GCC 英文报错直接翻译成中文,并告诉你具体哪一行写错了、应该怎么改。这种即时反馈,相当于请了一位24小时在线的专业教练。

3. 对标官方大纲的系统课程
如果你觉得自学四级知识点有些吃力,可以直接学习 AdaCpp 的 L2 C++进阶提高课程。
该课程严格对标 GESP 3-4级大纲(即 CSP-J 基础水平)。相比于线下机构动辄上万元的年费,AdaCpp 的 L2 课程仅需 ¥249,一次购买终身访问,包含了详尽的知识点拆解和配套练习。
结语
GESP四级是青少年编程学习道路上的一个重要里程碑。掌握了结构体、参数传递和递归,不仅意味着你能顺利通过四级认证,更代表你已经推开了信息学奥赛(CSP-J/S)的大门。
编程能力的提升没有捷径,唯有在正确的方向上不断练习。理清每一个变量的作用域,画出每一次递归的调用栈,写下每一行经过思考的代码。现在就打开浏览器,开启你的进阶之旅吧!
关于我们
AdaCpp 是专为 K-12 学生打造的 AI 驱动 C++ 在线学习平台。打开浏览器即可写代码、刷真题、享 AI 辅导,随时随地备战 GESP 与 CSP-J/S 竞赛。
👇 点击下方卡片关注我们 👇

回复【真题】,获取最新 GESP 备考资料与学习指南!
长按识别二维码,立刻体验零门槛的信奥学习环境~