简介:这份资源是2023年9月GESP C++一级认证考试的真题文档,面向准备参加GESP等级测试的青少年编程学习者、信奥赛入门选手及C++初学者,可用于考前自测、熟悉题型结构与检验基础语法掌握程度。压缩包内共1个docx文件,约147KB,完整收录单选题、判断题与编程题三大板块,涵盖内存与存储设备、变量命名规则、逻辑与算术运算符、复合赋值、逗号表达式、循环与因数求解、数位平方和等核心考点,并附「买文具」「小明的幸运数」两道编程题的输入输出描述与样例说明,便于读者对照题目梳理知识盲区、演练解题思路。目前已有903人学习下载,适合作为一级备考阶段的真题演练材料,帮助考生在正式考试前建立对题型分布与难度层级的直观认识。
1. 一级卷面拆解:30 分选择、20 分判断、50 分编程,分数到底丢在哪
GESP C++ 一级这张卷子,很多考生走出考场的第一反应是“题不难”,成绩出来却是 60 多分。问题不在会不会写代码,而在对卷面结构的误判:单选题 15 道每题 2 分共 30 分,判断题 10 道每题 2 分共 20 分,编程题 2 道每题 25 分共 50 分。选择判断合计 50 分,全是客观题,恰恰是信奥赛入门阶段最容易翻车的地方——运算符优先级、逗号表达式、字符与整数混算,这些玄学细节一错就是 2 分。编程题占一半分值,但两道题都是“输入几行、输出几行”的直白模型,没有复杂算法,考的是读题、边界和输出格式。这份 2023 年 9 月真题适合刚学完变量、分支、循环的考生做一次全真自测,也适合家长和教练用来判断孩子是否具备报考一级的实力。下面按考点分布、高频题型、易错点、答题节奏四层拆开讲,每道题都给可照着背的思路。
2. 选择判断高频考点:运算符、类型转换与循环边界
客观题 50 分看着零散,实际集中在四类考点上:运算符优先级与短路求值、变量命名与关键字、整数与字符的类型转换、循环的起止与步长。把这四类吃透,选择判断能稳定拿到 40 分以上。这一章按考点分组,每组配真题和答题思路,做完再对照后面的易错章复盘。
2.1 运算符优先级与短路求值:2 - 1 && 2 % 10为什么等于 1
真题第 3 题:表达式2 - 1 && 2 % 10的值。四个选项 0、1、2、3。答题思路分三步走:先看优先级,算术运算符-和%高于逻辑与&&,所以先算2 - 1得 1,再算2 % 10得 2;再看&&的语义,两侧都非零才为真,1 和 2 都非零,结果为真;最后看 C++ 里逻辑运算的结果类型,真值统一表示为整数 1,所以答案是 1。很多考生会选 2,是把&&当成了某种“取后者”的运算,这是概念混淆。
同类考法还有第 5 题:x、y、z 分别为 2、4、6,判断哪个表达式为真。逐个代入:A 项x > y || x > z即2 > 4 || 2 > 6,两侧都假,结果为假;B 项x != z - y即2 != 6 - 4,也就是2 != 2,为假;C 项z > y + x即6 > 4 + 2,6 > 6为假;D 项x < y || !x < z,这里有个坑,!优先级高于<,所以先算!x得 0,再算0 < z为真,整个或运算为真。答案是 D。这道题面试官最想听的是你能不能说出“!是一元运算符,优先级高于关系运算符”,而不是靠试。
提示:遇到
&&和||的题,先标优先级,再判断是否需要短路。一级考试里短路求值本身很少单独出题,但优先级判断几乎年年有。
2.2 变量命名与关键字:red star错在哪,cout能不能当变量名
真题第 2 题问哪个不能作为变量名,选项里redStar、RedStar、red_star都合法,red star中间有空格,直接排除。这类题考的是命名规则三条:只能由字母、数字、下划线组成;不能以数字开头;不能是关键字。答题时逐条对照即可,不需要背完整关键字表,但要知道int、for、while、return这些常见关键字。
判断题第 9 题是同一考点的反向考法:“不可以将变量命名为 cout,因为 cout 是 C++ 的关键字。”这句话错在两处:cout不是关键字,它是标准库里的对象名;语法上你确实可以定义一个叫cout的变量,只是会遮蔽标准输出、引发混乱。答题思路是先定性“是不是关键字”,再定性“能不能命名”。面试官常追问“那为什么实际编程中没人这么干”,答“可读性和命名冲突风险”就够了。
判断题第 10 题“C++ 是一种高级程序设计语言”为真,属于送分题,但别因为前面难题做崩了在这里犹豫。判断题的节奏是:一眼能定的先定,拿不准的标记后回看,不要在一道 2 分题上耗三分钟。
2.3 类型转换与字符运算:int(3.14)、'1' + '1'、逗号表达式
判断题第 3 题:int(3.14)的值为 3。浮点转整数是截断取整,不是四舍五入,3.14 截断为 3,正确。判断题第 6 题:('1' + '1')的值为'2'。这是高频翻车点:字符'1'参与算术运算时按 ASCII 码转成整数 49,49 + 49 = 98,98 对应的字符是'b',不是'2'。要得到字符'2',得写'1' + 1。答题时记住一句话:字符加字符得整数,字符加整数得字符(在可打印范围内)。
判断题第 4 题:cout << (2, 3, "23")的输出。括号里是逗号表达式,从左到右依次求值,整个表达式的值是最后一个,即字符串"23",所以输出是23,不是2,3,23。这道题的错误率很高,因为考生会把括号里的逗号当成输出分隔符。答题思路:先识别逗号表达式,再取最右值。
选择题第 6 题考语法合法性,B 项b = c % 2.5;不合法,因为%只能用于整数类型,2.5 是浮点数。C 项a = (b = 3, c = 4, b + c);是逗号表达式嵌套赋值,合法,最终 a 得 7。D 项a -= a = (b = 6) / (c = 2);虽然写法刁钻,但语法成立。这类题答题顺序是:先扫类型不匹配(%配浮点、赋值给常量),再扫括号配对,最后看运算符组合。
2.4 循环边界与因数、数位处理:i <= n还是i < n
选择题第 13 题求正整数所有因数,横线处应填循环条件。题目样例给得很清楚:输入 10 输出 1、2、5、10,包含 n 本身,所以循环必须走到 n,条件应为i <= n,对应选项 D 的int i = 1; i < n + 1; i++。A、C 都停在 n 之前,会漏掉 n 本身;B 的步长写成i + 1而不是i++,循环变量不更新,直接死循环。这道题一箭双雕:既考边界含不含等号,又考循环变量必须自增。
选择题第 14 题求各位数字平方和,横线处要填提取个位并平方的表达式,答案是(n % 10) * (n % 10)。只写n % 10是提取数字但没平方,只写n / 10是去掉个位。答题时把题目要求拆成两个动作:取位用% 10,平方用自乘,合起来就是答案。
判断题第 5 题:for (int i = 0; i < 10; i += 2)表示从 0 开始到 10 结束但不包含 10,间隔 2。描述正确。判断题第 7 题“do-while 不可能导致死循环,while 有可能”为假,两种循环只要条件恒真都会死循环。判断题第 8 题说 continue 无条件执行导致死循环,要看具体代码:如果 continue 之前没有推进循环变量的语句,确实死循环;这类题必须结合给出的代码判断,不能凭印象。
3. 编程题逐题拆解:买文具与幸运数的满分写法
两道编程题各 25 分,合计 50 分,是拉开差距的主战场。一级编程题不考算法,考的是三件事:把文字描述翻译成变量和公式、处理“够不够”这类分支输出、把循环和取位组合对。下面两题都给出完整代码、逐行说明和常见扣分点。
3.1 买文具:总价比较与两种输出分支
题目模型:签字笔 2 元一支买 X 支,记事本 5 元一本买 Y 本,直尺 3 元一把买 Z 把,手里有 Q 元。总价cost = 2*X + 5*Y + 3*Z。若Q >= cost,第一行输出Yes,第二行输出Q - cost;否则第一行输出No,第二行输出cost - Q。输入四行,每行一个正整数,范围都在 1 到 10(Q 未给上限但一级数据不会超 int)。
#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 (q >= cost) { // 注意是大于等于,钱刚好够也算 Yes cout << "Yes" << endl; cout << q - cost << endl; // 剩余钱数 } else { cout << "No" << endl; cout << cost - q << endl; // 缺少钱数,用总价减手头 } return 0; }逐行看关键点:cin >> x >> y >> z >> q一次读四个整数,题目说输入四行,但cin按空白分隔,换行和空格等价,所以不用写四次cin。cost的计算顺序无所谓,加法满足交换律。分支条件必须是q >= cost,写成q > cost会在钱刚好够时错判为 No,这是本题第一大失分点。两个分支里的减法方向相反:够的时候剩q - cost,不够的时候缺cost - q,写反了输出负数,样例对不上。输出必须两行,endl换行不能省,有的考生把两个结果拼一行输出,格式分直接没了。
注意:一级编程题按测试点给分,输出格式错一个字符该测试点就是 0 分。
Yes和No的大小写按题目原文,不要写成YES或yes。
3.2 小明的幸运数:倍数判断与个位判断的或运算
题目模型:所有个位数为 k 的正整数,以及所有 k 的倍数,都叫 k 幸运数。求 L 到 R 之间(含两端)所有 k 幸运数的和。输入三行 k、L、R,约定 2≤k≤9,1≤L≤R≤1000。样例一:k=7,L=1,R=10,只有 7 同时满足个位为 7 且是 7 的倍数,和为 7。样例二:k=7,L=10,R=20,14 是 7 的倍数,17 个位是 7,和为 31。
#include <iostream> using namespace std; int main() { int k, l, r; cin >> k >> l >> r; int sum = 0; // 累加器必须初始化为 0 for (int i = l; i <= r; i++) { // 闭区间,i 要取到 r if (i % k == 0 || i % 10 == k) // 倍数 或 个位为 k,两个条件任一成立即可 sum += i; } cout << sum << endl; return 0; }关键点逐个说:循环条件i <= r,写成i < r会漏掉右端点,如果 R 本身是幸运数就少加一个。判断条件用||连接,不能用&&,因为“个位为 k”和“是 k 的倍数”是或的关系,样例二里 14 只满足倍数、17 只满足个位,用与运算两个都进不去。i % 10 == k提取个位,注意 k 是整数 2 到 9,不是字符,不要写成'k'。累加器sum必须初始化为 0,局部变量不初始化是随机值,这是血泪经验里最常见的翻车点之一。数据范围 R 最大 1000,累加和最大约 50 万,int 完全够用,不需要 long long。
两题对比着练:买文具考分支和两种输出,幸运数考循环加或条件判断。共同点是输入输出格式必须和题目逐字对齐,变量初值不能省。把这两题各手写三遍,不看答案能一次通过样例,编程题 50 分就有了底。
4. 易错点复盘:五类一错就丢分的题,错在哪、怎么答对
这一章专挑考场上错误率最高的五类题,每条按“错在哪、为什么错、怎么答对”写。做完真题后拿这一章对照,错过的题在旁边标星,考前只看标星的。
第一类,逻辑运算结果当成操作数。错在把2 - 1 && 2 % 10答成 2,以为&&返回右边那个数。为什么错:把逻辑运算和位运算、逗号表达式混为一谈。怎么答对:记住&&、||、!的结果只有 0 和 1 两种,真就是 1,假就是 0,与两侧操作数的具体数值无关。
第二类,字符与整数混算。错在认为'1' + '1'等于'2'。为什么错:没意识到字符参与算术时先转 ASCII 码。怎么答对:看到字符加字符,先转码再算,49 + 49 = 98,对应'b';要得到'2'必须写'1' + 1。同类还有int('A')是 65 这类常识,一级不要求背全表,但数字字符 0 到 9 对应 48 到 57 要记牢。
第三类,循环边界漏等号。错在因数题填i < n,或幸运数题写i < r。为什么错:读题时没注意“包括 n 本身”“包括 L 和 R”这类字眼。怎么答对:凡题目出现“所有因数”“之间(包括两端)”,循环条件一律带等号;写完用样例的最小边界手算一遍,比如输入 17 看输出里有没有 17。
第四类,输出格式与分支方向。错在买文具题把剩余和缺少写反,或Yes写成YES。为什么错:赶时间,没回头对样例。怎么答对:编程题写完先跑题目给的两组样例,样例全过再检查大小写和换行;分支里两个减法用“大减小”原则,保证结果非负。
第五类,变量未初始化与循环变量不自增。错在累加器sum不赋初值,或 for 循环第三段写成i + 1。为什么错:前者是习惯问题,后者是手滑。怎么答对:所有累加、计数变量声明时就赋 0;for 循环第三段只写i++或i += 步长,写完扫一眼循环体里有没有改变循环变量的语句,避免死循环。
5. 考场答题节奏:50 分钟客观题加 70 分钟编程的时间分配法
一级考试总时长通常 120 分钟,客观题 25 道、编程题 2 道。我的建议是客观题控制在 50 分钟内,编程题留 70 分钟。客观题按“两遍法”做:第一遍 30 分钟,会做的直接选,拿不准的题号画圈跳过,绝不恋战;第二遍 20 分钟,回头攻画圈的题,用代入法把选项逐个代进表达式验算,比空想快得多。判断题放最后做,因为 2 分一题、题量又大,适合用剩余时间快速扫。
编程题的时间切法是:读题 5 分钟,把输入几行、输出几行、边界条件写在草稿纸上;写代码 15 分钟;跑样例 5 分钟;检查格式和边界 5 分钟。第一题买文具通常 20 分钟内能拿下,第二题幸运数留足 30 分钟。如果一道题卡住超过 15 分钟没有思路,先跳去做另一道,两道题的分值一样,不要在一棵树上吊死。
下面这张表是我自己考前会默一遍的检查清单,进考场前看一遍,交卷前对着扫一遍:
| 检查项 | 具体动作 | 对应失分点 |
|---|---|---|
| 输入读取 | 确认cin次数和顺序与题目一致 | 变量读反、漏读 |
| 边界条件 | 循环含不含端点,比较用>=还是> | 漏掉 n 本身、钱刚好够判错 |
| 初值 | 累加器、计数器声明即赋 0 | 随机值导致答案漂移 |
| 输出格式 | 大小写、换行、两行还是单行 | 格式分整点丢失 |
| 样例验证 | 题目给的每组样例都手跑一遍 | 逻辑方向写反 |
最后说一个习惯。我早年带考生复盘时见过太多“思路全对、样例全错”的卷子,后来自己每次模考都强制走一遍流程:先通读全卷标出送分题,客观题两遍法做完再碰编程,编程题写完必须手跑样例、对输出格式、查循环边界,三步缺一不可。这个习惯比多刷十套题管用。希望帮到你。
本文还有配套的精品资源,点击获取