零基础C++信息学竞赛入门:变量、程序阅读与上机调试

发布时间:2026/10/27 21:13:36
零基础C++信息学竞赛入门:变量、程序阅读与上机调试 简介《2024年海淀区中小学生信息学竞赛校级预选赛试题》PDF面向备战海淀区信息学竞赛的中小学生及指导教师可用于校级预选赛前的自测模拟与基础知识点查漏补缺。试题分为编程基础知识单选题和程序阅读单选题两部分涉及变量命名、赋值语句、数据类型、二进制与十进制转换、表达式与逻辑判断、函数定义与递归、循环语句及break、continue、数组等内容程序阅读题围绕计数器、约数判断、最小公倍数、回文数与素数筛等代码片段要求推断运行结果或变量终值侧重代码阅读与逻辑推理能力。包内共1个PDF文件约422KB结构紧凑便于打印成卷或平板刷题。目前已有582人学习适合按原卷题型进行限时训练并据此定位编程概念、语法细节和程序执行过程理解上的薄弱环节。1. 这份试卷到底是什么一份区级信息学竞赛的入门地图第一次拿到这份 PDF很多同学的第一反应是我是不是得先把整本 C 教材啃完才敢看其实完全不用。它是一份区级中小学生信息学竞赛的校级预选赛试题全卷分三大块——编程基础知识单选题、程序阅读单选题、问题阅读单选题。前两块考的是语法和读代码的功夫最后一块把一段生活场景写成文字让你用程序员的思路去推结果。适合谁刚学 C 一两个月、想摸清自己基础扎不扎实的中小学生以及完全零基础、想找个具体目标倒逼自己上手的自学者。它不要求你写过多少行代码只要求你看得懂、算得对。2. 零基础先看懂三件事变量、赋值和二进制这一章对应试卷的第一大题。很多人做这部分靠背结果换个问法就崩。其实单选题考来考去就那几个点把规则弄懂比刷十套题都管用。2.1 变量名为什么不能随便起试卷里有一道题给你几个名字问哪个是合法变量名。这类题看着简单错的人不少因为它同时考了三条规则。第一条开头字符。变量名第一个字符只能是字母或者下划线不能是数字。所以1a这种写法编译器直接不认。第二条中间字符。从第二个字符开始可以是字母、数字、下划线但不能有空格、减号、点号这些符号。my-age看着像个词编译器会把它当成my减age两个变量做减法。第三条不能撞关键字。int、for、while、return这些是语言自己留着的词你拿来当变量名编译器会懵。我第一次学的时候习惯是拿到选项先在纸上划三刀第一刀看首字符第二刀看有没有非法符号第三刀看是不是关键字。三步走完剩下那个就是答案。#include bits/stdc.h using namespace std; int main() { int a1 1; // 合法字母开头后面跟数字 int _x 2; // 合法下划线开头 // int 1a 3; // 非法数字开头编译直接报错 // int my-age 4; // 非法中间有减号会被当成减法表达式 cout a1 _x; return 0; }上面这段代码里被注释掉的两行你可以自己取消注释试一次看看编译器报什么错。看报错信息是学编程最快的方式之一第一次看到一屏红字会慌看三次就习惯了。另外注意一点C 区分大小写sum和Sum是两个完全不同的变量这点在考试里也常被拿来设陷阱。2.2 赋值语句分号、引号那些坑赋值语句的题本质就一句话等号左边必须是一个能装东西的变量右边的东西类型得能装进去。a 5;没问题。a 5;是判断相不相等不是赋值写在语句里编译器还可能警告你「这行没效果」。a 5;把一个字符串塞给整型变量类型对不上。而a 5;是合法的——单引号包住的是字符字符在计算机里就是一个整数编码赋给 int 变量会变成对应的编码值。新手最容易混的就是双引号和单引号。记住一句话单引号里只能有一个字符它是字符双引号里可以是一串字符它是字符串两者不是一个东西。还有一种考法是把赋值嵌在表达式里。C 的赋值本身也有一个结果就是被赋的那个值所以a b 3;这种连等是能跑的先把 3 给 bb 的值是 3再把这个 3 给 a。看着别扭但规则就是这样。提示做这类题不要凭语感把每个选项当成一行真实代码在心里过一遍编译器会不会拦你。拦得住的就是错的。2.3 二进制转十进制手算一遍就通了试卷里有一道二进制转十进制的题。这个知识点不能靠背得会手算因为考试时数字会换。方法是从右往左数位数第 0 位权重是 1第 1 位是 2第 2 位是 4每往左一位乘 2。把是 1 的那些位对应的权重加起来就是十进制结果。位数76543210权重1286432168421举个例子二进制1011从右往左第 0 位是 1加 1第 1 位是 1加 2第 2 位是 0跳过第 3 位是 1加 8。合起来 12811。反过来十进制转二进制用「除 2 取余倒着读」。11 除以 2 得 5 余 15 除以 2 得 2 余 12 除以 2 得 1 余 01 除以 2 得 0 余 1余数从下往上读就是 1011。这个方法练三遍就能形成肌肉记忆比考试时现场推理快得多。#include bits/stdc.h using namespace std; int main() { int n 11, base 1, ans 0; while (n 0) { ans (n % 2) * base; // 取当前最低位乘上对应权重 base * 2; // 权重每轮翻倍 n / 2; // 右移一位 } cout ans; // 输出 11验证进制转换逻辑 return 0; }这段代码演示的是「二进制转十进制」的逆过程用来说明权重是怎么回事。真正考试不要求你写这段但你如果能把这段自己敲一遍、改改数字跑通二进制这一块基本就稳了。2.4 二维数组怎么按行填数还有一道题给了int a[3][2]{2, 3, 4, 5, 6, 7}问你某个元素的值。这个考的是初始化顺序大括号里的数按行优先顺序一行填满再填下一行。a[3][2]表示 3 行 2 列。所以a[0][0]2、a[0][1]3、a[1][0]4、a[1][1]5、a[2][0]6、a[2][1]7。找到你要的那个下标对上去就行。新手常犯的错是把行列搞反。记法a[行][列]第一个方括号是行从 0 开始数。这个习惯后面学任何语言都用得上。3. 把纸上的题搬到电脑上第一个能跑的程序光看题不动手理解永远停在表面。这一章带你跑通第一个程序跑完你就明白试卷里那些阅读题在干什么了。3.1 先装个环境别在第一步卡住两种方式按自己情况选。本地环境装一个 C 编译器Windows 上常见的是 MinGW 或者集成好的轻量 IDE装完在命令行敲g --version能显示版本号就说明成了。Mac 自带 clang终端敲g --version也一样。在线环境不想装东西的搜一个在线 C 编译器打开网页直接写代码点运行。缺点是网络不稳的时候会卡好处是零配置。我建议新手先用在线环境跑通第一段代码建立信心再回头装本地环境。装环境这一步劝退率极高别把顺序搞反了。3.2 第一道能跑的例子就是试卷里那道约数题试卷第二大题第一题给了这么一段程序我把它加好注释放在这里#include bits/stdc.h using namespace std; int n, cnt; // 全局变量自动初始化为 0 int main() { cin n; // 从键盘读入一个整数 for (int i 1; i n; i) // i 从 1 试到 n-1 if (n % i 0) cnt; // 能整除说明 i 是 n 的真因子 cout cnt; // 输出真因子的个数 return 0; }新建一个文件把这段代码原样敲进去别复制粘贴敲一遍对新手很重要编译运行输入 12屏幕会输出 5。为什么是 5因为 12 能被 1、2、3、4、6 整除这五个数都小于 12所以计数器加了 5 次。注意循环条件是i n而不是i n这一步决定了 12 自己不被数进去。考试时这种边界差一个等号就是你翻车的地方。参数说明n是输入的整数试卷给的取值范围一般不大cnt是计数器。这里n和cnt写在main函数外面属于全局变量默认值就是 0。如果写在main里面又不赋初值那它就是随机值程序输出会变成玄学这是新手最常见的问题之一。改一下试试把i n改成i n再输入 12输出会变成 6。这多出来的一个就是 12 自己。跑到这一步你就算真正读懂这段代码了。3.3 再跑一个递归求最大公约数试卷第二大题倒数第二题是递归求最大公约数代码不长但思想很典型#include bits/stdc.h using namespace std; int f(int a, int b) { if (b 0) return a; // 递归出口余数为 0 时a 就是答案 return f(b, a % b); // 把 (b, a 除以 b 的余数) 交给下一层 } int main() { int x, y; cin x y; cout f(x, y); return 0; }这段代码的逻辑是两个数的最大公约数等于「较小的数」和「较大数除以较小数的余数」的最大公约数一直算到余数为 0 为止。拿 12 和 18 手动走一遍第一次f(12,18)b 不是 0转成f(18, 12%18)也就是f(18,12)第二次 b 是 12转成f(12, 18%12)也就是f(12,6)第三次转成f(6, 12%6)也就是f(6,0)第四次 b 是 0返回 6。答案就是 6。新手看递归容易晕诀窍是别一次想在脑子里展开所有层就老老实实拿纸写「当前 a、当前 b、余数」三列一行一行往下记。写三行你就看明白了。理解了这段试卷里求最小公倍数那道题就顺了两数相乘再除以它们的最大公约数就是最小公倍数。代码里写成a * b / d考试时够用但真实写程序建议写成a / d * b先除后乘能避免两个大数相乘溢出。这个习惯我也是踩过坑才养成的。3.4 输出对不上怎么办加打印调试代码跑出来跟你想的不一样别急着删掉重写。在循环里加一行cout i cnt endl;把每一轮的值打印出来你立刻就能看到是从哪一步开始跑偏的。试卷里的阅读题不给你这个机会所以平时练的时候更要把这个动作做熟。会调试的人做阅读题脑子里装的就是一台运行中的机器。4. 程序阅读题怎么读五类必考代码逐行拆解这一类题在试卷里占的分量最重也是最容易拉开差距的地方。它不问你语法问的是你脑子里能不能跑程序。4.1 公约数和公倍数一对双胞胎试卷里有两道题长得几乎一样一道统计 1 到 n 之间能同时整除 m 和 n 的数的个数另一道求最小公倍数。区别只在于一个break。前一道的写法是循环 i 从 1 到 n如果 m 和 n 都能被 i 整除计数器加一计数器到 6 就提前退出。这个break很关键它意味着结果最多就是 6超过 6 之后的数再符合条件也不数了。带break的题你一定要问自己这个 break 会不会让循环提前结束导致后面的数根本没被检查。后一道的写法反过来从较小那个数开始往下找找到第一个能同时整除的 i赋值给 d 然后break因为往下找找到的第一个就是最大公约数。最后输出a * b / d也就是最小公倍数。两道题用的是同一套思路方向一个是往上数、一个是往下数。读代码时先确定循环方向再确定循环里干了什么最后确定什么时候停。三步一定答案就出来了。4.2 回文数和素数两道经典模板题回文数那道题里f函数干的事是把一个数倒过来s s * 10 (t % 10)每次取最后一位拼到末尾t / 10把最后一位去掉。循环结束后判断倒过来的数跟原来的数是否相等。这类「拆位重组」的代码要盯住两个细节t在函数里被改掉了但比较的是s x用的是传进来的原值所以没问题另外s是局部变量每次调用都从 0 开始不会跨次累加。素数那道题的f函数用了i * i x这个条件比i x快得多是常见的优化写法。主函数里的判断链是如果是素数输出 1否则如果是偶数输出 2否则如果 n 减去 2 之后是素数也输出 2否则输出 3。读这种带多个else if的代码一定要按顺序走前一个条件成立了后面的就不再判断。4.3 筛法那道题别硬背答案有一道题用筛法标记合数然后又用a[i] a[i-1] (1 - a[i])做累加。这道题的设计有个特点同一个数组a先当标记数组用后面又被当前缀和数组用两种含义叠在一起。遇到这种代码硬背答案是没用的换个数就崩。正确做法是画表格列三列一列是 i一列是a[i]当前的值一列是这一步做了什么。把前十几个 i 走一遍你会明显看到数组含义是从哪一行开始变的。这种手工跟踪的能力就是阅读题真正在考的东西。4.4 问题阅读题把文字翻译成步骤第三大题的题干长看着吓人其实每一段都在描述一个可以用变量表示的规则。手机图标那道题你要从题干里抽出三样东西图标一共有几个、每次启动后位置怎么变、操作次数怎么算。位置怎么变这句最容易被忽略——启动之后被点的图标会和前一个位置的图标交换而且已经排在第一位的时候不交换。不把这条单独写成一句话记下来你后面一定会算错。服务器压缩视频那道题关键在单位换算。题干说每个服务器用多少秒压缩多长的视频你要先把「秒」和「分钟」统一成同一个单位再算每个视频从排队到完成花了多久。单位不统一是这类题最常见的失分点。掷骰子和小猴爬山那两道题本质上是在给定的约束条件下判断某个说法对不对。做法是把每个选项单独拿出来验证别看完全部再回头想那样容易乱。5. 新手最容易踩的坑做题顺序、编译报错和环境排查5.1 一上来就啃阅读题单选题错一片现象翻开试卷直接从第二大题开始做觉得自己语法都会结果对答案时基础题错一堆。原因程序阅读题靠的是整体感觉基础题靠的是精确记忆。没有精确记忆打底读代码时很多细节是靠猜的。解决按题目顺序做。先把第一大题走一遍错的每一道都回到语法书里找对应章节看五分钟。这五分钟省的是后面十道阅读题的错。5.2 代码能看但一编译就报错现象敲代码的时候中文标点混进去了分号是「」不是「;」引号是「」不是编译器报一堆看不懂的错。原因输入法没切过来。这是零基础阶段最常见的问题跟逻辑一点关系都没有。解决写代码前先把输入法切到英文养成习惯。遇到报错先看第一行编译器提示的行号附近八成就有一个奇怪的符号。5.3 程序能跑但输出是随机数现象编译通过了运行结果每次都不一样或者是一个巨大的数字。原因变量没赋初值。局部变量在内存里初始值是随机的你直接拿来做加法加的就是垃圾数据。解决声明变量的时候顺手写上初值int cnt 0;多敲三个字符能省半小时排查时间。5.4 循环边界差一个等号现象自己算出来和程序输出差一怎么都对不上。原因i n和i n差了一次循环而这次循环有时候正好是答案的一部分。解决读循环时第一时间把边界写在纸上问自己「最后一次循环 i 等于几」。这个问题回答出来了边界就搞清楚了。5.5 只对答案不看过程现象做完一套题对完答案就收起来下次遇到类似的还是错。原因对答案只验证了结果没验证思路。错的题可能蒙对了对的题可能想歪了。解决每道错题都在旁边写一句话——错在哪个知识点。一份试卷做完错题旁边的知识点清单就是你下一步该补的内容。6. 下一步学什么从这份试卷走向真正的上机编程把这份预选赛试题做完你会发现自己卡的地方很集中要么是语法细节记不准要么是读代码时跟不上变量变化要么是长题干读不下去。这三类问题对应的补法完全不一样我给你排个顺序。卡在哪先补什么怎么练对应的试卷部分语法细节记不准变量、赋值、循环、函数四个基础点每个点手写三行能跑的小代码第一大题读代码跟不上手工跟踪变量拿纸画表格一行一行记变量值第二大题长题干读不下去信息提取把题干拆成「已知、变化规则、求什么」三行第三大题上机写不出完整程序从二十行的程序开始自己从头写一遍试卷里的代码例子这个顺序不要跳。语法打底跟踪练习信息提取最后才是自己写完整的程序。很多人一上来就想刷算法题结果因为语法不熟每道题都卡在编译报错上挫败感特别强。具体的练法我给你一个找试卷里代码最短的那道阅读题把代码敲进电脑跑通然后改输入的数字看看输出怎么变。改三次之后你再去读同类型的题速度会明显不一样。这个动作我建议每天做一道一周下来对代码的直觉就出来了。再往后你可以把自己的错题整理成一张纸只写知识点不写题目考前看这张纸就够了。这份预选赛试题的价值不在于题目本身多难而在于它能一次性把零基础阶段的薄弱点全暴露出来。最后说个自己的教训。我刚开始学的时候做阅读题全靠脑子硬推推完就过从来不写过程。结果同样的题换个数字就废白白浪费了两周。从那以后我每次读超过十行的代码都强制走一遍「拿纸、画表、记变量」这三步慢是慢但再也没在边界和变量覆盖上翻过车。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询