GESP C++一级真题拆解:高频易错点与复习重点 简介面向准备GESP C一级认证的青少年考生、信奥赛入门学习者及编程教师提供2023年9月认证真题用于熟悉题型、考前自测与考点查漏补缺。压缩包内共1个docx文件约147KB内容为试卷文本包含单选题、判断题和编程题并附题目选项、编程题描述与样例说明便于直接打印或改编练习。已有903人学习适合作为一级考试的基础训练材料。试卷覆盖变量命名、逻辑与算术运算符、循环与数组处理、字符运算、类型转换等知识点两道编程题“买文具”“小明的幸运数”可训练输入输出、条件判断、枚举与求和思路帮助读者建立C一级知识框架并提升答题熟练度。1. 一张地图看清 GESP C 一级从真题倒推复习重点GESP C 一级这份 2023 年 9 月真题题型结构本身就能说明考察重点单选 15 题共 30 分、判断 10 题共 20 分、编程 2 题共 50 分满分 100 分。前两类合计 50 分全部落在“概念加语法细节”上后 50 分则要求把变量、输入输出、循环、条件判断串成能跑通的完整程序。也就是说一级考查的项目并不在于算法有多难关键看基本功是否扎实能不能认出存储设备、能不能判断一个变量名合法、能不能算清和%的优先级、能不能写对for循环的边界。适合谁看刚接触 C 不久、准备第一次参加等级认证的人学过一阵子但总在“看起来会、一做就错”的细节上丢分的人以及带初学者、需要一份错题地图的人。这道题的风格很统一几乎每个选项都在等你踩一个经典坑比如字符相加、逗号表达式、cout到底算不算关键字。把这张地图记住复习就不会东一榔头西一棒子。2. 计算机常识与变量基础送分题里的隐藏门槛2.1 内存、存储设备与早期计算机常识真题第一题问“我们通常说的内存属于计算机中的什么”答案是存储设备。这题很多人靠直觉选但复习时最好把设备分类一次性理清因为判断题第一题又绕回来了早期计算机内存不够大会把字库固化在包含只读存储器的扩展卡里插到主板上帮助处理汉字这句话是正确的。设备类别典型例子一级要记的点输入设备键盘、鼠标、扫描仪数据进入计算机输出设备显示器、打印机结果离开计算机存储设备内存、硬盘、U 盘、ROM 扩展卡内存属于这一类不要选成输入输出梳理下来会发现这类题真正考的是“分类归属”而不是让你解释内存的工作原理。内存是存储设备不是“计算机的大脑”CPU 才承担运算和控制。判断题里出现“只读存储器”时要知道 ROM 属于存储器扩展卡插在主板上是为了补足内存容量不足时存放字库的需求方向判断为正确即可不必深挖硬件细节。另一道常识判断涉及超级计算机题干描述一款国产超级计算机曾多次在全球榜单中名列前茅这类表述按常理判断为正确。复习时不必背具体名称和排名重点在于分清“常识判断”与“语法判断”——前者靠基本认知后者靠规则记忆两类别混。2.2 变量命名规则与关键字辨析变量命名是一级最稳定的考点。真题里redStar、RedStar、red_star、red star四个选项中不合法的是red star原因只有一个中间有空格。命名规则可以压缩成几条只能由字母、数字、下划线组成不能有空格、、-、%这类符号不能以数字开头2num不合法num2合法区分大小写redStar和RedStar是两个不同的名字不能使用关键字int、for、while、return这类保留字不能当名字。判断题里有一题说“不可以将变量命名为cout因为cout是 C 的关键字”这句话是错的。cout是标准库里的对象名不是关键字语法上你确实可以定义一个叫cout的变量只是会和标准输出打架属于“能编译但极易翻车”的写法。这道题的价值在于逼你区分“关键字”和“标准库标识符”这也是很多人第一次意识到的事编译器不拦你不代表你可以这么干。提示复习关键字时按功能分组记类型类int、char、double、bool、控制类if、else、for、while、do、switch、break、continue、return、其他const、void、true、false比死背一张长表更牢。2.3 数据类型与取整、类型转换判断题第三题int(3.14)的值为 3正确。浮点数转整数是截断小数部分不是四舍五入int(3.99)同样是 3。这一点在编程题里会以更隐蔽的方式出现比如算钱时用整数除法导致少算。一级涉及的类型不多但每种都要知道“能装什么”类型存什么一级易错点int整数除法/两边都是整数时结果取整7 / 2得 3double小数不能对浮点数用%c % 2.5直接语法错误char单个字符1是字符参与运算时用编码值bool真/假输出时默认是 1 和 0不是 true/falseb c % 2.5;这道单选题考的就是取模运算只接受整数操作数浮点数参与%不符合语法。很多人平时写代码没试过考场上靠“好像可以”猜就会错。复习方式很土但有效把每个运算符允许的操作数类型写一遍%只认整数/看两边类型决定是整除还是小数除法。3. 运算符与表达式优先级、短路与逗号的连环坑3.1 算术、关系、逻辑的优先级顺序真题第 3 题表达式2 - 1 2 % 10的值。拆解顺序是先算2 - 1得 1再算2 % 10得 2最后1 2非零即真结果是 1。答案选 B。优先级从高到低一级需要记牢的大致是括号 →!→ 算术* / %高于 -→ 关系 → 相等 !→→||→ 赋值。这张顺序表不用背成顺口溜但遇到复合表达式必须能一层层拆。再看作比较的第 5 题x 2, y 4, z 6判断哪个表达式为真选项表达式计算过程结果Ax y || x z24假26假假Bx ! z - yz-y22!2假Cz y xyx666假Dx y || !x z24真短路后整体真真D 选项最容易看错!x z里!先作用于x!2得 0再0 6为真。但因为||左边已经是真整个表达式直接短路为真。这里同时考了优先级和短路求值属于一级选择题的典型复合考法。3.2 短路求值与副作用和||的短路规则必须形成条件反射A B中 A 为假就不再算 BA || B中 A 为真就不再算 B。这条规则本身简单坑在于“不算”意味着右边如果有赋值或自增就不会发生。int a 0, b 0; if (a ! 0 b 0) { // 条件不成立且 b 根本没有执行 } // 此时 b 仍然是 0不是 1这段代码的意义在于说明短路不仅影响结果还影响副作用。一级选择题不会写得这么绕但理解到这层遇到“表达式值为多少”“变量最终是多少”这类题就不会慌。逻辑非!的优先级高于关系运算符!x z等价于(!x) z而不是!(x z)这是另一个高频错点。3.3 逗号表达式与 cout 输出判断题第四题cout (2, 3, 23)的输出。括号里是逗号表达式从左到右依次求值整个表达式的值是最后一个也就是字符串23所以输出是23不是2,3,23。这道判断题的说法是错的。逗号表达式的规则只有一条从左往右算取最右边的值。但它和cout的放一起就容易误读因为的优先级高于逗号没有括号时cout 2, 3会被解析成(cout 2), 3先输出 2。有括号才是先算逗号表达式再输出。#include iostream using namespace std; int main() { int b, c; // 逗号表达式先赋值 b3再赋值 c4最后取 bc int a (b 3, c 4, b c); cout a endl; // 输出 7不是 3也不是 4 return 0; }a拿到的是最后一个子表达式b c的值即 7而b、c的赋值副作用照样发生。真题第 6 题里a (b 3, c 4, b c);被认为是合法语法就是这个道理。同一题里a - a (b 6) / (c 2);也是合法的虽然写法极不推荐但它能编译考的就是你能不能把“合法但不优雅”和“语法错误”分开。3.4 复合赋值与自增自减c 5;等价于c c 5;-、*、/、%同理。一级要掌握的关键点不是这些符号本身而是“左边必须能接收值”——5 c这种写法左边是常量不合法。自增自减在这个阶段先记两条i先用后加i先加后用单独成句时两者没区别。真题里出现过在循环条件中写i 2的判断题说的是for (int i 0; i 10; i 2)表示从 0 开始、到 10 结束但不含 10、间隔为 2这个描述是正确的循环变量依次取 0、2、4、6、8共 5 次。4. 流程控制循环边界与字符运算的实战重点4.1 for 循环的三段结构与边界判断真题第 13 题求正整数的所有因数输入 10 输出 1、2、5、10输入 17 输出 1、17。要在横线处填循环头正确答案是for (int i 1; i n 1; i)。四个选项的差别只有两处上界是n还是n 1步进是i 1还是i。这两处恰好是一级最经典的两个坑上界求因数必须包含n本身因为任何正整数都能被自己整除。写i n会漏掉n输入 17 就只输出 1直接错。步进i 1只是算了一个值没有赋值回i循环变量永远不变直接死循环。#include iostream using namespace std; int main() { int n; cin n; // i 从 1 遍历到 n含 n才能取到 n 这个因数 for (int i 1; i n; i) { if (n % i 0) { cout i ; } } return 0; }参数说明i n与i n 1等价前者更直观n % i 0判断整除关系余数为 0 说明i是因数。这段代码也是编程题的基本骨架后面两道大题都建立在同样的循环思路上。4.2 while 与 do-while 的死循环辨析判断题第七题说“do-while循环不可能导致死循环但while有可能”这是错的。两种循环都可能死循环只要条件永远成立。do-while的特点是先执行一次再判断因此即使一开始条件为假循环体也至少跑一遍这是它和while的核心差别。判断题第八题涉及continue如果循环体里continue无条件执行会不会死循环要看continue之前循环变量有没有推进。若推进语句被continue跳过条件永远成立就是死循环。这类题检验的是你能不能顺着执行流程走一遍而不是背结论。break与continue的分工要分清break跳出整个循环continue只跳过本次剩余部分、进入下一次。在一级的选择题里经常用一段带if的循环让你数输出了几次做法就是拿纸手动模拟别在脑子里跑。4.3 数位分解与取模运算真题第 14 题要在横线处填写代码使输出是正整数各位数字的平方和。横线处应填(n % 10) * (n % 10)因为n % 10取出最低位平方后累加再让n / 10去掉这一位循环直到n变为 0。#include iostream using namespace std; int main() { int n, sum 0; cin n; while (n 0) { int d n % 10; // 取出当前最低位 sum d * d; // 累加这一位的平方 n n / 10; // 去掉最低位整数除法自动截断 } cout sum endl; return 0; }这段是数位类题目的通用模板两个动作必须成对出现% 10取位、/ 10删位。只取不删会死循环只删不取就漏算。变体包括求各位数字之和、求位数、反转数字骨架完全一样只换中间那行累加逻辑。4.4 字符与 ASCII 编码判断题第六题(1 1)的值为2错误。字符1参与算术运算时用的是 ASCII 编码值1是 49相加得 98对应字符b不是2。如果想让1变成数字 1要写1 - 0想让数字变字符写0 1。写法结果说明1 198两个字符的编码相加1 - 01字符转对应数字常见套路0 11数字转字符int(1)49显式取编码值字符和整数之间的这层转换是编程题输入的常见处理点。一级的输入多数直接给整数用cin n就行但一旦题目按字符读入就必须知道1和1差着 48。5. 编程题拆解两道真题的完整思路与评分要点5.1 买文具条件判断与两种情况输出第一道编程题是买文具签字笔 2 元一支需 X 支记事本 5 元一本需 Y 本直尺 3 元一把需 Z 把手里有 Q 元。总花费是2*X 5*Y 3*Z与 Q 比较够就输出Yes和剩余钱数不够就输出No和缺少的钱数。#include iostream using namespace std; int main() { int x, y, z, q; cin x y z q; // 四行输入cin 连续读取即可 int cost 2 * x 5 * y 3 * z; if (cost q) { cout Yes endl; cout q - cost endl; // 剩余 } else { cout No endl; cout cost - q endl; // 缺少 } return 0; }这段代码的评分点集中在几处输出必须两行第一行字符串大小写要与题面一致Yes、No不是YES剩余和缺少的减法方向不能反剩余是q - cost缺少是cost - qcin连续读四个变量默认以空白分隔题目说输入四行逐行读和一次读四个结果一样。这道题最容易丢分的地方不是算法而是输出格式。有人把两个数打到一行有人把Yes写成YES25 分直接打折。复习时养成习惯写完先拿样例对一遍肉眼比对每个字符。5.2 小明的幸运数枚举、整除与个位判断第二道题定义“k 幸运数”个位数为 k 的正整数以及所有 k 的倍数。求 L 到 R 之间含两端所有 k 幸运数的和。范围是2 ≤ k ≤ 9、1 ≤ L ≤ R ≤ 1000数据很小直接枚举。#include iostream using namespace std; int main() { int k, l, r, sum 0; cin k l r; for (int i l; i r; i) { // 个位是 k或者是 k 的倍数满足其一即为幸运数 if (i % 10 k || i % k 0) { sum i; } } cout sum endl; return 0; }关键参数i % 10 k判断个位数注意k的范围是 2 到 9所以不用担心k是两位数i % k 0判断倍数两个条件用||连接因为题目定义是“以及”满足一个就算。样例验证k7、L1、R10只有 7 同时是个位为 7 且是 7 的倍数和为 7k7、L10、R2014 是倍数、17 个位为 7和 31与题面一致。最容易错的是把“以及”理解成“并且”写成结果一个数都不满足输出 0。另一个坑是循环边界写成i r漏掉右端点 R。这两处和前面第 13 题的因数边界是同一个思维习惯问题题目说“包括 L 和 R”就必须。6. 易漏点清单五个最容易在考场上翻车的地方易漏点一字符与数字混用。为什么漏平时写代码多用整数输入很少碰字符运算一看到1 1就顺着直觉答2。怎么补把1 - 0这个转换套路写进笔记遇到字符参与算术先在旁边标出 ASCII 值再算。易漏点二循环上界要不要带等号。为什么漏和只差一个字符读题时注意力都在循环体上。怎么补凡题目出现“包括”“所有”“到 n 为止”一律先确认右端点是否要取到求因数、求区间和这两类题固定用。易漏点三和||在自然语言里的对应。为什么漏中文“以及”在口语里有时表示并列递进容易读成“并且”。怎么补题目说“以及”“或者”时翻译成||说“同时”“既……又……”时翻译成写完拿一个边界样例验一验。易漏点四cout不是关键字、逗号表达式取最后一个值。为什么漏这两条都属于“看起来像常识、实际靠背”的规则没做过题就不会主动想。怎么补把关键字表和标准库常用名cout、cin、endl分开列逗号表达式单独记一句“从左到右算取最右”。易漏点五输出格式与减法方向。为什么漏思路对了就急着交没逐字对样例Yes/No大小写、两行输出、q - cost还是cost - q全在细节里。怎么补每道编程题写完强制用题目给的每组样例手跑一遍输出逐字符比对包括空格和换行。注意这五条都不是“不会”而是“会但没注意”。一级的分数差距基本就藏在这种地方。复习时把错题按这五类归档比按题号归档有用得多。7. 复习落地一套可执行的查漏补缺流程复习这件事光看知识点不够得有一个能反复走、每次都能暴露问题的流程。我自己的做法是把一级拆成三轮每轮目标不同。第一轮过规则用一张自检表把“记忆型考点”扫一遍。下面这张表可以直接抄下来每格打勾才算过检查项自检问题过关标准设备分类内存属于哪类设备能立刻答存储设备命名规则哪四类名字不合法空格、数字开头、符号、关键字优先级2-12%10怎么算能拆成三步说出结果 1短路a!0 b后 b 是多少答 0并解释原因逗号表达式(2,3,23)输出什么答 23字符运算11等于多少答 98不是2循环边界求因数 i 到哪停i n数位分解取位和删位分别用什么% 10和/ 10第二轮过代码把两道编程题的模板默写一遍不看答案。买文具考的是顺序结构和条件分支幸运数考的是循环加条件组合两个模板覆盖了一级编程题的全部结构。默写时故意改一下边界比如把i r改成i r看样例会不会挂用这种方式确认自己真的理解边界。第三轮过错题按第 6 章那五类归档重做。每道错题旁边写一句“我当时为什么选错”比如“以为 cout 是关键字”“把以及当成并且”。这句话比正确答案有用因为下次遇到同类题你想起的是自己当时的错误念头而不是一个抽象规则。// 通用自检骨架任何一道编程题写完套这个结构快速验边界 int main() { // 1. 读入数量、范围、单位是否和题面一致 // 2. 计算表达式顺序、整除还是小数、有没有漏乘 // 3. 分支条件方向对不对两种情况是否都覆盖 // 4. 输出字符串大小写、行数、减法方向 return 0; }这套流程走完大概能覆盖一级 90% 以上的失分点。剩下的那部分多半是读题时漏了“正整数”“包括”这类限定词属于习惯问题只能靠每次读题时拿笔圈关键词。我自己的血泪经验是第一次做这类卷子知识点全会分数却不高问题全出在“以为自己对”。从那以后我每次复习都强制走一遍上面那张自检表哪怕觉得没必要也走因为翻车从来不是因为不会而是因为没检查。希望帮到你。本文还有配套的精品资源点击获取