
简介面向 CCF 编程能力等级认证GESP考生与指导教师的备考合集覆盖考级 1 至 8 级内容由真题、答案解析、考点知识点总结、各等级认证提纲与客观题知识点组成可系统解决备考资料分散、知识点梳理耗时的问题。Scratch 图形化编程、Python 编程、C 编程三类语言路径全部包含Scratch 覆盖一级到四级Python 与 C 覆盖一级到八级能够兼顾零基础图形化入门和信息学竞赛方向的算法进阶真题与答案相互对照也有助于理解命题思路各等级提纲与知识点按层级拆解便于在学完新单元后自测并在考前快速查漏补缺。整套资料以 ZIP 压缩包形式打包整体约 339MB已更新至 2024 年 9 月后续版本仍会持续补充包内另附 Python 爬虫配套教程可作为备考之余的实战延伸。目前已有 866 人浏览学习适合需要系统备考 GESP 各级别、逐步提升编程能力与应试水平的考生及指导教师参考使用。1. GESP备考先看这张地图级别、语言与真题的复习主线GESP全称CCF编程能力等级认证是目前很多信息学奥赛选手起步时都会碰到的等级考试。我最开始备考时也以为它只是简单考语法直到我把GESP真题与答案按考点知识点总结逐套过完才发现它从1级到8级的进阶设计本身就是一张完整的编程学习地图。图形化编程、Python、C三条线共用同一套等级体系越到后面越靠近竞赛思维。这张地图对两类人最有用。第一类是正在系统学编程的人跟着等级把知识点一个个点亮每一级都有明确的“会与不会”的分界线。第二类是准备冲刺高等级的人通过真题反推考点用错题反查遗漏。我见过太多人卡在5级升6级不是因为题目难而是因为低级别时该记牢的边界条件、数据范围、函数递归细节早就丢了。这篇笔记就把GESP考级真题的题型、考点、易错点全部摊开按模块梳理成一张能直接复习的清单。2. 考纲拆解1到8级在考什么语言怎么选2.1 级别边界从图形化到C的晋级路线GESP分了8个等级但并不是说必须考完1级才能考2级。它的晋级逻辑更像能力标尺你可以在某一级直接报名只要你能过就说明你达到了对应的水平。梳理下来会发现1到4级偏向“写得出”5到8级偏向“写得对、写得优”。1级是最基础的变量、输入输出、顺序结构。2级开始讲分支和循环3级把数组、字符串引入4级正式讲函数和递归。5级进入算法门槛常见排序和枚举6级出现贪心和二分7级上升到数据结构8级则是综合性竞赛思维题。对应信息学奥赛的备赛路线一般学到4级就可以开始刷入门组的模拟题学到6级可以挑战提高组的部分题型。语言选择上图形化、Python、C三条线各有侧重。图形化偏小年龄段考试里拿高分相对容易但不建议长期停留在图形化越早切换到文本语言越好。Python适合想快速验证算法思路的人写起来快但在GESP的后期等级里Python在某些运行效率要求高的题目上会比较吃力。C是信息学奥赛的官方语言GESP的高等级考点也大量围绕C的语法细节展开所以如果你的目标是信息学竞赛直接从C起步是最稳妥的。2.2 核心考点等级表下面这张表是我把GESP真题和考纲反复比对后整理出来的按“等级 → 核心语法 → 算法初现 → 典型题判断标准”四个维度列适合用来对照自己当前的位置。等级核心语法范围算法与思维要求判断自己是否掌握的标准1级变量、常量、输入输出、算术运算顺序执行能独立完成“输入两个数求和的程序”2级关系运算、if/else、while、for分支判断、简单枚举能写出判断闰年并输出天数的代码3级数组、一维字符串、多重循环遍历、计数、最大最小值能处理“统计一组数据中的均值”4级函数、参数传递、递归入门递归思想、模拟能写递归求阶乘或斐波那契数列5级结构体、排序函数、文件读写冒泡/选择排序、查找能按指定字段对学生信息排序6级二分答案、贪心策略二分查找、区间覆盖能判断一道题能不能用贪心解7级栈、队列、链表、树的基础数据结构应用能用队列实现广度优先搜索8级动态规划、图论入门状态转移、最短路能独立写出背包问题的完整解法这张表最大的用途不是背而是对着它做“能力自评”。如果你5级题库刷得动但看到6级的贪心题毫无思路那说明你缺的不是刷题量而是“把问题转化为算法模型”这一步。很多复习资料把考点平铺开反而让人看不出每级之间的阶梯关系这张表就能补上这个盲点。2.3 真题题型与分值选择、判断、编程题的分工GESP真题卷面结构很稳定第一部分是选择题第二部分是判断题第三部分是编程题。选择和判断混合覆盖语法细节、程序阅读和简单推理编程题则是真正拉分的地方解题思路、编码速度、边界处理能力都在这部分被检验。选择题和判断题的特点是“看似简单处处是坑”。比如数组下标从0开始还是从1开始、整数除法会不会自动取整、循环条件边界是否多一次少一次这些点在写代码时编译器会提醒但纸面题目只能靠脑筋。复习时不能只求“答对”要把每个选项背后的规则想清楚。编程题通常给出一个问题描述、输入格式、输出格式和样例。它考察的不是背代码而是把自然语言翻译成代码的能力。比较典型的考查方式是“模拟题经典算法题”的组合一道是直接按规则模拟另一道需要识别出考点并选择合适的算法。平时做真题时我建议先独立写一遍再对照答案重点看答案对边界条件的处理方式这比多看十道题有用。3. 编程题实战从真题到答案的完整拆解3.1 一道真题的读题与拆题编程题最容易翻车的点不是算法不会而是题目没读透。我拿一个很典型的GESP模拟题来说明题目给定n个整数请统计其中能被2整除且能被3整除的数有多少个。输入第一行是n1≤n≤1000第二行是n个整数输出一个整数表示满足条件的数的个数。这道题不算难但答案里至少藏着三个考点输入循环、条件判断、计数累加。很多同学第一眼就会写“能被6整除”这没错但更容易忽略的是n的范围——如果n最大是1000用int完全够如果题目把n改成10^9就可能需要long long。做题第一步一定是把题目里的“数据范围”圈出来它决定了变量类型和算法选择。拆解时我习惯把一道编程题分成三块输入模型、处理逻辑、输出格式。输入模型是“读什么、怎么读”处理逻辑是“中间怎么算”输出格式是“打印什么、要不要换行”。这道题的输入模型是“先读n再读n个数”处理逻辑是“判断每个数是否满足条件满足则计数加一”输出格式是“打印计数结果结尾换行”。按照这个结构写代码就不容易漏输入或漏输出。很多考生丢分不是主逻辑错而是输出格式差了空格或者忘了换行这种丢分特别不值。3.2 高频算法模板枚举、排序、递归、贪心GESP编程题里算法考的其实很集中翻来覆去就是几个模板枚举、排序、递归、贪心再往上才是二分和动态规划。把它们吃透就能覆盖大多数真题。枚举是最基础的几乎每套题都有。比如“求100以内所有能被3整除的数的和”直接循环判断即可。这里要注意枚举的范围和步长有些题目可以优化比如判断素数只需要枚举到sqrt(n)但基础版循环也别写错。排序是5级以后的高频考点。C里直接调用algorithm头文件里的sort但考试有时会要求手写排序算法理解冒泡、选择、插入排序的区别更重要。以下是一个排序模板注意参数和边界#include iostream #include algorithm using namespace std; int main() { int n; cin n; int a[105]; for (int i 0; i n; i) cin a[i]; // 输入n个数到数组a sort(a, a n); // 对数组区间[a, an)升序排序 for (int i 0; i n; i) { cout a[i] (i n - 1 ? \n : ); // 输出除最后一个外以空格分隔 } return 0; }这段代码的要点sort传入的是起始地址和结束地址写成a n表示包含前n个元素输出时用了一个三目运算符避免末尾多打空格。如果题目要求从大到小需要传入自定义比较函数sort(a, an, greaterint())。递归在4级开始出现。递归模板要抓住两个要素终止条件和递归式。比如斐波那契数列long long fib(int n) { if (n 2) return 1; // 终止条件前两项为1 return fib(n - 1) fib(n - 2); // 递归式第n项等于前两项之和 }这里的坑是long long。n一旦到50fib(50)就已经超过int范围了所以递归函数返回值必须考虑数据范围。另外纯递归计算n50会非常慢因为大量重复计算这时可以改成记忆化递归或递推数组。贪心则是6级常客。它的核心是“局部最优能推出全局最优”。比如“用最少张数的钞票凑出指定金额”就是典型贪心优先用大面额。但贪心不是所有题都能用真题里喜欢放一道“看似贪心实际需要动态规划”的题来区分水平。判断标准很简单如果能证明每一步选最优都不会影响后续步骤才适合贪心否则就要考虑动态规划。3.3 提交前必查的5个边界点编程题写完不等于全对我每次提交前都会强制检查五个点这是血泪经验换来的。第一数据范围。看题目给的最大值估算最终结果会不会爆int。比如两个10^9的整数相乘结果是10^18明显要用long long。第二数组大小。题目说n最大是1000数组至少要开1005多留几个位置防止越界。有些题暗含n1这种偏移数组开小了直接越界程序可能依然“碰巧”输出正确但换一个测试数据就崩。第三循环边界。for (i 1; i n; i)和for (i 0; i n; i)差别很大尤其涉及数组下标时。多看几遍循环的起止条件确认没有差一错误。第四输出格式。有没有多余空格最后有没有换行题目要求“每个数之间一个空格”如果你一行输出没有空格直接判错。用上面示例中的三目运算符写法可以避免末尾空格问题。第五特判。输入只有1个数、没有满足条件的数、n等于0如果允许……这些边缘样例必须自己先跑一遍。很多考生在测试用例全部通过后被扣分就是因为忽略了特判。这五个点检查一遍其实很快但能救回不少分数。把它们变成肌肉记忆比临时检查更可靠。4. 考点知识点总结四张表覆盖全部记忆点4.1 数据类型、运算符与表达式要点GESP考试无论考C还是Python都绕不开数据类型的边界问题。这张表整理了我认为最常被考也最常被坑的几组。项目类型/情形关键要点整数范围int约-2.1×10^9到2.1×10^9超过则用long long整数范围long long约-9.2×10^18到9.2×10^18GESP后期题必用浮点精度double比float精度高涉及除法时要声明浮点变量整除int / int结果自动取整如7/23需要3.5则写成7.0/2取模%运算结果符号与被除数一致负数取模易错优先级算术关系逻辑写复杂条件时加括号可读性优先类型转换隐式/显式高精度向低精度转换会丢失数据谨慎使用最容易忽略的是“负数取模”。C里-7 % 3的结果是-1而不是2。很多同学在准备GESP选择题时第一次做这类题都会错因为直觉上以为和数学取余一样。复习时拿几个负数例子手算一遍记住C的取模规则之后遇到就不慌。表达式方面真题喜欢考“短路求值”。if (a 0 b / a 2)当a等于0时b / a根本不会执行因为左边为false就已经确定整个表达式为false了。这种考点纯靠背诵容易漏多拿代码实际跑一遍就记住了。4.2 控制结构、函数与递归重点控制结构里switch、while、for这三者各有适合场景。for循环适合已知次数while适合条件驱动。真题常考的是循环嵌套的执行次数比如双重循环输出星号图形这时候不要死记而是写出内外层各自的范围再推导总次数。函数的重点在参数传递方式。C里传值、传引用加和传数组退化为指针这三者的区别是GESP 4级之后的常客。传值不会改变原变量传引用会。数组传参时函数内部修改会影响原数组这也是很多考生不理解的地方。递归是4级的分水岭。我见过太多人在递归里迷路原因只有一个没有画出“递归调用树”。例如fib(5)会调用fib(4)和fib(3)fib(4)又会调用fib(3)和fib(2)画出来才能看清为什么重复计算严重。复习递归时不要只背代码要能手动推演小规模参数的变化过程这一步是查漏补缺的关键。4.3 数组、字符串、结构体与常用库数组是GESP的核心地带。一维数组、二维数组、字符数组都是必考。二维数组的行列坐标容易混淆尤其是从0开始计数的题目。记忆技巧写代码时把二维数组看作“行优先”外层循环代表行内层代表列和数学坐标系是反着的不要硬套。字符串在C里可以用string也可以用字符数组char[]。string有丰富的函数如length()、substr()、find()但GESP考试对字符串处理的要求并不高反而会考“字符转数字”和“数字转字符”这类基础操作。例如判断一个字符是否是数字c 0 c 9而不是用isdigit却忘了包含头文件。结构体是5级必考。结构体本身不复杂但结合排序就麻烦。常见题目是按成绩、姓名、学号依次排序需要自定义比较函数。这里最容易写错的是比较函数的返回规则升序时返回a.score b.score降序时返回a.score b.score。很多人一紧张就写反导致整个排序结果颠倒。常用的STL容器也要熟悉vector、map、set、stack、queue。GESP 7级前后的真题里栈和队列常用于模拟计算器或广度优先搜索。queue没有迭代器stack只能访问栈顶这些使用限制是需要提前踩过坑才能记住的。4.4 算法基础排序、二分、动态规划取舍排序算法里冒泡和选择是基本功复杂度O(n²)快速排序和归并排序是进阶复杂度O(n log n)。GESP真题一般不会要求手写快排但理解分治思想对后续递归有帮助。二分查找属于“看似简单实则细节多”的算法。区间是[l, r]还是[l, r)判断条件是mid target还是mid target都会影响结果。复习时不需要背所有模板只需要固定使用一种写法反复练熟即可。我自己的写法是int l 0, r n - 1; // 闭区间写法 while (l r) { // 当区间还有元素时继续 int mid (l r) / 2; if (a[mid] target) return mid; else if (a[mid] target) l mid 1; else r mid - 1; } // 退出循环说明未找到这个模板的核心l r更新时l mid 1、r mid - 1保证区间严格缩小不会死循环。注意mid (l r) / 2在数据量大时可能溢出但这道题范围小所以没问题。如果在更大的范围应写为l (r - l) / 2。动态规划是8级的重头戏。初学者容易把动态规划和贪心搞混。贪心是每步选当前最优动态规划是保留所有可能状态用状态转移方程求全局最优。最经典的入门题是0-1背包给定容量和若干物品的重量价值求最多能装多少价值。它的递推式dp[j] max(dp[j], dp[j - weight] value)不仅是一个公式更需要理解“倒序枚举容量”的原因——防止同一个物品被重复放入。如果备考时间有限先把背包、最长上升子序列这两个模板吃透GESP 8级的大部分动态规划题都能往这两个模型上靠。5. GESP复习最容易漏的5个易错点5.1 易漏点一只记语法不记数据边界很多人在刷GESP真题时把注意力放在“代码能不能跑通”忽略“数据最坏会多大”。我在做一道统计题时输入n是10^5每个数最大10^9直接用了int结果一提交答案错了一半。因为题目要求输出总和10^5个数相加轻松超过int上限。为什么漏因为样例数据通常很小用int能过就不会再想极端情况。怎么补每次读题后先在草稿纸上算一下最大值乘以个数判断是否超出int范围超出就换成long long。这道题让我养成了习惯看到“整数”先看范围再看类型。5.2 易漏点二循环边界差一错误循环多循环一次或少循环一次是最隐蔽的错。常见场景是“判断1到n之间的所有数”写成i 1; i n; i这样n本身就被漏掉了。为什么漏因为人脑在抽象思考时常常把“”和“”混淆尤其是从0开始的C系语言里。怎么补每次写完循环把第一个值和最后一个值代进去手动跑一遍。如果循环内用到数组下标特别注意下标从0开始还是从1开始。我每次写完代码都会问自己一句当i等于n的时候这个循环还会执行吗5.3 易漏点三数组越界与初始化数组开小了、没有初始化这两个问题会直接导致“本地对提交错”。比如声明了int a[100]实际却有1000个输入程序会直接访问非法内存有时候不报错而是输出一个巨大的随机数。为什么漏因为C的数组不会自动检查越界程序表现像是“偶尔出错”。怎么补数组大小作为常量定义时多留10个元素的空间。另外计数类的数组一定要初始化int cnt[100] {0};否则局部数组里的值不确定累加时起点就是错的。我从那次倒霉经历后每次写数组都强制初始化宁可多写也不赌编译器心情。5.4 易漏点四递归忘记终止条件或写错终止条件递归终止条件错了要么无限递归栈溢出要么提前返回错误结果。以斐波那契为例有的人写if (n 2) return 1;有的人写if (n 1 || n 2) return 1;看起来差不多但n0时会出问题。为什么漏因为递归终止条件通常对应“最小子问题”而人很难从大的调用想明白。怎么补把递归函数想象成“分治”问自己“这个函数处理的最简单输入是什么”。如果参数是n那么最小输入可能是0或1把所有边界都写进终止条件。复习时多画几棵递归调用树比反复改代码更有效。5.5 易漏点五贪心与动态规划用错GESP 6级以后经常出现“贪心貌似可行实际要动规”的题目。典型就是背包问题每次都装价值密度最大的物品得到的结果可能不是全局最优因为剩余空间可能装不下任何一个剩下的合适组合。为什么漏因为贪心写起来简单而且样例测试通常能过误以为自己已经掌握。怎么补遇到“最大、最小、最优”题时先问自己一个关键问题局部最优能否证明全局最优如果无法证明立刻考虑动态规划。平时刷题时把每个题号旁边标注它属于贪心、二分、动态规划还是纯模拟考前就能有一张题型分布图哪种方法最常考一目了然。6. 复习清单与查漏补缺GESP冲刺的收尾方案进入考前最后一个月我不再盲目刷新题而是用一套固定的“查漏清单”做收尾。这份清单按三个维度展开知识点清单、错题清单、真题清单。阶段时间具体任务第一周7天对照第2章的等级考点表逐项自评把“半懂不懂”的标记为待补第二周7天针对待补点每两天练一个方向配合章节后练习题第三周7天每天做一套真题限时90分钟模拟真实考试节奏第四周前3天只复盘错题不看新题把错因分类抄一遍第四周最后1天只做一道经典模拟题保持手感之后全部休息错题本不要只抄题目和答案。我自己的习惯是三栏第一栏写错误答案第二栏写正确答案第三栏写“我当时为什么会那么写”。第三栏才是最有价值的因为错误答案往往是某个错误思维链的产物比如“下意识觉得数组从1开始”或“忘了除0”。写到后面会发现大部分错误集中在数据范围和边界判断两类这时再回头看第4章的表格记忆会特别牢。最后一天我会做一道简单的输入输出题不会做难题因为考试前一天猛地解难题只会打击信心。这个策略帮我避免了很多次考前失眠。从那以后我每次准备GESP都强制走一遍这个流程先看考点地图再按等级查漏然后限时做真题最后只复盘错题。希望这份梳理也能帮到你稳住节奏把能拿的分都拿到。本文还有配套的精品资源点击获取