news 2026/10/27 4:42:35

C++信息学预选赛选择题:三板块考点、程序阅读与易错清单

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++信息学预选赛选择题:三板块考点、程序阅读与易错清单

简介:面向海淀区中小学生信息学竞赛备赛场景的校级预选赛试题PDF,适合小学高年级至初中阶段选手及指导教师用于赛前自测与知识盘点。内容由编程基础知识单选题和程序阅读单选题两部分构成,覆盖合法变量名判断、赋值语句写法辨析、二进制与十进制转换、表达式运算结果、逻辑判断、函数定义与递归、循环语句及break/continue作用、二维数组元素定位等基础考点;程序阅读题则要求依据代码片段推断计数器终值、最大公约数相关输出及回文数统计等结果,侧重代码跟踪与逻辑推理能力。压缩包共1个PDF文件,约422KB,篇幅紧凑,便于打印或平板作答。已有582人学习,可作为校级选拔前熟悉题型、定位薄弱环节的练习材料,也方便教师了解命题范围与难度分布。

1. 从一道赋值语句题看这场预选赛:12+8+4 的三段结构

中小学生信息学竞赛的校级预选赛,最容易翻车的往往不是算法题,而是第一板块那道赋值语句判断。学了快一年 C++ 的孩子,仍然会在char c = 'A'和char c = "A"之间犹豫,这一犹豫就是两分。整张卷子由三段构成:12 道编程基础知识单选、8 道程序阅读单选、4 道问题阅读单选,全部选择题,不上一行机。这意味着拿分点不在“会不会写”,而在“读得准不准、算得稳不稳”。基础题拼概念边界,程序题拼手工执行,问题题拼信息抽取,三块各有各的套路。适合刚学完循环、数组、函数,准备从校级预选往区级初赛走的四到八年级学生,也适合家长拿来判断孩子到底卡在哪一层。

2. 编程基础知识:12 道单选题的考点地图与判定顺序

这一板块看着零散,实际只考五类:标识符与赋值、进制与表达式、计数与复杂度常识、字符与数据类型、函数与循环。前四类几乎年年出现,第五类是拉开差距的地方。答题时不要一上来就逐字读选项,先判断题干问的是“正确”还是“错误”,再看四个选项里有没有明显违反语法硬规则的,排除两个之后剩下的往往只差一个边界。下面按判定顺序拆开讲。

2.1 变量命名与赋值:先看首字符,再看引号

合法变量名的判定有一条固定流水线:首字符必须是字母或下划线,不能是数字;后续字符只能是字母、数字、下划线;整个名字不能是关键字;大小写敏感,Sum和sum是两个变量。按这个顺序看,绝大多数错项三秒内就能排掉。

写法是否合法卡在哪一步
int 1a;否首字符是数字
int _a1;是下划线开头,后续合法
int int;否撞关键字
int a b;否中间有空格
int a-b;否含减号,不是合法字符
int Student_2;是字母开头,含下划线和数字

赋值语句的判定则要盯住三件事:语句必须以分号结尾;字符串用双引号,单个字符用单引号;赋值号左边必须是可修改的变量,不能是常量或表达式。像5 = a;这种写法编译直接报错,char c = "A";也是错的,因为双引号给的是字符串常量的地址,塞不进一个字符变量。反过来char c = 'A';才是把字符 A 的编码值赋给 c。这类题面试官和出题人最喜欢设的陷阱,就是把单双引号对调,看着只差一个符号,性质完全不同。

2.2 进制转换与表达式:权值展开加一张优先级表

二进制转十进制只有一个动作:按权展开相加。以1011为例,从右往左权值依次是 1、2、4、8,把为 1 的位加起来,8+2+1=11。反过来十进制转二进制用除二取余、倒序排列。考试里通常给四位或五位的二进制,心算完全够用,关键是别把位权从 0 还是从 1 开始数错。

优先级运算符结合方向
1()[]从左到右
2!++--单目正负号从右到左
3*/%从左到右
4+-从左到右
5<<=>>=从左到右
6==!=从左到右
7逻辑与从左到右
8逻辑或从左到右
9=+=-=从右到左

表达式题的高频坑集中在整数除法与取余:5/2得 2 不是 2.5,5%2得 1;3+2*4%3先算 2*4 得 8,8%3 得 2,最后 3+2 得 5。关系表达式的运算结果是逻辑值,输出时显示为 1 或 0,比如3>2输出 1。还有一个隐蔽点:a=b=3这种连赋值在 C++ 里合法,从右往左执行,但左边变量类型不匹配时会截断。

注意:题面里“运算结果”三个字要看清楚,问的是逻辑值还是数值,两者在 C++ 里可能打印出一样的 1,但含义不同。

2.3 分组计数与排序比较:两个公式的适用条件

分组问题考的是“先定形态、再算组合、最后除重复”。以 11 人分三组、任意两组人数差不超过 1 为例,三组人数只能是 4、4、3 这一种构成。先选 4 人成第一组,有 C(11,4)=330 种;再从剩下 7 人选 4 人,有 C(7,4)=35 种;最后 3 人自动成组。因为两个 4 人组没有编号、互换后是同一种分法,所以还要除以 2,得到 330×35÷2=5775。少除这个 2 是最常见的失分点。

排序比较次数考的是结论记忆:对 n 个数用冒泡排序或选择排序,最坏情况下比较次数都是 n(n-1)/2,交换次数最多也是这个量级。给 10 个数就是 45 次,给 100 个数就是 4950 次。题干里“最坏情况”四个字很关键,如果问最好情况,冒泡可以做到 n-1 次比较加零次交换。小学段不会考到理论下界,记住这两个结论并按 n 代入即可。

提示:组合题算完先别急着选,回头检查“组有没有编号”“允不允许空组”两个条件,这两条一变,答案翻倍或减半。

2.4 字符、函数、循环、数组:四组高频判断

字符型是第一大失分源。'5'是字符,编码 53;5是整数;"5"是字符串。想让字符变量拿到字符 5,可以写char c = '5';,也可以写char c = '0' + 5;,因为'0'是 48,加 5 正好 53;但写char c = 5;拿到的是编码为 5 的控制字符,不是可打印的 5。字符能参加算术运算,'A' + 1得 66,也就是'B',所以“字符型变量不能参加算术运算”这类说法是错的。

函数部分的判断点集中在四条:每个程序有且只有一个主函数;主函数是执行入口;函数可以自己调用自己,这就是递归;函数可以嵌套调用,但不能嵌套定义。出题人常把“嵌套调用”和“嵌套定义”混在一句话里,读的时候要逐字比对。

循环部分的判断点只有一句话:for和while都能实现确定次数的循环,区别只在写法习惯,不存在“while专用于不确定次数”的说法。break跳出整个循环,continue只跳过本次、继续下一轮,两个关键字的作用范围完全不同。

数组初始化按行优先填充。int a[3][2]={2,3,4,5,6,7}的执行结果是a[0][0]=2、a[0][1]=3、a[1][0]=4、a[1][1]=5、a[2][0]=6、a[2][1]=7。值为 5 的元素是a[1][1]。记不住就画一个 3 行 2 列的格子,从左到右、从上到下把数字填进去,比背结论可靠。

3. 程序阅读:把 8 段代码在纸上跑一遍

程序阅读题的共同特征是代码短、循环浅、变量少,难点不在语法而在“跑完整”。有效的做法是拿草稿纸画一张变量表,把每一轮循环后关键变量的值写下来,跑到第三轮规律自然浮现。切忌在脑子里空转,尤其是带break和递归的题,跳步几乎必错。下面按代码类型分四组。

3.1 约数统计:循环从 1 还是从 2 开始

第一类代码统计的是约数,边界差一位,答案就差一。

#include <bits/stdc++.h> using namespace std; int n, cnt; int main() { cin >> n; for (int i = 1; i < n; i++) // 上界是 n-1,不含 n 本身 if (n % i == 0) cnt++; // 统计的是“真因数”个数 cout << cnt; return 0; }

这段代码里i < n决定了统计范围。输入 12,能整除 12 的 i 有 1、2、3、4、6,共 5 个,输出 5。如果把条件改成i <= n,12 本身也会被算进去,输出变成 6。参数上只有一个输入 n,cnt 定义在全局,初值自动为 0,不需要手动清零。

第二类代码统计两个数的公因数,并且加了提前终止。

#include <bits/stdc++.h> using namespace std; int n, m, cnt; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { if (m % i == 0 && n % i == 0) cnt++; // i 同时整除 n 和 m if (cnt == 6) break; // 数到 6 个立刻停 } cout << cnt; return 0; }

这段的输出规律是“公因数个数,但最多 6 个”。如果两个数互质,公因数只有 1,输出 1;如果公因数有 8 个,循环在数到第 6 个时就跳出,输出 6。参数上要注意循环上界写的是 n,若 m 比 n 小,i 超过 m 之后不可能再整除 m,只是多跑几轮空循环,不影响结果。这是出题人留下的一个可解释的冗余,读代码时要能判断它无害。

3.2 数论三连:gcd、lcm 与回文数

最大公约数与最小公倍数的组合是必考模板。用辗转相除求出最大公约数 d,再输出a*b/d,得到的就是最小公倍数。这里有个细节:a*b在 int 范围内可能溢出,题目数据小的时候看不出来,但读代码时要能指出这个隐患。递归写法f(a,b)在b==0时返回 a,否则返回f(b,a%b),把调用栈写在纸上是f(12,8) → f(8,4) → f(4,0) → 4,三层就到底。

回文数代码考的是数位反转。s = s*10 + t%10把 t 的末位不断接到 s 的末尾,t /= 10去掉末位,循环结束时 s 就是反转后的数,判断s == x即可。输入 n 后从 1 遍历到 n 计数,输出的是 1 到 n 之间回文数的个数。单位数 1 到 9 全是回文,所以 n 小于 10 时答案就是 n,这个边界可以直接用来验算。

3.3 筛法和前缀和:数组状态怎么跟着变

这类题的难点是同一个数组被复用了两次,含义在中间发生了变化。

int n, a[10010]; int main() { cin >> n; a[1] = 1; // 1 先标记为非素数 for (int i = 2; i <= 10000; i++) { if (a[i] != 0) continue; // 已被标记为合数,跳过 for (int j = 2; j <= 10000 / i; j++) a[i * j] = 1; // i 的倍数全部标记为合数 } for (int i = 1; i <= n; i++) a[i] = a[i - 1] + (1 - a[i]); // 前缀和:统计 1..i 的素数个数 cout << a[n]; return 0; }

前半段里,a[i]=0表示 i 是素数,a[i]=1表示非素数,这是埃氏筛的标准写法。后半段数组含义整体翻转,a[i]变成“1 到 i 之间素数的个数”。以 n=10 为例,筛完后 2、3、5、7 位置是 0,其余是 1;前缀和累加1-a[i],最后a[10]等于 4。参数上数组开到 10010,筛的上界写死 10000,输入 n 超过 10000 会越界,这是代码的硬限制,读题时要能看出来。

3.4 分类输出与递归展开:把 if 链走完

带if-else链的代码,做法是把每种输入对应的分支列成表,而不是从头到尾模拟。

bool f(int x) { for (int i = 2; i * i <= x; i++) if (x % i == 0) return 0; // 找到因子,不是素数 return 1; } int main() { cin >> n; if (f(n)) cout << 1; // 情况一:n 本身是素数 else if (n % 2 == 0) cout << 2; // 情况二:偶数拆成两个素数 else if (f(n - 2)) cout << 2; // 情况三:奇数 = 2 + 素数 else cout << 3; // 情况四:其余 }

这段对应的是“一个数拆成最少几个素数之和”的结论:素数输出 1,偶数输出 2,奇数且 n-2 是素数输出 2,其余奇数输出 3。读代码时按这四行分支逐条对号入座,比逐行模拟快得多。有一个边界要留意:f(1)的循环一次都不执行,会返回 1,把 1 误判成素数,这是这类写法常见的坑。

还有一类是“找满足条件的数”,循环里套计数。

int main() { i = 1; while (1) { i++; if (i % 7 != 0) continue; // 只看 7 的倍数 int cnt = 0; for (int j = 2; j < i; j++) if (i % j == 0) cnt++; // 统计 2..i-1 中的因数 if (cnt == 6) { ans = i; break; } // 恰好 6 个真因数 } cout << ans; }

手推过程:7 的倍数依次是 7、14、21、28、35、42。7 没有 2 到 6 之间的因数,cnt 为 0;14 有 2、7,cnt 为 2;21 有 3、7,cnt 为 2;28 有 2、4、7、14,cnt 为 4;35 有 5、7,cnt 为 2;42 有 2、3、6、7、14、21,cnt 为 6,循环在这里跳出,输出 42。这张小表就是最好的解题过程,考场上写出来,比在心里默念稳得多。

4. 问题阅读:四道长题干的信息抽取

问题阅读是整张卷子里最像“小作文”的部分,题干动辄半页。没有算法基础的孩子容易慌,其实这类题不要求写代码,只要求把文字翻译成变量和规则,然后按规则走几步。答题节奏是:先圈出所有变量名,再圈出所有规则句,最后圈出要你判断的那个量。三圈画完,题目就瘦了一半。

4.1 手机菜单:位置数组与交换规则

这道题的场景是 n 个应用图标分布在若干屏幕上,每屏 k 个,启动某个应用时要先滚动到它所在的屏幕,再点一下。启动后菜单回到第一屏,并且刚启动的图标要和前一个启动的图标交换位置。

关键是把“应用编号”和“位置编号”拆成两个量。设pos[x]表示编号为 x 的应用当前在第几个位置,屏幕号等于(pos[x]-1)/k + 1。由于每次启动后菜单自动回到第一屏,单次操作数正好等于目标图标所在屏幕号,滚动次数是屏幕号减一,再加上点击的一次。这个简化能把每步的计算压到一次除法。

用一组演示数据把流程走通:5 个应用、每屏 2 个、启动序列依次是 2、4、1,初始位置排列为 3、1、5、2、4,即 1 号在第 3 位、2 号在第 1 位、3 号在第 5 位、4 号在第 2 位、5 号在第 4 位。

步骤目标应用启动前位置所在屏幕本次操作数交换后变化
12111已在首位,不交换
242114 到第 1 位,2 到第 2 位
313221 到第 1 位,4 到第 3 位

三次合计 4 次操作。这张表就是答题模板,考场上照抄结构,把题目给的数据填进去,一步一步走,不要跳步。题干里那句“注意区分应用程序的编号以及位置,这是两个不同的变量”是出题人明写的提醒,凡是把它当同一件事的,后面全错。

4.2 服务器压缩:时间线模拟与错误项排查

这类题考的是调度:k 台服务器,每台 b 秒能压完 a 分钟的视频,视频按上传顺序排队,有空闲服务器就立刻开工。要判断四个选项里哪个完成时间说错了。

做法是维护一个长度为 k 的数组,记录每台服务器下一次空闲的时刻。对每个视频,挑空闲时刻最早的那台,开始时间取“上传时间”和“服务器空闲时刻”中的较大值,完成时间等于开始时间加上这个视频需要的秒数。需要的秒数由比例换算:b 秒压 a 分钟,那么时长 t 分钟的视频就需要t/a*b秒。

视频编号上传时刻时长分配到服务器开始时刻完成时刻
11a 分钟1 号11+b
22a 分钟2 号22+b
33短取最早空闲者按前两行推算开始+耗时

填完表之后,把每个选项的完成时刻和自己的表逐项比对,对不上的就是答案。这类题的错误项通常只差几秒,所以每一步都要写清楚,不能心算。参数上要特别注意“同一时间段每台服务器只能压一个视频”和“同一个视频只能在一台服务器上压”这两条约束,前者决定不能并行,后者决定不能拆分。

4.3 骰子与爬山:可能性边界的两个公式

骰子题问的是“哪个骰子上的哪些数字可能出现”。设 n 个骰子,第 j 个有 k_j 个面,数字是 1 到 k_j,总和为 S。判断第 i 个骰子能否取到 x,只需看剩下的骰子能不能凑出 S-x。剩下骰子的最小和是 n-1,最大和是总和减去 k_i,于是有:

S - (总和 - k_i) ≤ x ≤ S - (n-1)

再把这个区间和 1 到 k_i 取交集,交集里没有整数就说明该数字不可能出现。这个方法不用枚举所有组合,一步到位。

爬山题问的是“可能到过的最高海拔”。已知第 1 天高度 h1、第 n 天高度 h2,相邻两天高度差不超过 1。设第 t 天高度为 h,从前往后推有h ≤ h1 + (t-1),从后往前推有h ≤ h2 + (n-t)。两式相加得2h ≤ h1 + h2 + n - 1,所以最高海拔不超过(h1+h2+n-1)/2向下取整。这个上界是可以构造出来的,因此就是答案。记不住推导就记结论:两端各自以每天 1 的速度向中间爬,碰头的位置就是最高点。

5. 易错点:五个最常见的失分动作

预选赛的分数差距,很大一部分不是不会,而是会了却写错。下面五条是批卷和讲题时反复见到的,每一条都按“错在哪、为什么错、怎么答对”拆开,对照自己的草稿纸看一遍。

5.1 引号与字符:把字符当成字符串

错在哪:看到“让字符变量得到字符 5”,直接选了char c = "5";。

为什么错:双引号在 C++ 里表示字符串常量,它的值是一个地址,不能赋给单个字符变量;单引号才表示一个字符常量。两者只差一个符号,类型完全不同。

怎么答对:先看赋值号右边是单引号还是双引号,单引号后面只能有一个字符。再看左边变量类型,字符变量配单引号,字符串变量配双引号,一一对应。检查时把char c = '5'和char c = "5"并排写一遍,编译错误的那个就是答案。

5.2 循环边界:i<n 与 i<=n 差一个

错在哪:统计真因数个数时,把循环写成i <= n,结果多算了一个,答案差 1。

为什么错:真因数不含自身,上界必须是 n-1。写成小于等于,n 自己会被算进去,而 n 一定能整除 n。

怎么答对:读代码先找循环的三个部分,特别看条件是<还是<=。判断不了就代一个小数进去,比如 n=6,手算真因数是 1、2、3 共 3 个,再用代码的边界对一遍,能立刻暴露问题。

5.3 组合计数:忘了除重复的组

错在哪:11 人分 4、4、3 三组,算到 330×35 就选了,忘了两个 4 人组互换算同一种分法。

为什么错:先选第一组再选第二组,这两步是有先后顺序的,但两个 4 人组本身没有编号,交换后是同一种分组,所以每种分法被数了两遍。

怎么答对:算完组合数后问一句“我数的这些组,有没有哪两个是可以互换的”。有就除以互换个数的阶乘,两个组除以 2,三个组除以 6。

5.4 数组填充:按列读而不是按行读

错在哪:看到int a[3][2]={2,3,4,5,6,7},以为a[1][0]是 6,把行列弄反了。

为什么错:C++ 的初始化列表按行优先填充,也就是先填满第 0 行的所有列,再填第 1 行。行列下标写反,答案就整体错位。

怎么答对:在草稿纸上画格子,行数和列数写清楚,从左到右、从上到下把数字填进去,再按a[行][列]去取。格子画出来只要五秒,比在脑子里转可靠。

5.5 模拟题:跳步不写中间状态

错在哪:手机菜单那道题,看一眼题干觉得懂了,直接在脑子里走三步,结果第二步交换的对象记错。

为什么错:模拟题的每一步都依赖上一步的位置状态,不写下来,第三步就已经忘了第一步交换过谁。

怎么答对:列一张表,列头是“步骤、目标、启动前位置、所在屏幕、操作数、交换后变化”,每走一步填一行。表填完,答案自然出来,回头检查也有据可依。

6. 考场时间分配与检查清单:90 分钟的四段切法

整张卷子 24 道选择题,按 90 分钟算是平均不到四分钟一道,但实际不能平均分配。基础知识 12 题控制在 20 分钟以内,这部分快,卡住超过一分钟就标记跳过;程序阅读 8 题给 30 分钟,每题都要在纸上写出变量表;问题阅读 4 题给 30 分钟,长题干读两遍再动笔;最后留 10 分钟专门检查标记题和易错点。

时间段任务必须留下的痕迹
0 到 20 分钟12 道基础知识单选排除掉的选项打叉,标注卡点
20 到 50 分钟8 道程序阅读每题一张变量表或调用栈
50 到 80 分钟4 道问题阅读每题的模拟表格
80 到 90 分钟回查标记题对照易错五条逐项过

检查顺序也有讲究,先看标记题,再看程序阅读里带break和递归的题,最后重算一遍所有涉及边界的地方:循环是<还是<=,数组下标从 0 还是从 1 开始,组合有没有除重复。押题方向上,进制转换、整除取余、gcd 与 lcm、埃氏筛加前缀和、模拟调度、极值夹逼这六类几乎每年都会以某种形式出现,复习时按这六类各找两道同类题练手,比刷整套卷子更聚焦。

还有一个习惯值得养成:草稿纸对折分区,基础题的计算写左上,程序阅读的变量表写右上,问题阅读的模拟表写下半页。考完不对答案也知道自己哪块花了时间。从那以后我每次带人过这套卷,都强制先花两分钟把三块题的时间写在草稿纸角上,铃响之前只看那行字,不看别人翻到第几页。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 4:42:05

Linux应急响应实战:从取证到加固的完整指南

1. 赛事背景与Linux应急响应的重要性2023年"一带一路暨金砖国家技能发展与技术创新大赛"首次将网络安全防护与治理纳入竞赛单元&#xff0c;其中Linux应急响应作为核心考核项目备受关注。这项由多国共同发起的国际赛事&#xff0c;旨在推动数字时代下的网络安全人才培…

作者头像 李华
网站建设 2026/10/27 4:41:37

营销技能拆解:从执行操作到决策系统的能力进阶指南

很多年前我第一次带团队时&#xff0c;经常遇到一种候选人&#xff1a;简历上写着“精通信息流投放”“擅长微信公众号运营”“会剪辑短视频”&#xff0c;看起来什么都能干。可真放进项目里&#xff0c;问题很快就暴露——预算花完了不知道下一步该投哪&#xff0c;内容发出去…

作者头像 李华
网站建设 2026/10/27 4:40:19

ABB TuneMaster:RobotStudio 仿真环境下的传感器监控与PID在线整定工具

简介&#xff1a;TuneMaster.zip 是面向ABB工业机器人工程师与自动化调试人员的专业级传感器监控与参数调优工具包&#xff0c;专为解决机器人本体轴与外部轴&#xff08;如滑台、滚轮&#xff09;的动态响应优化、多类型传感器&#xff08;力控、碰撞、伺服焊枪&#xff09;实…

作者头像 李华
网站建设 2026/10/27 4:40:06

ABB TuneMaster调试环境搭建:VC++运行库与USB驱动精准匹配指南

简介&#xff1a;本资源是面向ABB工业机器人工程师与自动化调试人员的专业级工具包&#xff0c;聚焦机器人外部轴与本体轴参数整定、多类型传感器实时监控及故障诊断等核心场景&#xff0c;有效解决现场调试效率低、响应不稳、异常定位难等实际问题。压缩包共5个文件&#xff0…

作者头像 李华
网站建设 2026/10/27 4:39:13

Stable Diffusion内部结构解析与优化实践

1. 项目概述&#xff1a;为什么需要拆解Stable Diffusion内部结构&#xff1f;当大多数人还在用Stable Diffusion生成各种风格的图片时&#xff0c;我已经花了三个月时间逆向分析它的模型结构。这源于去年处理一个商业项目时遇到的困境——客户需要生成特定风格的工业设计图&am…

作者头像 李华
网站建设 2026/10/27 4:39:13

中南大学RFID课设全链路实现:从射频建模到协议状态机

简介&#xff1a;本资源是中南大学RFID课程设计的完整实践包&#xff0c;面向物联网、自动化及电子信息类本科生&#xff0c;聚焦射频识别技术原理理解与工程落地能力培养。内容涵盖可直接编译运行的Qt项目源码&#xff08;含DBControl、ClockInWidget等21个cpp/h文件&#xff…

作者头像 李华