☰
C++竞赛初赛45题90分钟:语法常识、进制计算与程序阅读拿分法
2026/11/3 3:31:22 网站建设 项目流程

简介:这份试卷面向准备参加厦门市小学生计算机C++语言竞赛的选手及信息学辅导教师,可用于初赛自测、考点梳理与课堂练习。内容为第二十九届厦门市小学生计算机C语言竞赛初赛真题,满分100分、限时90分钟、共四大题45小题,覆盖信息技术概念、物联网与北斗导航应用、C++语法与变量命名、运算符与整除取模、short存储范围、内存与外存、位图存储计算、ASCII编码、进制转换、算法特性、分支与循环流程控制及程序阅读推理等考点,并穿插软件版权与知识产权意识。压缩包共1个pdf文件,约310KB,便于打印或电子作答。已有386人学习下载。读者可据此还原赛题结构与题型分布,逐题复盘答题思路,定位语法细节、逻辑判断与算法理解上的薄弱环节,也可作为教师组卷与讲评的参考素材。

1. 90 分钟 45 题:写得出代码的孩子为什么卡在初赛前 30 分

很多人把 C++ 竞赛初赛当成编程能力的筛选,翻开这份 45 小题、满分 100 分、限时 90 分钟的卷子会发现:真正要写完整程序的只有最后 5 个空、共 10 分,其余 90 分全在考“读”和“算”。单选题 20 道占 30 分(前 10 题每题 1 分,后 10 题每题 2 分),填空题 10 道占 30 分,阅读程序 10 个空占 30 分,完善程序 5 个空只占 10 分。会敲代码但不会手算进制、不会盯循环变量的人,恰恰在这 90 分上翻车。这份初赛真题的考点分布非常稳定:信息技术常识、C++ 语法细节、进制与存储计算、程序跟踪阅读。它适合已经学过变量、分支、循环,准备第一次上场的小学生。拿分顺序也由此确定:先把单选和填空的固定套路背到条件反射,再练阅读程序的跟踪方法,最后才碰那 10 分的完善程序。

2. 单选前 10 题:信息技术常识与 C++ 语法的送分区怎么拿稳

前 10 题每题只有 1 分,但它是整张卷子里最不该丢的 10 分。出题人在这里放的几乎都是“背过就会、没背过就猜”的题:信息特征、物联网、VR、源文件后缀、取模整除、变量命名、short 范围、ASCII 字符数。它们的共同点是答案唯一、推理链极短,考的是记忆的精确度而不是思维深度。这一章把这 10 分拆成五组,每组给出判断口径和容易记混的地方,读完可以直接当清单背。

2.1 信息四个特征:依附、可伪、传递、时效怎么分

真题第 1 题给的是一个很生活化的场景:同一条消息通过报纸、广播、电视、网络传到普通人手里,问体现了信息的哪个特征,答案是传递性。这类题的坑在于四个选项都“像”,必须靠题干动词来定位。判断口径可以压成一张小表:

特征题干常见说法落点
依附性信息必须借助文字、声音、图像等载体才能存在强调“载体”
可伪性信息可以被加工、篡改、伪造强调“真假”
传递性通过某种方式从一方传到另一方强调“从……到……”
时效性过了某个时间点就失去价值强调“过期”

答题时不要先看选项,先在题干里找动词。“通过报纸、广播、电视、网络等方式传递给百姓”,动词是“传递”,落点就在传递性,一秒选定。反过来,如果题干说“同一份资料存在硬盘里是文件、打印出来是纸”,那是依附性;说“天气预报昨天的数据今天参考价值下降”,那是时效性。

提示:四个特征里最容易混的是依附性和传递性。记住一句话——依附性讲“靠什么活着”,传递性讲“从谁到谁”,两条线不重叠。

2.2 物联网、云计算、VR、人工智能:四个场景一句话区分

这一组每年必考一到两题,形式是给一个生活场景问属于哪项技术。真题里手机远程开关灯、调恒温器、开关窗帘、控制洗衣机,答案是物联网;头戴设备进入虚拟场景是 VR;海量算力按需取用是云计算;让机器识别、判断、学习是人工智能。区分口径如下:

场景关键词对应技术一句话依据
手机远程控制家电、传感器联网物联网物与物联网、远程操控
数据放到远端服务器处理、按需取用云计算算力像水电一样取用
头显、沉浸式场景、模拟环境虚拟现实造一个假的“现场”
识别、推荐、自动驾驶决策人工智能机器替代人的判断

同一组里还有一道“核心技术”题:传感技术、计算机技术、通信技术、网络技术四项中,承担存储、加工与处理信息的是计算机技术,所以它才是信息技术的核心技术。这道题的记忆点是“处理”二字——传感负责采集,通信和网络负责搬运,只有计算机负责加工。

还有一类是应用领域题:题干给出某导航系统建成、提供服务,问属于哪个方向的应用,答案是导航定位。只要题干里出现定位、授时、路径规划,就往导航定位上靠,不要被区块链、搜索引擎、数据挖掘这些看起来更“高级”的选项带走。

2.3 C++ 源文件与变量命名:三条硬规则记死

真题第 6 题问 C++ 源代码文件命名哪个正确,四个选项里只有 .cpp 是标准答案。这条要连着记:.c 是 C 语言源文件,.c++ 不是通用后缀,.cb 什么都不是。考场上一秒钟选出 .cpp,把时间留给后面的计算题。

变量命名考的是同一条规则的四条边界:只能用字母、数字、下划线;不能以数字开头;不能是关键字;区分大小写。真题给的四个选项里,const 是关键字,直接出局,其余 _a、my_book、hello2 都合法。下面这段代码把合法与非法的写法摆在一起,背的时候连注释一起看:

int _a = 1; // 合法:下划线开头,常见于竞赛代码 int my_book = 2; // 合法:下划线分隔,可读性好 int hello2 = 3; // 合法:数字可以出现,但不能打头 // int 2hello = 4; // 非法:数字开头 // int const = 5; // 非法:const 是关键字,不能当名字 // int my-book = 6; // 非法:减号不是合法字符

这段代码不需要运行,它的作用是让命名的四条边界同时出现在视野里。竞赛里真正会踩的坑是第三条的变体:有人用 int、double、for 之外的词当变量名,看着不像关键字,其实是标准库里的名字(比如 count、time),在 using namespace std 的环境下会冲突。稳妥做法是变量名加前缀或下划线,别用常见英文单词裸奔。

2.4 取模与整除:35%9 和 9/2 的答案为什么不是小数

这两个运算符是初赛的常客,也是从数学思维切到编程思维的第一道坎。真题里 35%9 的答案是 8,9/2 的答案是 4,两个都有人选成小数,原因是用数学的除法直觉去推程序的整数运算。

#include <iostream> using namespace std; int main() { cout << 35 % 9 << endl; // 8:35 = 9 * 3 + 8,取余数 cout << 9 / 2 << endl; // 4:两个整数相除,结果向零截断 cout << 9.0 / 2 << endl; // 4.5:只要有一个是浮点数,就做浮点除法 cout << -35 % 9 << endl; // -8:负数取模,符号跟随被除数 return 0; }

四行输出对应四个必须记住的规则:百分号取的是余数,不是商;整数除整数,小数部分直接砍掉而不是四舍五入;想要小数,至少让一个操作数变成浮点(写 9.0 或 1.0*9);负数取模的结果符号跟着左边的数走。第三行是很多人的思维盲区——他们以为 9/2 会自动变成 4.5,实际是 4。参数上再补一句:% 两侧只能是整数,写成 35.0 % 9 编译就过不去。

2.5 short 与 ASCII:两个必须背死的数字

真题第 10 题问 short 能存的最大整数,答案是 32767。这个数字来自 2 字节 16 位:有符号时范围是 -32768 到 32767,无符号时是 0 到 65535。选项里 65535 就是给“忘了有符号”的人准备的陷阱,2147483647 是 int 的上限,4294967295 是 unsigned int 的上限。

类型字节范围
short2-32768 ~ 32767
unsigned short20 ~ 65535
int4约 -21 亿 ~ 21 亿
unsigned int40 ~ 约 42 亿
char1-128 ~ 127

ASCII 那一题问的是标准 ASCII 用二进制组合表示多少个字符,答案是 128。记忆点:标准 ASCII 用 7 位,2 的 7 次方是 128;扩展到 8 位才是 256。题目里如果出现“标准 ASCII”“美国信息交换标准码”这几个字,就是 128,不要被 256 带跑。

3. 单选后 10 题加填空:进制、位图、算法特性这三类计算怎么算对

从第 11 题开始每题 2 分,难度随之上来,考的是手算能力:二进制加法、十六进制转换、位图存储、算法特性、三目运算符、最大公约数、排列组合。这一段的分数最“实”——会算就是会算,不会算蒙不出来。填空题 10 道共 30 分,其中前几道是语法填空(整除条件、字符变量定义、赋值顺序),后几道是纯手算。把这一章的方法走熟,40 分基本能稳住。

3.1 二进制加法与十六进制转换:竖式和除 16 取余

真题第 12 题是二进制 1101011 加 101,四个选项都是十进制,所以要先加再转。最稳的做法是竖式右对齐,短的那个前面补零:

1101011 + 0000101 --------- 1110000

从右往左逐位加,满二进一,得到 1110000,转十进制是 64+32+16=112。想验算可以分开转:1101011 是 107,101 是 5,107+5=112,两条路对上就放心填。

十六进制转换那道填空是十进制 2022 转十六进制,答案是 7E6。手算用除 16 取余、倒着读:2022 ÷ 16 = 126 余 6;126 ÷ 16 = 7 余 14(十六进制写作 E);7 ÷ 16 = 0 余 7;从最后一个余数往上读,7E6。考场上如果怕算错,用下面这段代码在脑子里过一遍结构:

#include <cstdio> int main() { int n = 2022; printf("%X\n", n); // 7E6,%X 输出大写十六进制 printf("%o\n", n); // 3746,顺手记住八进制用 %o return 0; }

%X 输出大写、%x 输出小写,答卷上写 7E6 或 7e6 都算对。这类题的错误集中在两处:余数 10 到 15 忘了换成 A 到 F;倒读时顺序反了。养成“算完从下往上抄一遍”的习惯,比检查三遍都管用。

3.2 位图存储计算:像素数乘位深再除 8

真题第 15 题:一张水平 30 像素、垂直 20 像素、32 位色的位图,存储图像信息需要多少空间。算法只有一条公式——字节数 = 宽 × 高 × 位深 ÷ 8。代入:30 × 20 × 32 = 19200 位,除以 8 得 2400 字节。选项里 19200B 就是留给“忘了除 8”的人,2400B 才是对的。

换个算法验算:32 位色等于每个像素 4 字节,30 × 20 = 600 个像素,600 × 4 = 2400 字节,两条路一致。位深和颜色的换算要一起背:黑白图 1 位,16 色 4 位,256 色 8 位,16 位色 65536 色,24 位真彩色约 1677 万色。题目如果给的是“256 色位图”,位深就填 8,别看到“色”字就写 256。

注意:单位换算只在题目问 KB 或 MB 时才做,2400B 约等于 2.34KB。真题问的是 B,直接写 2400,多除一次 1024 反而错。

3.3 算法的五个特性:为什么“可以没有输出”一定错

真题第 13 题问关于算法描述不正确的是哪一项,答案是“算法一定要有输入,但是可以没有输出”。这句话前后两半一对一错:输入可以是 0 个或多个(比如打印固定图形不需要输入),输出必须有至少一个,否则这个算法做了什么都无法体现。

五个特性整理成一句口诀:有穷、确定、可行、零入、必出。有穷性指有限步之内结束;确定性指每一步定义明确、不能有二义;可行性指每一步都能分解成可执行的基本操作;输入零个或多个;输出至少一个。补充一个常考的对比:算法一定有穷,程序可以无穷(操作系统就是死循环跑着)。题目里如果出现“程序就是算法”这种说法,直接判错。

3.4 三目运算符与悬空 else:两道必须画缩进的题

第 19 题:w=1、x=2、y=3、z=4,求 w<x ? w : y<z ? y : z 的值。三目运算符是右结合的,加括号后是 w<x ? w : (y<z ? y : z)。w<x 即 1<2 成立,直接取 w,答案是 1。很多人从右往左先算 y<z 得 3,再看外层,就会选错。

第 20 题更典型,题干直接说“写程序不注意格式规范,自己也看不清逻辑”,考的是 else 的就近匹配。这种题只有一个解法:把原代码按缩进还原。

// 原题条件:a=1, b=5, c=4, d=3 if (a < b) { // 1 < 5 成立,进入 if (c < d) { // 4 < 3 不成立 x = 1; } else if (a < c) { // 1 < 4 成立,进入这一支 if (b < d) { // 5 < 3 不成立 x = 2; } else { x = 3; // 落到这里 } } else { x = 6; } } else { x = 7; }

还原之后答案 x=3 一目了然。规则只有一条:else 永远和它上面最近的、还没配对的 if 配对。答卷上遇到这类题,先在草稿上补花括号,补完再走条件,比在脑子里硬跟快得多。

3.5 填空后段的手算题:辗转相除、排列、错排

填空题的后三道通常脱离代码,纯考数学。第 28 题求 1001 和 1989 的最大公约数,用辗转相除法:1989 = 1001 × 1 + 988;1001 = 988 × 1 + 13;988 = 13 × 76 + 0,最后一个非零余数是 13。代码形式长这样:

int gcd(int a, int b) { while (b) { // 余数不为 0 就继续 int t = a % b; // 求余 a = b; // 除数上位 b = t; // 余数变除数 } return a; // 循环结束时 a 就是最大公约数 }

参数含义只有两个:a 和 b 是待求的两个整数,返回值是最大公约数。手算时不用写完整代码,把“大数减小数的倍数、余数接力”这个动作走两遍就出结果。

第 29 题是排班计数:7 个人排 1 到 7 日,每人一天,甲、乙不排在前两天。做法是先处理受限的人,再排剩下的人:甲乙从第 3 到第 7 日这 5 天里选两天并讲究顺序,是 5 × 4 = 20 种;其余 5 人排剩下的 5 天,是 5! = 120 种;乘起来 20 × 120 = 2400。如果题目的限制变成“甲不在 1 日、乙不在 2 日”,就不能这样直接乘,要用容斥:7! − 2 × 6! + 5!,因为甲在 1 日和乙在 2 日这两种情况被减了两次,得加回来一次。

第 30 题是错排:五位同学重坐,至多两位坐回原位。拆成三类——零人坐原位(错排 D5=44)、恰一人(C(5,1) × D4 = 5 × 9 = 45)、恰两人(C(5,2) × D3 = 10 × 2 = 20),相加得 109。错排前五项要背:D1=0、D2=1、D3=2、D4=9、D5=44。

4. 易错点:五道每年都有人栽的题,错法几乎一模一样

这一章不按知识点排,按“错法”排。下面五条是阅卷时反复见到的典型失分,每一条都按“错在哪、为什么错、怎么答对”写。看的时候别只看正确解法,先想想自己会不会也那样错。

4.1 概念与语法:三个“看着都对”的坑

坑一:把“从一处传到另一处”答成依附性或时效性。错在只看题干的名词(报纸、网络、电视),没看动词。为什么错:依附性和传递性都跟“载体”有关,题干里一出现“载体”两个字,很多人条件反射选依附性。怎么答对:圈出题干里的动词,“传给”“传递给”“传播到”一律对应传递性;只有题干强调“必须依附于某种载体才能存在”时才选依附性。判断顺序永远是先动词后名词。

坑二:智能家居场景选人工智能。错在被“智能”两个字带走。为什么错:远程开关灯、调恒温器这些动作背后是设备联网和远程控制,没有识别、判断、学习的过程,属于物联网的典型场景。怎么答对:问自己一句“这个场景里机器有没有做判断”。有判断、有识别、有推荐,才是人工智能;只是把设备连起来远程操作,就是物联网。

坑三:short 的最大值填 65535。错在把无符号的范围当成了有符号。为什么错:short 占 2 字节 16 位,2 的 16 次方是 65536,看到这个数就容易顺手写成 65535。怎么答对:先看类型前面有没有 unsigned。没有就是有符号,范围对称,最大值是 2 的 15 次方减 1,即 32767;有 unsigned 才是 0 到 65535。这一条没有捷径,只能在草稿上写下“有符号/无符号”再填数。

4.2 程序题:两个算着算着就歪的坑

坑四:for(i=0; i<10; i++) 结束后 i 的值填 9。错在把“最后一次进入循环时 i 的值”当成了“循环结束后 i 的值”。为什么错:循环的执行顺序是判断、循环体、自增,i 变成 10 的那一次判断失败、循环体没进,但自增已经发生了。怎么答对:记住一句话——循环结束时,循环变量的值等于第一个让条件不成立的值。i<10 的第一个不成立值是 10,答案就是 10。这类题还有一种变体是 i<=10,答案变成 11,同样按“第一个不成立值”推。

坑五:while 里带 continue 的循环次数,答成 5 次或 6 次。真题第 17 题的结构是 k=0,while(k<10) 里先判断 if(k<1) continue,再判断 if(k==4) break,最后 k++。错在没看出 continue 会跳过 k++。为什么错:k 一开始是 0,满足 k<1,continue 直接回到循环开头,k++ 永远执行不到,k 永远是 0,条件永远成立。怎么答对:看到 continue,第一件事是找“循环变量的更新语句在不在 continue 后面”。在后面,就是死循环;在前面,才继续算次数。这道题答案是“死循环,不能确定循环次数”。

提示:这五个坑里有三个(坑一、坑四、坑五)都不需要计算,只靠规则判断。考场上先把这类“规则题”秒掉,把时间省给进制和程序跟踪。

5. 阅读程序 30 分:三段真题的变量跟踪法

阅读程序是整张卷子里分值最重的一块,10 个空共 30 分,和填空持平,但它比填空更依赖方法。三段程序分别考逻辑表达式的分支、字符的区间变换、递归的展开,第四类数组批量修改常出现在填空里。共同解法只有一个:拿一张草稿纸,把变量列成表,逐行往下推,不跳步、不心算。这一章按三段程序拆开讲,每段都给可以照抄的跟踪格式。

5.1 逻辑表达式:先 && 后 ||,逐组代入

第一段程序的核心是这一行条件:

if ((x > y) || ((y != 20) && (ok1 == 0)) && (ok2 != 0)) a = 1; else if ((ok1 != 0) && (ok2 == 0)) a = -1; else a = 0;

运算符优先级是 && 高于 ||,所以整个条件等价于 (x>y) || ( (y!=20) && (ok1==0) && (ok2!=0) )。做题时不要一口气看整行,把它拆成四个小判断,列成表填真假:

输入组x>yy!=20ok1==0ok2!=0第一个 if第二个 if输出
第一组假假真假假假0
第二组真任意任意任意真不比1
第三组假真假真假真-1

三行就是全部推演过程,卷面上给几组输入就填几行。判断“第一个 if 为真”的时候可以提前收工,因为 || 左边成立右边就不用看,这也是出题人常设的省时点。真正容易错的是第一组的 ok2:如果 ok2 是 0,ok2!=0 为假,整个 && 链断掉,落进 else,输出 0。代入的时候每个子表达式都要写出真假,不能只在脑子里过。

5.2 字符变换:三个区间的偏移量怎么写

第二段程序对字符串逐字符判断,小写转大写、大写转小写、数字加 3 后对 10 取模:

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 + <p> <a href="https://download.csdn.net/download/weixin_60445850/89896490" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询