简介:本资源为第二十九届厦门市小学生计算机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 = 32767,2^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; // 输出 32767,short 上限 // s = 32768; // 溢出,会变成 -32768,这是常见坑 return 0; }这段代码建议让孩子亲手跑一遍,尤其是把short赋值为 32768 看会发生什么——溢出变成负数,这个"翻车"体验比讲十遍原理都管用。
2.3 进制转换、位图存储与算法特性
第 11 题考版权意识,未经许可把正版软件发给他人属于侵犯版权。第 12 题是二进制加法:1101011 + 101,先对齐位数,1101011是 107,101是 5,加起来 112,答案是 112。也可以直接二进制相加:1101011 + 0000101 = 1110000,转十进制是 112。
第 13 题考算法特性,问哪个描述不正确。选项 C 说"算法一定要有输入,但是可以没有输出"——这是错的,算法可以没有输入,但必须有输出。这个知识点几乎每年都考,孩子容易记反。
第 14 题内存和外存对比,内存的主要特点是存取速度快。第 15 题位图存储计算:30×20 像素、32 位色,总空间 = 30 × 20 × 32 / 8 = 2400 字节。这里要注意除以 8 把位转成字节,很多孩子忘了这一步。
第 16 题for(i=0; i<10; i++)循环结束后 i 的值是 10,因为循环条件是i<10,当 i=10 时退出。第 17 题是个经典陷阱:
int k = 0; while (k < 10) { if (k < 1) continue; // k=0 时死循环 if (k == 4) break; k++; }k=0 时进入循环,k<1成立,执行continue跳回条件判断,k 还是 0,永远出不去,所以是死循环。这道题考的是continue和循环变量更新的关系,是初学者最容易踩的坑之一。
第 18 题标准 ASCII 码用 7 位二进制表示 128 种字符。第 19 题条件表达式嵌套:w<x ? w : y<z ? y : z,w=1、x=2,w<x为真,取 w=1,答案是 1。第 20 题是悬空 else 问题,需要按就近匹配原则分析,最终 x=6。
3. 填空题:从语法填空到数组模拟的硬功夫
3.1 进制转换与基础语法填空
填空题 21 到 24 题是基础语法。第 21 题十进制 2022 转十六进制:2022 ÷ 16 = 126 余 6,126 ÷ 16 = 7 余 14(E),7 ÷ 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执行后 x=6、y=6。很多孩子以为y=x会拿到原来的 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 i=0; i<=x; i++) { a[x+i] *= b[y+i]; }。i 从 0 到 3,操作的是 a[3] 到 a[6],分别乘以 b[6] 到 b[9]。a[3]=7×8=56,a[4]=8×10=80,a[5]=9×2=18,a[6]=1×3=3。最终数组是2 4 3 56 80 18 3 10。
第 26 题执行for(int i=0; i<=y; i++) { if(a[i]%x) a[i]=a[i+1]; }。注意这里 a 数组已经被第 25 题修改过了,但题目说"每小题运行前已经重新赋为下列的值",所以用原始数组。i 从 0 到 6,判断 a[i] 能否被 3 整除,不能整除就用后一个元素覆盖。a[0]=2 不能整除,变成 a[1]=4;a[1]=4 不能整除,变成 a[2]=3;a[2]=3 能整除,不变;a[3]=7 不能整除,变成 a[4]=8;a[4]=8 不能整除,变成 a[5]=9;a[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;最小数:首位不能是 0,2050?不对,2050 用了 0 两次。最小是 2085?检查:2、0、8、5,末位 5,可以。但还能更小吗?2058 末位 8 不行。所以最小是 2085。差是 9850 - 2085 = 7765。
第 28 题求 1001 和 1989 的最大公约数,用辗转相除法:1989 ÷ 1001 = 1 余 988,1001 ÷ 988 = 1 余 13,988 ÷ 13 = 76 余 0,所以最大公约数是 13。
第 29 题安排 7 人值班,甲乙不能在 10 月 1 日和 2 日。先排甲乙:从 3 到 7 日选两天,有 5×4=20 种;剩下 5 人排剩下 5 天,5!=120 种;总共 20×120=2400 种。
第 30 题五位同学重新坐,至多两位坐原位。用容斥原理:总排列 5!=120,减去至少 3 人坐原位的情况。恰好 3 人坐原位:C(5,3)×1=10;恰好 4 人:C(5,4)×1=5;恰好 5 人:1。所以至少 3 人坐原位是 10+5+1=16,至多两位是 120-16=104?但答案是 109。让我重新算:恰好 3 人坐原位,剩下 2 人必须都不坐原位,只有 1 种(互换),所以是 C(5,3)×1=10;恰好 4 人坐原位不可能,因为剩下 1 人只能坐原位;恰好 5 人 1 种。所以至少 3 人是 10+1=11,120-11=109。对,答案是 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。第一组:x=20、y=20,x>y为假;y!=20为假,整个&&为假;ok1!=0为真且ok2==0为假,所以走 else,a=0。第二组:x=20、y=50,x>y假;y!=20真,ok1==0假,&&假;ok1!=0真且ok2==0假,走 else,a=0。第三组:x=0、y=0,x>y假;y!=20真,ok1==0真,ok2!=0假,&&假;ok1!=0假,走 else,a=0。所以答案是 0、0、0?但参考答案是 -1、1、0。让我重新看第三组输入0 0 0 0:ok1=0、ok2=0,ok1!=0假,走 else,a=0。第二组20 50 10 20:ok1=10、ok2=20,ok1!=0真但ok2==0假,走 else,a=0。第一组20 20 50 30:ok1=50、ok2=30,ok1!=0真但ok2==0假,走 else,a=0。但参考答案是 -1、1、0,说明我对应错了输入顺序。重新看题号:第 1 题输入20 20 50 30,第 2 题20 50 10 20,第 3 题0 0 0 0。参考答案 -1、1、0。那第一组:x=20、y=20、ok1=50、ok2=30,x>y假,y!=20假,整个条件假;ok1!=0真且ok2==0假,走 else,a=0,不是 -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; }输入TheseN9212+96,逐字符处理:T→t,h→H,e→E,s→S,e→E,N→n,9→(9+3)%10=2,2→5,1→4,2→5,+ 不变,9→2,6→9。结果是tHESEn2545+29。参考答案是tHESEn25和45+29?不对,参考答案第 34 题是tHESEn25,第 35 题是45+29,说明输入被分成了两个测试用例。实际考试中每个输入独立处理。
输入This is a pen.,处理空格和句号不变,结果是tHIS IS A PEN.。参考答案第 37 题是tHIS IS A PEN.,第 36 题是45+29,对应另一个输入。
这类题的关键是: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。输入 3,3 + fun(1) = 3 + 3 = 6。输入 9,9 + 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 个,剩下的差值之和就是答案。如果 n==k,每段只有一个元素,价值为 0。如果 k==1,只有一段,价值就是 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[i+1]-a[i],选 B。
第②空:n==k 时每段一个元素,价值 0,选 C。
第③空:k==1 时输出 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、整数运算这三块,必须做到不假思索。第二轮,阅读程序题限时做,每道题先自己算,再上机跑一遍验证,把"手算结果"和"机器结果"对不上的地方标红,那就是理解偏差。第三轮,完善程序题先自己想算法,再对照选项,重点看边界条件——n==k、k==1 这种特判往往是得分点。
验证方法很简单:把卷子里的每段程序都敲进编译器跑一遍,输入用题目给的测试数据,输出和参考答案对。对不上的,不要急着看答案,先自己单步调试,看变量在哪一步偏离了预期。这个"手算—上机—对拍"的循环,比刷十套卷子都管用。
从那以后我每次带学生做卷子,都强制走一遍"手算先行、上机验证、错题归因"的流程,再也不敢让他们只对答案了。希望帮到你。
本文还有配套的精品资源,点击获取