简介:这份第二十九届厦门市小学生计算机竞赛(初赛)试卷面向备战小学信息学竞赛的学生、指导教师,以及需要检测C++编程基础的初学者,可用于熟悉初赛题型、模拟限时训练和定位知识薄弱点。包内仅含1个PDF文件,约310KB,完整呈现四大题45小题、满分100分的试卷结构,包含单项选择、填空和阅读程序填写结果等题型。目前已有386人学习下载。试题围绕信息技术概念、C++语法与变量命名、数据类型和运算符、循环与分支、数组与条件表达式、ASCII编码、进制转换、内存外存及位图存储、算法特性和软件版权等展开,并设置程序阅读与逻辑分析题,便于读者在练习中巩固竞赛基础、训练程序调试思维并查漏补缺。
1. 市级小学生 C++ 语言竞赛初赛,分数常常丢在“读程序”上
很多人准备这场小学生计算机 C++ 语言竞赛初赛,第一反应是把关键字、运算符、数据类型背一遍,觉得笔试就是考语法。真到考场上才发现,语法题只占 30 分,而且大半是送分;后面 30 分的“阅读程序填写结果”和 10 分的“完善程序”,才是真正分层的部分。它不问你懂不懂语法,而是让你按计算机的执行顺序,把一段代码从头到尾走一遍,写对每一个中间变量。
这场初赛适合四到六年级、已经写过循环和数组的孩子,也适合想弄清楚信息学竞赛入门考点边界的家长和带队老师。拿分逻辑很朴素:前 30 分靠常识速记,中间 30 分靠手算模拟,最后 10 分靠读懂一段完整算法的骨架。谁的手稳,谁的分就高。
2. 卷面地图:100 分怎么分布,90 分钟怎么切
2.1 四道大题的分值与人效
整卷 45 小题、满分 100 分、限时 90 分钟,结构非常固定:单项选择题 20 题共 30 分(1~10 题每题 1 分,11~20 题每题 2 分),填空题 10 题共 30 分(每题 3 分),阅读程序填写结果 10 题共 30 分(每题 3 分),完善程序 5 空共 10 分(每题 2 分)。
这个分值结构决定了一件事:单选的 1 分题最便宜,但也最快;阅读程序的 3 分题最贵,也最慢。很多孩子栽在“平均用力”上,把 20 分钟耗在前面的常识题里反复纠结,回头发现阅读程序只剩 15 分钟,三道 3 分的大题直接空着交卷。血泪经验是:这套卷子的性价比排序不是按题号来的,而是按“每分钟能拿几分”来的,阅读程序每题平均需要 4~6 分钟的认真推演,必须提前留出整块时间。
2.2 一个能照着走的时间表
下面这张表是按常见节奏排的,可以根据孩子平时的速度微调。核心原则是:把阅读程序放在脑子最清醒的中段,把完善程序放在最后但要留足 12 分钟以上,因为读一段完整算法需要连续思考。
| 时间段 | 做什么 | 目标 |
|---|---|---|
| 0~15 分钟 | 单选 1~20 题 | 一遍过,不会的标记后跳 |
| 15~35 分钟 | 填空 21~30 题 | 会做的先写,组合计数题放后面 |
| 35~65 分钟 | 阅读程序 31~40 题 | 每题在草稿纸上画变量表 |
| 65~82 分钟 | 完善程序 41~45 空 | 先通读整段程序再填 |
| 82~90 分钟 | 回填标记题 + 检查 | 重点查数字变换、循环边界 |
注意:单选题里凡是带“以下哪个说法不正确”的,不要一上来就找正确答案,先逐个判断真假,把确定错的那个挑出来,比正面找“不正确”快得多。填空题的答案要求也会藏在题干里,比如“两个值用空格隔开”“用空格分隔每个值”,格式写错一样扣分,这类细节每年都有人翻车。
2.3 从题型反推的送分区与拉分区
把这套卷子按知识点切一刀,会发现送分区其实很集中。单选前 5 题是信息科技常识(信息的特征、物联网、计算机技术是核心技术、导航定位应用、虚拟现实),6~10 题是纯 C++ 语法(文件后缀、取余、整除、变量命名、short 取值范围),11~14 题是知识产权、进制运算、算法特征、内存与外存的区别,15~20 题开始进入位图存储量、循环结束值、continue/break、ASCII 码数、三目运算符、悬空 else。
填空题 21~24 是进制转换和基本语句书写,25~26 是数组原地修改的模拟,27~30 是排列组合与最大公约数。阅读程序三道大题分别考复合条件的短路求值、字符大小写与数字变换、递归展开。完善程序是一道“分段使每段极差之和最小”的贪心题。
看懂这个分布就知道该往哪使劲:常识题靠平时积累,语法题靠背关键细节,真正需要动笔模拟的是 16、17、19、20、25、26、31~40、41~45 这一串。把这些题的套路练熟,及格线以上就稳了。
3. 基础题不留分:常识、语法、进制、计数四类送分题的答法
3.1 信息科技常识:五个固定的出题方向
这类题看起来杂,其实方向很固定:信息的特征、信息技术的核心技术、新技术应用归类、硬件基础、知识产权。信息的特征四个词要背死——依附性、可伪性、传递性、时效性。判断方法很简单:题目说“通过报纸、广播、电视、网络等方式传递给百姓”,关键词是“传递”,答案就是传递性;说“信息必须依附于某种载体才能存在”,就是依附性;说“过了时间就失效”,就是时效性。
新技术应用归类考的是“看到什么词想到什么技术”。手机远程开关灯、调恒温器、控制窗帘和洗衣机,关键词是“物与物联网、远程控制”,对应物联网;VR 就是虚拟现实技术;云计算对应“把计算和存储放到远端服务器”;人工智能对应“识别、学习、决策”。还有一道常考的:在现代信息处理技术中,传感技术、计算机技术、通信技术和网络技术是主导技术,其中负责存储、加工与处理信息的是计算机技术,它是信息技术的核心技术,别选成网络技术。
知识产权那道题也要留意:买了正版软件再未经许可发给别人共享,不是“资源共享”,也不是“互相帮助”,而是侵犯版权。这类题只要把“未经许可 + 复制传播”两个要素抓住,答案不会错。
3.2 文件后缀与变量命名
C++ 源代码文件的标准后缀是.cpp,选项里会放game.c(C 语言)、game.cb、game.c++来干扰。game.c++看着像那么回事,但编译器认的是.cpp、.cc、.cxx这些约定,.c++不在标准里,属于典型的“看着对、其实不对”。
变量命名那道题更简单:const是 C++ 的关键字,不能拿来当变量名;_a、my_book、hello2都是合法标识符。变量命名的三条铁律是:只能用字母、数字、下划线,不能以数字开头,不能和关键字重名。这三条能覆盖绝大多数选择题。
填空题里还会让你写完整语句,比如“定义一个字符型变量 c,并在定义时给 c 赋初始值为字符 a”,标准答案是char c='a';,注意分号、单引号、变量名一个都不能少。这种题不给步骤分,写错一个符号就是 0 分,所以平时练习就要养成一次写对的习惯,不要指望考场上“大概写写”。
3.3 整除、取余、数据范围与位图
C++ 里两个整数相除,结果自动向下取整,直接砍掉小数部分,所以9/2的结果是 4,不是 4.5,更不是 5。取余运算符%拿到的是余数,35%9就是 35 减去 3 个 9,余 8。这两个运算符是每年必考,而且经常组合出现,比如“判断整型变量 a 能被 3 整除的条件”写成a%3==0,注意是两个等号,写成一个等号就变成赋值,这条错误率极高。
数据范围要背三个数:short占 2 字节、有符号,范围是 -32768~32767,最大整数 32767;int通常是 4 字节,最大 2147483647;无符号 4 字节最大 4294967295。选项里经常把 65535 放进去钓无符号 short 的答案,看题干里有没有“无符号”三个字再下笔。
位图存储量的计算公式是:水平像素 × 垂直像素 × 每像素位数 ÷ 8,单位是字节。一张 30×20 的 32 位色位图,30×20×32 = 19200 位,除以 8 得 2400 字节。这道题最容易错在忘了除以 8,直接选 19200B。可以用下面这段代码验证一下思路,考试时不用写,但平时练一遍就记住了:
#include <iostream> using namespace std; int main() { int width = 30, height = 20; int bitsPerPixel = 32; // 32 位色,每个像素 32 bit int totalBits = width * height * bitsPerPixel; int totalBytes = totalBits / 8; // 1 字节 = 8 位,必须除 8 cout << totalBits << " bit, " << totalBytes << " B" << endl; // 输出 19200 bit, 2400 B return 0; }这里的bitsPerPixel就是题目说的“色深”,24 位色、32 位色都按这个参数改。判断要不要除以 8,只看题目问的单位是 bit 还是 Byte,问 Byte 就一定要除。
3.4 进制转换、二进制加法与 ASCII
十进制转十六进制的标准做法是除 16 取余、倒着写。以 2022 为例:2022 ÷ 16 = 126 余 6,126 ÷ 16 = 7 余 14(E),7 ÷ 16 = 0 余 7,倒着读就是 7E6。答题时大小写都算对,写成 7e6 也行,但十六进制的字母不要写成别的。
二进制加法那类题不要硬转十进制再转回去,直接按位加更稳,也可以先分别转十进制。1101011 转十进制是 64+32+8+2+1 = 107,101 是 5,相加得 112。两条路都能到答案,选自己不容易算错的那条。
ASCII 码要记住一个关键数字:标准 ASCII 用 7 位二进制表示,共 128 个字符编码。选项里会放 256(那是扩展 ASCII 或一个字节的全部组合)、64、7,只有 128 对应“7 位组合”这个前提。
3.5 计数与数论:三道题的共同套路
填空题后半段的 27~30 题,看着像四道不同的题,其实套路只有几种。
第一类是“从给定数字里组数,且满足整除条件”。用 0、2、5、8、9 组成无重复数字的四位数,能被 5 整除,求最大和最小的差。能被 5 整除意味着末位只能是 0 或 5。求最大:千位取 9,百位取 8,十位取 5,末位取 0,得 9850。求最小:千位不能是 0,取 2;百位取 0;十位要尽量小但不能和末位冲突,末位若取 5,十位取 8,得 2085。差是 7765。这类题的关键是把“末位约束”先定下来,再贪心排高位。
第二类是最大公约数。1001 和 1989,用辗转相除:1989 − 1001 = 988,1001 − 988 = 13,988 ÷ 13 = 76 整除,答案 13。手算时用减法版更不容易错,因为小学生对除法的试商还不熟。也可以拆质因数:1001 = 7×11×13,1989 = 3×3×13×17,公共因子只有 13。
第三类是排列组合。7 个人值 7 天班,甲乙都不能排在 1 日和 2 日。做法是“先排别人再插空”:其余 5 人随便排是 5! = 120 种,剩下 3 日到 7 日这 5 个位置里挑 2 个给甲、乙,并且有顺序,是 5×4 = 20 种,乘起来 2400 种。这里最容易错的是把甲乙当成无序的,少乘一个 2。
第四类是错排。5 个人重坐,至多两位坐原位,要分三种情况:0 人坐原位是错排 D5 = 44 种;恰好 1 人坐原位,是 C(5,1)×D4 = 5×9 = 45 种;恰好 2 人,是 C(5,2)×D3 = 10×2 = 20 种。加起来 109 种。这里必须记住 D3 = 2、D4 = 9、D5 = 44 这三个错排数,现场推很费时间。
3.6 十道基础题的逐题过法
拿真题练手时,建议按下面的顺序过,而不是从头做到尾。
第一步,先扫常识题,看到“传递性”“物联网”“计算机技术是核心技术”“虚拟现实”“侵犯版权”“内存存取速度快”这几个关键词就直接落笔,不要反复读题干浪费时间。内存和外存那道题问的是“内存的主要特点”,答案是存取速度快,不要选“能长期保存”,那是外存。
第二步,处理语法题,看后缀选.cpp,看关键字排除const,看取余算 8,看整除算 4,看 short 选 32767。这五道题的目标是 3 分钟内全对。
第三步,做需要算的题:二进制加法、位图存储量、ASCII 数量、三目运算符、悬空 else。三目那题w<x ? w : y<z ? y : z,先算外层条件 w<x 为真,直接取 w 的值 1,后面的嵌套根本不用看,这是三目运算符右结合加短路的典型考法,先判断最左边那个条件,能定值就停手。
第四步,把剩下的算法特征题和循环题单独拿出来。算法特征那道选“算法一定要有输入,但是可以没有输出”,因为算法允许没有输入(比如直接输出固定值),但必须有输出,这条正好说反了。
按这个顺序过,20 道单选控制在 15 分钟内,还能顺手检查一遍。
4. 阅读程序:把代码当账本,一行一行走
4.1 悬空 else:缩进会骗人,配对看最近
有一道经典题,代码长这样:
if (a < b) if (c < d) x = 1; else if (a < c) if (b < d) x = 2; else x = 3; else x = 6; else x = 7;题目给了 a=1、b=5、c=4、d=3,问 x 是多少。很多孩子看着缩进以为第 9 行的else配的是第 5 行的if (b < d),或者配的是第 4 行的else if,结果算出一堆分支。
C++ 的规则只有一条:else与它上面最近的、还没有配对的if配对。按这条规则捋一遍:第 7 行的else配第 5 行的if (b < d);第 9 行的else配第 2 行的if (c < d);第 11 行的else配第 1 行的if (a < b)。
配对清楚后代入:a<b 即 1<5 为真,进入内层;c<d 即 4<3 为假,走第 9 行的else,也就是第 4 行的else if (a < c)这条链——a<c 即 1<4 为真,进入if (b < d),b<d 即 5<3 为假,走第 7 行的else,x=3。答案是 3。
这类题的正确做法不是看缩进,而是拿笔在每个if旁边标序号,再给每个else连线到最近的未配对if。画完配对图,剩下的就是纯代入。
4.2 循环结束后 i 是几
for(i=0;i<10;i++)这个循环结束后 i 的值是多少?很多人脱口而出 9。正确答案是 10。原因是循环的执行顺序:判断条件 → 执行循环体 → 执行i++→ 再判断条件。当 i=9 时条件 9<10 成立,执行完循环体后 i 变成 10,再判断 10<10 不成立,退出。退出时 i 已经是 10,这个值不会退回 9。
这条规律可以推广:for(i=a;i<b;i++)结束后 i 一定等于 b(前提是循环体里没有改 i)。如果循环体里有break,那就要看 break 执行时 i 的值,不能用这条规律。
再看一道更阴的 while 题:
int k = 0; while (k < 10) { if (k < 1) continue; // k=0 时命中,直接回到条件判断 if (k == 4) break; k++; }问循环次数。k 初始为 0,进入循环后第一个if (k < 1)成立,执行continue,而continue的作用是跳过本轮剩下的语句、直接回到循环条件
本文还有配套的精品资源,点击获取