1. 现场直击:2026年3月14日GESP五级机考全记录
3月14日周六早上七点四十,我站在考点门口,手里攥着准考证和身份证,看着陆续进场的学生和家长,心里还有点没底。这不是我第一次陪学生来考GESP,但每次到现场,那种紧张感都挺真实。GESP,也就是中国计算机学会主办的编程能力等级认证,这几年在信息学赛道里的分量越来越重,尤其五级这个位置,卡住了很多人——它不像一二级那样属于入门热身,也不像六七级那样接近竞赛门槛,但五级恰恰是“分水岭”:跨过去了,后面的七级、八级才有得谈;跨不过去,很多人就卡在递归和图论这一关反复挣扎。
这次五级考试放在3月14日,刚好是周六,机考时间两个小时,题型还是老规矩:客观题(选择题+判断题)25道,每题2分,共50分;编程题2道,每题25分,共50分。满分100,60分及格。这个评分结构多年没变过,但每道编程题的分值占比很高,意味着只要代码题崩了一道,及格就比较悬。适合谁看这篇?如果你打算今年或明年考五级,或者正在带学生准备五级,又或者你刚过四级正犹豫要不要继续往上走,这篇现场记录应该能帮你少走不少弯路。
考场安排在大学机房,考生按考号隔位就坐,前后间距够大,监考老师来回走动。系统是标准的GESP在线考试环境,登录后先看考试须知,确认无误点开始才计时。有一个细节值得注意:考场电脑用的是Windows系统,编译器环境是Dev-C++ 5.11,老版本,但GESP官方一直用这个,没有C++11以上的新特性支持,所以平时练习最好就锁死在Dev-C++这个环境里,别拿VS Code或者新版编译器练手,考场上会不适应。我见过不止一个学生,平时用新版本编译器写得很顺,上了考场才发现Dev-C++连auto都不太好使,瞬间崩心态。
客观题部分整体难度比去年略有上升,但基本盘没变。考完出来我立刻问了几个交卷早的学生,普遍反映选择题里“函数调用栈”和“递归终止条件”考得挺细,判断里有两道关于“分治策略适用条件”的题目容易丢分。下午我在群里做了一次快速调研,综合十几个考生的反馈,这次五级的核心考点集中在:结构体与链表基础操作、递归函数设计与调用过程分析、分治思想的代码实现、二叉树基础遍历、图的邻接表存储与DFS/BFS框架。下面我把现场遇到的题目类型、解题思路和考后复盘逐一拆开说。
2. 五级考什么:2026年3月真题考点拆解与复习定位
GESP五级的考纲定位,一句话概括就是“从语言基础走向算法入门”。四级还停留在数组、字符串、排序这些相对机械的内容上,五级一上来就要求你具备“抽象思维”能力:数据从“存下来”变成“组织起来”,问题从“直接算”变成“分而治之”。这次3月的考题,特别明显地体现了这个转向。
2.1 客观题里藏着的能力门槛
选择题第1题就给了个下马威:给出一段递归求斐波那契的代码,标注四个调用点,问第6次递归调用发生时函数参数的值是多少。这道题考察的不是会不会写斐波那契,而是能不能在脑子里把递归调用栈一层层展开。很多学生平时写递归全靠编译器跑,从没手动跟踪过调用过程,上了考场就只能干瞪眼。我的建议是:准备五级必须练“手算递归”——拿一张纸,把每一次函数调用的参数、返回值和栈帧变化写出来,至少要练熟10道以上这类题,形成肌肉记忆。
第7题是个结构体陷阱题,定义一个struct Node { int data; Node* next; };,然后给了一段创建链表并遍历的代码,问最后输出的顺序。关键在于创建节点时用的是头插法还是尾插法,题目描述里轻描淡写一句“每次将新节点插入到链表头部”,很多考生没注意,选了正序输出,实际答案是逆序。这种题考的就是会不会读代码、能不能跟执行顺序,完全不是死记硬背能解决的。
有一道判断是关于分治策略的:“所有递归问题都可以用分治法解决,对吗?”答案是错的。分治法的核心要求是子问题相互独立且与原问题性质相同,像动态规划那种子问题重叠的场景就不适合直接套分治框架。这就是考概念辨析,光会写代码不够,得真理解算法思想。
2.2 编程题:从“写得出”到“写得对”
编程题第一道是“二叉树的中序遍历输出”,给定由结构体数组存储的二叉树节点,每个节点包含左孩子下标、右孩子下标和数据域,要求输出中序遍历序列。这道题表面很简单,就是递归遍历加输出,但陷阱在于节点的下标不是连续的,有的孩子节点下标是-1,表示空;很多学生在递归终止条件上栽了跟头,写成if (node == -1) return;忘记返回值,或者输出顺序搞反。这题25分,只要中序遍历的逻辑写对,至少拿20分,属于必得分的题。
编程题第二道是“图的深度优先搜索路径记录”,给定一个无向图的邻接表表示和起始节点编号,要求按DFS顺序输出访问节点序列。这道题比第一道难一个档次,难不在于DFS本身——递归三行就能写——而在于“邻接表”的构建。现场很多学生卡在怎么把输入的一堆边转成邻接表,数组、指针、vector三种方案在脑子里打架,时间就浪费了。更坑的是,题目要求“若当前节点有多个未访问邻居,按下标从小到大访问”,这是对DFS顺序的显式约束,不按这个顺序输出就算错。平时练习里很少有人关注DFS的访问顺序约束,这恰恰是五级考试防止“背模板”的典型手段。
从这两道编程题能看出,五级已经不再是“会写基础语法”就行的级别,而是明确要求你能独立完成“数据结构定义+算法实现+边界处理”的完整编码链。复习定位上,我强烈建议把重心放在三个方面:结构体的灵活运用、递归过程的深刻理解、二叉树与图的遍历框架。如果你觉得这些都还吃力,七级八级暂时不用想,老老实实把五级夯实了再说。
3. 从五级到七级八级:五级现场暴露出的方向信号
考完试当天下午,我在考点旁边的咖啡厅和几个信息学老师聊了聊,话题自然转到“五级之后怎么走”上。这个问题的答案,其实在这次五级考题里已经埋了伏笔。
3.1 五级和七级八级的真实差距
GESP的等级设计有一个明显的梯度特征:一级到四级解决的是“语言的熟练度”,五级到六级解决的是“基础算法的理解度”,七级到八级解决的是“复杂算法的应用与优化能力”——也就是向NOI(全国青少年信息学奥林匹克竞赛)体系靠拢。很多家长问,五级过了是不是可以直接冲八级?我的回答是:别。五级到七级之间还隔着一个六级,六级的考纲核心是动态规划基础、贪心策略和更复杂的树形结构,这些内容在五级里只是“提到”的水平,但在六级里会变成“必考且深入”的层次。七级则直接跳到最短路算法、最小生成树、数论基础,八级更是深入线段树、树状数组、状态压缩DP这些竞赛硬核内容。
这次五级现场我问了几个准备跳级报考的学生,他们普遍反映七级题目“看起来每个字都认识,但组合在一起完全不知道让干什么”。这就是等级跨度太大的典型症状。GESP允许跨级报考,但不代表你应该跳,每一级的考纲都建立在上一级的基础上,跳级省的是时间,亏的是底子。
3.2 五级之后,C++课程怎么衔接
和“GESP七级”“GESP八级”一起挂在热搜上的,还有“GESP C++课程”,这个关联很能说明问题。五级考试的内容,本质上已经把“C++语言课程”和“算法课程”之间的墙推倒了一半——结构体、指针、递归这些在纯语言课里属于中高阶内容,到了五级就成了基础工具。所以如果你五级考完觉得吃力,不要急着报“冲刺七级班”,最该做的是把C++的“底层功”补回来。
我给学生的建议是:用“三段式”衔接法。第一个月,回顾结构体、指针、链表的经典操作,不写算法题,只做“数据结构操作题”,比如“反转链表”“删除指定值节点”,目的就是把代码手感养回来;第二个月,专攻递归和分治,配合二叉树遍历、二分查找的变体题,做到“看到一个递归问题能画出递归树”;第三个月,才进入图的DFS/BFS专题,同时开始接触最短路和生成树的入门题,为六级七级铺路。这样走下来,大概需要三个月到四个月的时间,暑假集中训练的话可以缩到两个月。比起盲目刷题,这种阶梯式的课程设计反而更快见效。
4. 两道编程题完整复盘:考场解法与常见掉分点
编程题是五级的半壁江山,两题各25分,只要拿下一题,客观题再拿个三四十分,及格就有戏。但实际情况是每年都有大量考生卡在编程题上,不是不会写,而是写出来过不了样例测试。下面我把这次两道编程题的核心解法完整复盘一遍,顺便把我现场监考时观察到的高频错误点列出来。
4.1 二叉树中序遍历:20分钟拿满分的标准写法
题目描述大概是:第一行输入整数n,表示节点数,接下来n行每行输入三个值:数据域data、左孩子下标left、右孩子下标right,若某个孩子不存在则值为-1,节点编号从0到n-1。请输出以0号节点为根的中序遍历序列。
标准的递归解法:
#include <iostream> using namespace std; struct Node { char data; int left; int right; } tree[105]; void inorder(int root) { if (root == -1) return; inorder(tree[root].left); cout << tree[root].data << " "; inorder(tree[root].right); } int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> tree[i].data >> tree[i].left >> tree[i].right; } inorder(0); return 0; }这段代码能拿满分的核心在于三件事。第一,结构体数组作为二叉树的存储方式要熟练,这是五级最常考的树存储结构,叫“静态二叉链表”;第二,递归终止条件写对,root == -1时直接返回,这是所有树遍历的地基;第三,输出格式严格按题目要求,每个数据之间空格分隔,有的题目额外要求末尾不能有多余空格,那就需要加一个判断。
现场观察到的掉分点主要有三类:一类是把中序写成了先序或后序,左中右的顺序记混;一类是在递归函数里用了引用传递或者返回值,导致遍历逻辑混乱;还有一类是没看懂“节点编号不连续”这个条件,凡是输入里出现过但没被其他节点引用的编号,就是子树的根候选,但题目已经明确告诉你根是0号节点,就别自己画蛇添足去“找根”了。
4.2 图深度优先搜索:邻接表构建才是分水岭
第二道编程题要求:输入n个节点和m条无向边,节点编号0到n-1,每条边输入两个端点u和v,构建邻接表,从0号节点开始深度优先搜索,按访问顺序输出节点编号,要求“若当前节点有多个未访问邻居,按下标从小到大依次访问”。
邻接表构建方案,我推荐用vector,简洁且不容易出指针错误:
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<int> adj[105]; bool visited[105]; void dfs(int node) { visited[node] = true; cout << node << " "; for (int i = 0; i < adj[node].size(); i++) { int next = adj[node][i]; if (!visited[next]) { dfs(next); } } } int main() { int n, m; cin >> n >> m; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); // 无向图要双向建边 } // 按节点编号从小到大排序,保证DFS访问顺序 for (int i = 0; i < n; i++) { sort(adj[i].begin(), adj[i].end()); } dfs(0); return 0; }这道题最容易翻车的地方就是一个细节:无向图的双向建边。很多学生只写了adj[u].push_back(v),忘了反向还有一条边,样例输入如果恰好是链状结构可能看不出来,但换成分支结构,漏边直接导致输出缺失。第二个掉分点是排序,题目明确要求邻居按下标从小到大访问,加了sort才是满分,不加的话输出顺序一旦不对就是0分。第三个掉分点是visited数组,这个倒是大部分学生都记得开,但有个别学生在全局和局部之间混淆,导致同一个DFS调用里访问状态互相干扰。
说实话,这道题25分拿到手,最关键的不是DFS本身,而是邻接表这个数据结构用得顺不顺手。五级考试里考图的构建而不是光考遍历,就是要逼你真正理解“图是怎么存进计算机里的”。
5. 三个月的五级备考时间表与复习资源搭配
前面把考点、真题、代码都盘了一遍,最后说说备考节奏。我的经验是,五级备考最怕的不是内容难,而是“不知道考什么”和“复习战线拉太长”。合理规划三个月,每周推进一个模块,完全够用。
5.1 每四周一个阶段,逐层递进
第一个月打基础,目标是“快速准确写出结构体+链表+递归的代码”。具体任务:每天一道链表操作题(增删改查、反转、合并)、三道递归练习题(阶乘、斐波那契、汉诺塔变体),周末做一次客观题模拟卷。这个阶段不要碰图和二叉树,先把地基打牢。
第二个月上结构,目标是“二叉树和图的遍历滚瓜烂熟”。具体任务:二叉树的前序中序后序层序遍历每天各写一遍,然后练习各类变体(求深度、求叶子数、镜像翻转);图的部分从邻接矩阵开始,再过渡到邻接表存储,DFS/BFS各刷10道题,关键是要把“访问顺序”和“visited标记”牢牢刻在脑子里。这个阶段是五级的分水岭,每天至少保证一个半小时的有效编码时间。
第三个月冲刺模拟,目标是“限时训练+查漏补缺”。每周至少做两套完整的五级模拟题,严格按照考试时间(2小时)来卡,做完立刻对答案,分析错因。重点训练客观题的做题速度——25道题最好控制在40分钟内完成,留足80分钟给两道编程题。编程题的训练标准是:不看任何资料,从读题到写码到测试全流程独立完成,一道题不超过30分钟。
5.2 资源搭配,不迷信单一题源
GESP官方没有公开的历年真题库,这是个挺遗憾的事,但也不是完全没有办法。我的做法是让学生混搭三类资源:第一类是官方样题和教材配套练习,这部分内容最贴近真实风格,一定要吃透;第二类是信息学奥赛入门题目,比如洛谷上的“普及组”难度题库,很多题目的思维方式和GESP五级编程题高度重合;第三类是经典竞赛教材,比如《信息学奥赛一本通》,虽然难度略高,但用来提升代码能力和思维深度非常有效。
有一点需要特别提醒:不要只刷选择题和判断题。我见过不少学生,客观题刷得很溜,一上编程题就卡壳,原因就是“看答案觉得自己会,关掉答案写不出来”。编程能力只能靠亲手写代码来积累,没有任何捷径。每天至少保证手写5到10行核心代码,一个月下来手感完全不同。
6. 考试当天的时间分配与心态调整技巧
最后聊点实操层面的细节,这些往往是考场上的“隐形分”。五级考试总共120分钟,我建议的时间分配是:前30分钟做完全部客观题,中间60分钟做第一道编程题(争取拿满分),最后30分钟做第二道编程题(拿住基本分),留5分钟检查提交情况。这个节奏可能和很多人的习惯不一样,但我试验过很多学生,客观题先做的好处是能快速进入状态,而且客观题里的很多概念性内容会顺带帮你激活算法记忆,再做编程题时脑子更清醒。
有同学喜欢先做编程题再做客观题,理由是怕编程题时间不够。这个策略我不推荐,原因有两个:一是编程题容易写上头,一写就是四十分钟起步,客观题被压缩后容易仓促出错;二是客观题2分一道性价比很高,编程题万一卡住连25分都拿不到,至少先把能稳拿的50分装进口袋再说。
考场上最容易出问题的不是不会写,而是环境不熟。Dev-C++的编译报错信息比较简陋,经常是一长串英文加行号,不少学生看到报错就慌了。我的训练方法是,平时练习就强制用Dev-C++,而且故意写错代码去观察报错信息,把常见的编译错误类型整理成自己的“错题词典”——比如“expected ‘;’ before ‘}’ token”多半是少分号,“undefined reference to ... ”多半是函数名拼错。这样上了考场,看到报错就能快速定位,而不是在报错信息里大海捞针。
提交环节也有讲究。GESP考试系统支持多次提交,以最后一次为准,所以如果编程题没完全通过样例测试,不要拖到最后才提交,先交一版能编译通过的代码上去保底,再继续调试。很多学生纠结“代码不够完美不敢交”,结果时间到了系统自动提交了一个编译失败的版本,白白丢分。记住一个原则:能跑通就是胜利,优化是之后的事。
7. 写在最后:考完五级,真正的起点在这里
从我这些年的陪考经验看,GESP五级是一个很有意思的“岔路口”。考过了,意味着你已经具备了用计算机解决基础算法问题的能力,后面不管是继续冲六级、七级、八级,还是转向参加更高级别的信息学竞赛,都有了一个扎实的落脚点。没考过,也不代表你不行,只能在复习方法上找原因——大部分卡在五级的人,问题都不是“不够聪明”,而是“练得不够手熟”。
这次的3月14日现场,我看到一个六年级的孩子,在考后跟家长说:“原来递归也没有那么难。”他考前一度想放弃,最后一个月把二叉树的三种遍历手动模拟了不下二十遍,这次编程题第一道他写得飞快,提前交了卷。这就是五级真正的难点——它考验的不是智商,而是你愿不愿意在一个看似枯燥的概念上反复打磨。编程这条路没有捷径,但每一道写过的题,每一次手动模拟的递归过程,都会在你的代码里留下痕迹。下一场考试,无论你报的是六级还是七级,记住今天的这份手感,继续往前走就是了。