简介:2024年信息素养大赛C++算法创意实践挑战赛小学组初赛真题解析,是一份面向小学阶段C++初学者的竞赛真题练习资料。内容覆盖单选题与判断题,涉及变量定义、布尔表达式、输入输出、数学运算、循环结构及基础算法逻辑等核心考点,适合备赛学生自我检测与巩固,也可供教师作为教学参考。包内包含1个docx文档,压缩包整体约337KB,排版清晰,便于打印或屏幕阅读。已有1528人学习下载,验证了其实用价值。通过完整原题与背景说明,读者可系统熟悉竞赛题型与考察重点,针对性查漏补缺,提升编程思维与解题效率。
1. 小学组初赛到底考什么:20 道真题背后的四个得分模块
先看一道大多数孩子会丢分的判断题:在 C++ 中,for 循环至少执行一次。很多孩子凭课上印象答“正确”,实际上 for 循环可以先判断后执行,条件不成立就一次都不进循环体,这题的正确答案是“错误”。一道判断题就把“背结论”和“理解机制”的人区分开了,这就是小学组初赛的典型考法。
这份初赛真题一共 20 道,15 道单选加 5 道判断,表面上考的是 C++ 基础知识,实际只围绕四个模块:整数运算与表达式求值、变量命名与输入输出、逻辑与循环结构、以及最容易白丢分的判断题陷阱。它不考难题,考的是快、准、稳——你需要在 30 秒内判断一道题的考点,再用 10 秒做对。适合刚学完基础语法、想冲初赛的小学生,也适合带竞赛班、需要把考点拆给家长看的老师。接下来按高频考点把 20 道题全部拆开。
2. 高频考点:整数运算是第一道坎——除法取余与表达式求值
初赛前几道固定考运算符,第一题就把一批孩子拦在门外。它考的既不是谁算得快,而是你知不知道整数除法会丢掉小数、/和%的优先级完全一样、并且按从左到右的顺序计算。出题人不会在题目里提醒你“注意这是整数除法”,默认你已经懂了这个规则。
2.1 先算哪一步决定答案:真题拆解
第 1 题的程序段是这样:
int n = 572765; cout << n / 10 % 10;选项是 5、6、4、1。这道题可以拆成两步:先算n / 10,结果是多少?572765 除以 10 等于 57276.5,但 n 是int类型,整数除法直接抛弃小数部分,所以第一步结果是 57276。再算57276 % 10,取余数得到 6,选 B。
这类题通常这么答:先把整个表达式里的运算符号圈出来,标上优先级。这里/和%是同级运算,结合方向从左到右,所以必须先除再取余。面试官最想听到的关键点是“整型除法不四舍五入,直接截断”,而不是“我算出 6 了”。
一个很容易被追问的变形:如果把 n 改成double类型,n / 10会得到 57276.5,但%运算符不能用于浮点数,编译器会直接报错。这就是出题人埋在背后的第二层考点:%的两个操作数必须是整数类型。
2.2 乘除混合:x/2*3 为什么不是 10.5
第 3 题是同一考点的另一张脸:
int x = 7; int y = x / 2 * 3;错选 10.5 的人是把式子看成了x / (2 * 3),也就是先算了 2 乘 3。但 C++ 里*和/优先级相同,结合顺序是从左到右,所以真正执行的是(x / 2) * 3。7 除以 2 得到 3(整数除法丢掉 0.5),3 乘 3 等于 9,y 本身是int,存的就是 9,选 D。
这里有一个值得记下的规律:乘除混合运算中,把除法放前面和放后面,结果可能完全不同。x / 2 * 3和x * 3 / 2不是一回事,后者先算 7 乘 3 得 21,再除以 2 得 10。初赛如果考“以下哪个表达式的值和另外三个不同”,用的就是这个差异。
2.3 循环累加的题:先把每轮结果写出来
真题第 14 题原卷程序段不是完整的,选项是 6、8、5、10,从选项能判断它考的是循环里的累加器。常见的写法有两种:sum += i;写在循环体末尾,和sum += i;写在输出之前。看似差不多,实际每轮累加的时机不同,结果就不同。
这类循环题通常这么答:不要心算,拿出草稿纸画一个三行表格,第一行列循环次数,第二列写当前 i 的值,第三列写累加器 sum 的值。每执行一次循环就填一格,填完表格答案自然出来。小学组初赛的循环题几乎全都能用这个笨办法做对,出题人设置的数字不会大到让你画不完表格。
2.4 运算符题的通用答题模板
遇到任何带/、%、*的表达式题,按下面三步走就不会翻车:
第一步,把表达式里所有运算符号按优先级分组,*/%同级,从左到右算;第二步,每做一次除法或取余,都把操作数当成整数看待,有小数直接丢掉;第三步,把每一步的中间结果写出来,再代入最后一步运算。三步中只要跳过任何一步,就容易掉进出题人挖的坑里。
给你一道自测题:int n = 2468; cout << n / 100 % 10;输出什么?先算2468 / 100得到 24(不是 24.68),再算24 % 10得到 4。如果这道题你一次答对,说明整数运算的逻辑已经过关了。
3. 高频考点:变量、命名与输入输出——基础语法题的固定套路
这四道题占的比重不小:第 7 题问变量叙述哪个不正确,第 8 题和第 13 题考变量命名,第 19 题和第 20 题考定义与类型,第 4 题、第 10 题、第 18 题考输入输出方向。加起来接近一张卷子的三分之一分值,而且全是送分题。送分的意思不是闭眼选,而是出题人把“错误选项”设计得很有迷惑性。
3.1 三句话钉死变量考点:定义、初始化、类型
第 7 题问“下列关于变量的叙述,不正确的是”,正确答案是“变量没有定义也能够使用”。C++ 是强类型语言,任何变量必须先声明后使用,没有定义就直接用会在编译阶段报错。第 20 题的判断题也在验证同一件事:“所有变量都必须在使用前声明其数据类型”,这句话是正确的。
第 19 题是这组题里最阴的一道:“变量声明后,如果不初始化,其值是确定的”,很多人选“正确”,因为觉得 int 默认就是 0。实际上局部变量不初始化,拿到的是内存里残留的随机值,这叫未定义行为,编译器不保证任何结果。全局变量确实会自动清零,但局部变量不会,这个区别判断题年年都会换个说法继续考。
面试官最想听的是你能说出这两个区别:第一,全局变量在静态存储区,默认初始化为 0;第二,局部变量在栈上,不初始化就是不确定值。这也解释了为什么竞赛代码里所有变量都习惯性写上= 0,不是为了美观,是为了不踩未定义行为的坑。
3.2 合法标识符判定:三道滤网直接排除
第 8 题四个选项是2things、_myVariable、my-varilable、None of the above。第一个以数字开头,非法;第三个中间带减号,非法;下划线开头的_myVariable是合法标识符,选 B。
第 13 题看起来更复杂,选项是cnt 1、1_cnt、cnt1_#、@cnt。很多孩子非要在这四个里挑一个,实际上按 C++ 规则这四个全部非法:cnt 1含空格,1_cnt以数字开头,cnt1_#含#符号,@cnt含@符号。注意,这一题就是在训练你:遇到所有选项都不合法时,要有底气说“全部非法”,而不是硬选一个相对顺眼的。
记住三条判定滤网,做题时逐个套用:第一,数字不能开头;第二,只能包含字母、数字、下划线三种字符,空格、#、@、-都不行;第三,不能和 C++ 关键字重名。三条都通过才是合法变量名。
3.3 cin 和 cout:方向永远不要靠背
第 4 题问输出指令,选cout。第 10 题问输出变量 x 的代码,选cout << x。第 18 题判断题说“cout 用于输入,cin 用于输出”,这是错误的。三题考的是同一件事:两个流的方向。
背“右箭头是 cout,左箭头是 cin”这种口诀很容易记反,因为箭头方向本身会混淆。正确理解是看箭头的指问:>>是把输入流里的数据送进变量,所以它是cin的符号;<<是把变量的值送到输出流,所以它是cout的符号。写代码时盯住箭头指向谁,就能一次判断对:
int x; cin >> x; // 数据从键盘流入 x,箭头指向 x cout << x; // x 的内容流向屏幕,箭头指向 cout 后面的流闭卷考试时如果一时分不清,先在草稿纸上写下cin >>和cout <<两组,再想“输入是我给电脑,所以数据流向电脑里的变量;输出是电脑给我,所以数据流向屏幕”。方向判断对了,这几道题的分数就稳了。
3.4 字符串输出题的判题方法
第 11 题原卷程序段有缺失,选项是Hello, world!、Hello World、语法错误、无任何输出。这一题真正考的是两条:字符串必须用双引号括起来,以及输出语句有没有写完整。常见丢分场景是孩子盯着选项的英文内容看,忽略了题目给出的代码片段本身。
考试时如果看到“语法错误”和“无任何输出”这种选项,先检查代码结构而不是英文内容:有没有头文件、有没有分号、字符串有没有引号。只要程序能编译且 cout 语句成立,就从正常输出选项里选,不需要纠结大小写和标点的差异。
4. 高频考点:逻辑运算、条件分支与循环——算法题的三个必答模板
卷子里真正拉开差距的是这一组:第 2 题两个城市温度判断、第 5 题平方数口袋、第 12 题输出偶数、第 15 题质数判断。它们共同的特点是不再单考一个点,而是把“条件怎么写、循环怎么停”揉在一道题里。这也是小学组初赛里最接近“算法”的部分,分值占比不高,但错一道可能就掉出晋级线。
4.1 布尔类型与逻辑运算:先背真值表再做题
第 6 题问布尔数据类型的关键字,选bool。第 16 题判断题说&&和||分别代表逻辑与和逻辑或,这是正确的。这两道是纯记忆题,但后面的条件判断题全建立在真值表上。
&&的规则是两边都真才真,||的规则是至少一边真就真。建议动手把四种组合各算一遍:true && true得 true,true && false得 false,false || true得 true,false || false得 false。小学组不深挖短路求值,但你要能从概念上分清“与”和“或”的关系,不会把“当且仅当”读成“任意一个”。
4.2 异或条件的固定写法:只有一边满足
第 2 题是两个城市的温度判断:当且仅当只有一个城市温度低于 0 时输出 1。两个城市都低于 0 或都不低于 0 时输出 0。这个条件逻辑上叫异或,小学组不会考这个术语,但会把条件拆开让你补全。
标准写法是把两种情况分别写出来再合并:
int a, b; if ((a < 0 && b >= 0) || (a >= 0 && b < 0)) cout << 1; else cout << 0;一个更简洁的写法是if ((a < 0) != (b < 0)),用不等式表示“两个条件状态不同”。面试官最想听的是第二种思路,因为它体现了对逻辑本质的理解:不等号在真实值场景下等价于逻辑异或。
题目里有个容易忽略的细节:温度范围是 -50 到 50,包含 0 摄氏度。低于 0 是a < 0,不低于 0 是b >= 0。很多孩子把边界写成a <= 0,恰好把 0 度归到“低于零”,整个判断就反了。题目给的具体数值范围和边界,永远是第一优先级。
4.3 筛选模板:平方数口袋全流程拆解
第 5 题是初赛压轴级别,考三个考点:判断一个数是不是平方数、判断负载量是否超限、区分continue和break的执行时机。题面给的例子是 L=100,依次输入 49、19、36、25、73,最终口袋装了 49 和 36,输出 2。
完整逻辑是这样:
int sum = 0, count = 0; for (int i = 0; i < n; i++) { int x; cin >> x; for (int j = 1; j <= x; j++) { if (j * j == x) { // 判断平方数 break; } } if (j * j != x) continue; // 不是平方数,跳过这个数 if (sum + x > L) break; // 放不下就整个循环结束 sum += x; count++; } cout << count;逐步模拟一遍:49 是 7 的平方,且 49 小于 100,放入,sum 变成 49;19 不是平方数,continue跳过;36 是 6 的平方,49 加 36 等于 85,不超过 100,放入,sum 变成 85;25 是 5 的平方,但 85 加 25 等于 110 超过 100,触发break,循环结束,后面的 73 不再处理。最终 count 是 2。
这道题有两个高频翻车点。第一,把break和continue用反——continue只是跳过当次循环去处理下一个数,break是终止整个循环。负载量超限意味着“后面都不能再放”,必须用break。第二,平方数判断条件容易写成x / j == j或x % j == 0,前者在某些整数除法下会误判,后者判断的是因数而不是平方数。老老实实让 j 从 1 枚举到 x,看有没有j * j == x。
4.4 循环模板:偶数输出与质数判断
第 12 题考输出 1 到 10 之间的所有偶数,补全条件,选i % 2 == 0。这类题有个配套问法:改成“奇数”选哪个?答案是i % 2 != 0,也就是i % 2 == 1。出题人经常把偶数题改成奇数题,或者把“输出所有偶数”改成“输出所有能被 3 整除的数”,条件欄杆从%2换成%3,逻辑不变。
第 15 题是质数判断,这是小学组最常考的算法模板:
bool isprime = true; // 先假设是质数 for (int i = 2; i < n; i++) { if (n % i == 0) { // 找到一个因子,不是质数 isprime = false; break; } }① 处填bool isprime = true,② 处填n % i == 0,选 A。逻辑是:先假设 n 是质数,然后从 2 试到 n 的前一个数,只要 n 能被其中任何一个整除,就说明不是质数,把标记改成 false 并提前跳出。
注意循环条件是i < n而不是i <= n,因为任何数都能被自身整除,如果条件写成i <= n,n 除以 n 等于 1,一定会把 isprime 改成 false,所有数都会误判成非质数。小学组的质数题特别喜欢在边界做文章,n=1 时循环一次都不执行,isprime 保持 true,但 1 不是质数,正式比赛里这类特殊值通常需要额外特判。
真题第 9 题原卷程序段缺失,选项是 12、123、123456、12456,属于循环拼接字符串的考法。答题思路是逐轮写出每次 cout 拼接上去的内容,而不是直接看整体结果:第一轮输出什么、第二轮加上什么、哪一轮加了换行,写出来之后选项自然浮出水面。
5. 易错题复盘:判断题与审题失分点——最容易白丢的 5 分
初赛最后 5 道判断题,每道 1 分,分值不大,但错误率常年居高不下。原因只有一个:判断题的选项只有“正确”和“错误”,出题人把正确的概念改掉一两个词,就变成了一道陷阱题。这 5 道题全部做对靠的不是运气,而是对 C++ 每一个细节的精确记忆。
5.1 错题一:for 循环至少执行一次
错在哪:选了“正确”。
为什么错:把 do-while 循环的特性记到了 for 循环头上。do-while 是先执行一次循环体再判断条件,所以至少执行一次;for 和 while 都是先判断后执行,条件一开始不成立,循环体一次都不会跑。
怎么答对:判断题里看到“至少执行一次”,立刻反问自己这是哪种循环。只有 do-while 满足“至少一次”,看到 for 直接判断为错误,不需要犹豫。
5.2 错题二:变量不初始化,值确定
错在哪:以为 int 变量声明后默认是 0。
为什么错:局部变量不初始化,拿到的是栈上残留的随机值,这是未定义行为,编译器不保证任何确定结果。很多孩子在学校里用在线编译器跑过“不初始化也能输出 0”,就以为这是标准行为,实际上只是编译器恰好把内存清零了,换一个环境结果就不同。
怎么答对:区分场景。全局变量在静态存储区,系统自动初始化为 0;局部变量在栈上,不初始化就是不确定值。竞赛代码里所有变量都赋初值,就是为了绕开这个不可控的坑。
5.3 错题三:cin 用于输出,cout 用于输入
错在哪:记反了方向。
为什么错:把两个流对象的名字记住了,没记住它们和运算符的组合关系。cin 全称是字符输入流,cout 是字符输出流,cin 必须配>>,cout 必须配<<,组合关系是固定的。
怎么答对:看到“cin 用于输出”这种说法直接判错。再记一遍组合:cin >>是把输入流数据送进变量,cout <<是把变量数据送到输出设备,方向永远不变。
5.4 错题四:四个选项都是非法变量名
错在哪:非要从 A 到 D 四个选项里硬挑一个。
为什么错:常规单选题都是三错一对,但第 13 题故意反着出,四个选项全非法。孩子带着“必有一个正确答案”的惯性做题,就会挑一个相对顺眼的,即使内心觉得不对劲也会硬选。
怎么答对:按三条滤网逐个过滤。先看是否数字开头,排除1_cnt;再看是否含非法符号,cnt 1有空格,cnt1_#有#,@cnt有@,全部排除。过滤完发现没有合法项,就选“全部非法”。
5.5 错题五:平方数口袋里 break 和 continue 用反
错在哪:负载量超限之后用了 continue 继续循环。
为什么错:continue 的作用是跳过当次循环进入下一轮,相当于“这个数我不要了,继续看后面的数”。但题目要求是口袋里不能再装平方数时就停止,后面的数不该再看。用 continue 的话,程序会继续扫描剩余的数,逻辑和题意直接矛盾。
怎么答对:分清两个关键词的语义:continue 解决“这个数不是我想要的,看下一个”;break 解决“整个任务已经结束,循环直接停掉”。负载量超限属于整个任务的终止条件,必须用 break。
6. 备考冲刺:三步审题法与押题思路
临近初赛,与其刷一百道新题,不如练一个固定的审题流程。我把它总结成三步,每道题强制走一遍:第一步,圈出题目里所有数值范围和边界条件,比如“-50 到 50”“L 为 100”“1 到 10”,这些数字不是摆设,全是出题人埋的判断依据;第二步,标出表达式里的运算顺序,但凡出现/%*混在一起,先圈同级运算符再确定从左到右的顺序,防止被自己的直觉带走;第三步,把条件描述翻译成代码表达式,这一步是三道题里最关键的。
以温度题为例,三个步骤依次往下走就非常清晰:范围是 -50 到 50,边界是 0 度;不看温度本身,就圈出“只有一个低于 0”这个条件,用不等式翻译成异或逻辑;再验证边界:低于 0 写成a < 0,不小于 0 写成b >= 0。三个条件全部对齐之后再开始看选项,而不是拿选项一个个去猜。
至于下一届初赛的押题方向,大概率还是三个老面孔:第一个是 switch 多分支结构,小学组近年爱把它和“根据成绩输出等级”结合起来;第二个是字符处理,考 ASCII 码和字符加减,比如把小写字母转大写;第三个是双重循环里的 break 位置,考的是“内层 break 只跳出内层循环”还是“跳出整个双重循环”,这是最容易出判断陷阱的考点。这三类题现在开始各练十道,足够覆盖初赛的压轴难度。
我从带赛前训练开始,就要求每个学生做真题前先写“题目关键词”而不是直接写答案,因为能准确写出考点的孩子,基本不可能做错题。直到现在,我自己看任何一段陌生代码,也会先圈范围再列条件,这个习惯省掉的不只是失误,还有交卷后才发现审错题的后悔。希望这三个步骤和上面的真题拆解能帮到你,初赛拼的不是谁聪明,是谁更稳。
本文还有配套的精品资源,点击获取