
简介本资源为第二十九届厦门市小学生计算机C语言竞赛初赛试卷面向备战小学信息学竞赛的学生、指导教师及家长可用于赛前模拟自测与知识点查漏补缺。试卷内容覆盖信息技术概念、C语法基础、算法特性、数据结构、硬件存储计算、进制转换、ASCII编码、程序流程控制与知识产权意识等模块题型包含单项选择、填空与阅读程序填写结果能较完整地检验逻辑思维与编程应用能力。资源包共1个文件为pdf格式大小约310KB便于打印练习或在线查阅。目前已有385人学习下载读者可借助这份真题熟悉竞赛命题风格与难度分布梳理C易错点如运算符优先级、循环边界、条件表达式嵌套及位图存储空间计算等从而有针对性地安排复习计划提升应试与算法分析水平。1. 从一份小学 C 初赛卷看信息学选拔的真实门槛带过几届信息学兴趣班之后我越来越不敢小看任何一份小学组的初赛卷。前阵子把一份小学生计算机 C 语言竞赛的初赛试卷从头到尾做了一遍做完最大的感受是它考的根本不是会不会写代码而是能不能像计算机一样思考。整份卷子 45 道题、满分 100 分、限时 90 分钟四大题型——单选、填空、阅读程序写结果、完善程序覆盖了信息技术常识、C 语法细节、进制转换、位运算、递归、贪心、排列组合甚至还有知识产权意识。对刚接触编程的孩子来说这是一次完整的计算思维体检对教练和家长来说它是一份极好的能力地图能清楚看到孩子卡在哪一层。下面我就按这份卷子的真实结构拆一拆每类题到底在考什么、怎么练、坑在哪。2. 选择题里的信息技术常识别把它当送分题2.1 信息特征与信息技术四大支柱选择题前 5 题看起来是常识题但每年都有孩子在这里翻车。第 1 题考信息的特征——依附性、可伪性、传递性、时效性题干描述通过报纸、广播、电视、网络传递给寻常百姓核心落在传递二字上答案是传递性。这类题的坑在于孩子容易凭感觉选时效性因为新闻确实有时效但题干强调的是传递方式多样不是信息会过时。第 2 题考智能家居手机开关灯、调恒温器、控制洗衣机这是典型的物联网应用。第 3 题问信息处理技术中哪一项是存储、加工与处理信息的核心技术答案是计算机技术。第 4 题北斗系统属于导航定位应用。第 5 题 VR 就是虚拟现实技术。这五道题串起来其实是在考一个知识框架信息有什么特征、信息技术由传感/计算机/通信/网络四大技术支撑、每项技术对应什么现实应用。我一般会让孩子用一张表把这几个概念钉死概念关键词典型应用信息传递性多途径传播新闻通过报纸/网络扩散物联网设备互联手机控制家电计算机技术存储加工处理信息技术的核心导航定位卫星系统北斗、GPS虚拟现实沉浸式模拟VR 头显这张表不是为了背而是让孩子建立看到应用能反推技术类别的条件反射。练法很简单每天找一个身边的智能设备问自己它背后是哪项技术在支撑坚持两周这类题基本不会再错。2.2 C 语法细节文件命名、运算符与变量规范第 6 到第 10 题是纯 C 语法但每道都埋了坑。第 6 题问哪个源文件命名正确选项里有game.c、game.cbb、game.c、game.cpp答案是game.cpp。这里要让孩子记住C 源文件的标准扩展名是.cpp.c是 C 语言的.c虽然某些编译器认但不是规范写法。第 7 题35 % 9取余运算35 除以 9 商 3 余 8答案是 8。第 8 题9 / 2两个整数相除结果取整为 4不是 4.5。这两题放一起考就是要孩子分清整数除法和取余的区别——这是后面所有算法题的基础很多孩子写二分查找时mid (left right) / 2出问题根源就在这里。第 9 题变量命名const是关键字不能做变量名_a、my_book、hello2都合法。第 10 题short类型最大整数16 位有符号整型范围是 -32768 到 32767答案是 32767。这里有个记忆技巧short是 2 字节int通常 4 字节2^15 - 1 327672^31 - 1 2147483647。// 验证整数运算的几个关键点 #include iostream using namespace std; int main() { cout 35 % 9 endl; // 输出 8取余 cout 9 / 2 endl; // 输出 4整数除法截断 cout 9.0 / 2 endl; // 输出 4.5浮点除法 short s 32767; cout s endl; // 输出 32767short 上限 // s 32768; // 溢出会变成 -32768这是常见坑 return 0; }这段代码建议让孩子亲手跑一遍尤其是把short赋值为 32768 看会发生什么——溢出变成负数这个翻车体验比讲十遍原理都管用。2.3 进制转换、位图存储与算法特性第 11 题考版权意识未经许可把正版软件发给他人属于侵犯版权。第 12 题是二进制加法1101011 101先对齐位数1101011是 107101是 5加起来 112答案是 112。也可以直接二进制相加1101011 0000101 1110000转十进制是 112。第 13 题考算法特性问哪个描述不正确。选项 C 说算法一定要有输入但是可以没有输出——这是错的算法可以没有输入但必须有输出。这个知识点几乎每年都考孩子容易记反。第 14 题内存和外存对比内存的主要特点是存取速度快。第 15 题位图存储计算30×20 像素、32 位色总空间 30 × 20 × 32 / 8 2400 字节。这里要注意除以 8 把位转成字节很多孩子忘了这一步。第 16 题for(i0; i10; i)循环结束后 i 的值是 10因为循环条件是i10当 i10 时退出。第 17 题是个经典陷阱int k 0; while (k 10) { if (k 1) continue; // k0 时死循环 if (k 4) break; k; }k0 时进入循环k1成立执行continue跳回条件判断k 还是 0永远出不去所以是死循环。这道题考的是continue和循环变量更新的关系是初学者最容易踩的坑之一。第 18 题标准 ASCII 码用 7 位二进制表示 128 种字符。第 19 题条件表达式嵌套wx ? w : yz ? y : zw1、x2wx为真取 w1答案是 1。第 20 题是悬空 else 问题需要按就近匹配原则分析最终 x6。3. 填空题从语法填空到数组模拟的硬功夫3.1 进制转换与基础语法填空填空题 21 到 24 题是基础语法。第 21 题十进制 2022 转十六进制2022 ÷ 16 126 余 6126 ÷ 16 7 余 14E7 ÷ 16 0 余 7从下往上读是 7E6。第 22 题判断 a 能被 3 整除条件是a % 3 0。第 23 题定义字符变量并赋初值完整语句是char c a;。第 24 题是个经典陷阱int x 1, y 6; x y; // x 变成 6 y x; // y 变成 6不是 1执行后 x6、y6。很多孩子以为yx会拿到原来的 1但此时 x 已经被覆盖成 6 了。这道题考的是赋值语句的执行顺序是理解变量盒子模型的关键。3.2 数组模拟循环边界与元素更新第 25、26 题是整份卷子里最能拉开差距的题。给定int x 3, y 6; int a[] {2, 4, 3, 7, 8, 9, 1, 10}; int b[] {9, 3, 2, 6, 3, 1, 8, 10, 2, 3};第 25 题执行for(int i0; ix; i) { a[xi] * b[yi]; }。i 从 0 到 3操作的是 a[3] 到 a[6]分别乘以 b[6] 到 b[9]。a[3]7×856a[4]8×1080a[5]9×218a[6]1×33。最终数组是2 4 3 56 80 18 3 10。第 26 题执行for(int i0; iy; i) { if(a[i]%x) a[i]a[i1]; }。注意这里 a 数组已经被第 25 题修改过了但题目说每小题运行前已经重新赋为下列的值所以用原始数组。i 从 0 到 6判断 a[i] 能否被 3 整除不能整除就用后一个元素覆盖。a[0]2 不能整除变成 a[1]4a[1]4 不能整除变成 a[2]3a[2]3 能整除不变a[3]7 不能整除变成 a[4]8a[4]8 不能整除变成 a[5]9a[5]9 能整除不变a[6]1 不能整除变成 a[7]10。最终是4 3 3 8 9 9 10 10。这类题我一般让孩子用手写模拟法画一张表格每列是 i、a[i]、判断结果、更新后的值一步步填。慢是慢但能建立对数组下标和循环边界的肌肉记忆。3.3 排列组合与数论最大公约数与错位排列第 27 题用 0、2、5、8、9 组成无重复数字的四位数能被 5 整除的最大和最小数之差。能被 5 整除末位必须是 0 或 5。最大数高位尽量大9850最小数首位不能是 02050不对2050 用了 0 两次。最小是 2085检查2、0、8、5末位 5可以。但还能更小吗2058 末位 8 不行。所以最小是 2085。差是 9850 - 2085 7765。第 28 题求 1001 和 1989 的最大公约数用辗转相除法1989 ÷ 1001 1 余 9881001 ÷ 988 1 余 13988 ÷ 13 76 余 0所以最大公约数是 13。第 29 题安排 7 人值班甲乙不能在 10 月 1 日和 2 日。先排甲乙从 3 到 7 日选两天有 5×420 种剩下 5 人排剩下 5 天5!120 种总共 20×1202400 种。第 30 题五位同学重新坐至多两位坐原位。用容斥原理总排列 5!120减去至少 3 人坐原位的情况。恰好 3 人坐原位C(5,3)×110恰好 4 人C(5,4)×15恰好 5 人1。所以至少 3 人坐原位是 105116至多两位是 120-16104但答案是 109。让我重新算恰好 3 人坐原位剩下 2 人必须都不坐原位只有 1 种互换所以是 C(5,3)×110恰好 4 人坐原位不可能因为剩下 1 人只能坐原位恰好 5 人 1 种。所以至少 3 人是 10111120-11109。对答案是 109。4. 阅读程序写结果递归、字符串与条件分支的实战4.1 条件分支与逻辑运算符优先级程序一是一段条件判断代码#include iostream using namespace std; int main() { int a, x, y, ok1, ok2; a 100; cin x y ok1 ok2; if ((x y) || ((y ! 20) (ok1 0)) (ok2 ! 0)) a 1; else if ((ok1 ! 0) (ok2 0)) a -1; else a 0; cout a endl; return 0; }三组输入分别是20 20 50 30、20 50 10 20、0 0 0 0。第一组x20、y20xy为假y!20为假整个为假ok1!0为真且ok20为假所以走 elsea0。第二组x20、y50xy假y!20真ok10假假ok1!0真且ok20假走 elsea0。第三组x0、y0xy假y!20真ok10真ok2!0假假ok1!0假走 elsea0。所以答案是 0、0、0但参考答案是 -1、1、0。让我重新看第三组输入0 0 0 0ok10、ok20ok1!0假走 elsea0。第二组20 50 10 20ok110、ok220ok1!0真但ok20假走 elsea0。第一组20 20 50 30ok150、ok230ok1!0真但ok20假走 elsea0。但参考答案是 -1、1、0说明我对应错了输入顺序。重新看题号第 1 题输入20 20 50 30第 2 题20 50 10 20第 3 题0 0 0 0。参考答案 -1、1、0。那第一组x20、y20、ok150、ok230xy假y!20假整个条件假ok1!0真且ok20假走 elsea0不是 -1。这里我可能看错了输入对应关系实际考试中这类题必须逐行代入不能凭感觉。4.2 字符串变换与 ASCII 码操作程序二是一段字符串大小写互换加数字偏移的代码#include iostream #include string using namespace std; int main() { string str; cin str; for (int i 0; i str.length(); i) { if (str[i] a str[i] z) str[i] (str[i] - a) A; else if (str[i] A str[i] Z) str[i] (str[i] - A) a; else if (str[i] 0 str[i] 9) str[i] (str[i] - 0 3) % 10 0; } cout str endl; return 0; }输入TheseN921296逐字符处理T→th→He→Es→Se→EN→n9→(93)%1022→51→42→5 不变9→26→9。结果是tHESEn254529。参考答案是tHESEn25和4529不对参考答案第 34 题是tHESEn25第 35 题是4529说明输入被分成了两个测试用例。实际考试中每个输入独立处理。输入This is a pen.处理空格和句号不变结果是tHIS IS A PEN.。参考答案第 37 题是tHIS IS A PEN.第 36 题是4529对应另一个输入。这类题的关键是ASCII 码操作要记牢a是 97、A是 65、0是 48大小写转换就是加减 32。数字偏移(x - 0 3) % 10 0是循环移位的标准写法要让孩子理解为什么先减0再取模再加0。4.3 递归函数与调用栈分析程序三是一个递归函数int fun(int x) { if (x 0 || x 1) return 3; else return x fun(x - 2); }输入 1返回 3。输入 33 fun(1) 3 3 6。输入 99 fun(7) 9 7 fun(5) 9 7 5 fun(3) 9 7 5 3 fun(1) 9 7 5 3 3 27。参考答案是 3、6、27对应输入 1、3、9。递归题我一般让孩子画调用树每层写清楚参数和返回值从叶子往上加。这样既能算对又能理解递归的递和归两个阶段。5. 完善程序贪心分段问题的五个空怎么填5.1 题目模型与贪心策略推导完善程序题给定一个长度为 n 的升序序列分成 k 段每段价值是最大值减最小值要求总价值最小。因为序列已经升序每段的价值就是段内最后一个元素减第一个元素。要让总价值最小等价于在 n-1 个相邻差值中选 k-1 个最大的差值作为断点这样每段内部差值之和最小。这个思路是典型的贪心把相邻元素的差值算出来排序去掉最大的 k-1 个剩下的差值之和就是答案。如果 nk每段只有一个元素价值为 0。如果 k1只有一段价值就是 a[n]-a[1]。5.2 五个空位的逐项分析与验证#include bits/stdc.h using namespace std; const int N 3e5 5; int n, k, sum, a[N], b[N]; int main() { scanf(%d%d, n, k); for (int i 1; i n; i) scanf(%d, a[i]); for (int i 1; i n; i) b[i] ①; if (②) printf(0\n); else if (k 1) ③ else { sort(b 1, b n); sum 0; for (int i 1; i ④; i) ⑤ printf(%d\n, sum); } return 0; }第①空b[i] 存相邻差值a[i1]-a[i]选 B。第②空nk 时每段一个元素价值 0选 C。第③空k1 时输出 a[n]-a[1]选 B。第④空排序后 b 数组有 n-1 个元素要去掉最大的 k-1 个剩下 n-k 个循环到 n-k选 A。第⑤空累加剩下的差值sum sum b[i]选 D。参考答案是 B、C、B、A、D和我推导的一致。这道题的关键是理解去掉最大差值这个贪心策略以及排序后取前 n-k 个的边界。提示完善程序题不要一上来就填先把题目模型翻译成我要做什么再对照代码看每个变量在干什么最后逐空验证。6. 从这份卷子提炼的备赛路径与验证方法把这份卷子拆完我最大的体会是小学组初赛的难点不在代码量而在精确理解。一道continue死循环题、一道赋值顺序题、一道悬空 else 题就能把没真正理解语义的孩子筛出来。备赛时我一般让孩子按这个顺序走第一轮把选择题和填空题当概念体检错哪补哪尤其是进制转换、ASCII、整数运算这三块必须做到不假思索。第二轮阅读程序题限时做每道题先自己算再上机跑一遍验证把手算结果和机器结果对不上的地方标红那就是理解偏差。第三轮完善程序题先自己想算法再对照选项重点看边界条件——nk、k1 这种特判往往是得分点。验证方法很简单把卷子里的每段程序都敲进编译器跑一遍输入用题目给的测试数据输出和参考答案对。对不上的不要急着看答案先自己单步调试看变量在哪一步偏离了预期。这个手算—上机—对拍的循环比刷十套卷子都管用。从那以后我每次带学生做卷子都强制走一遍手算先行、上机验证、错题归因的流程再也不敢让他们只对答案了。希望帮到你。本文还有配套的精品资源点击获取