附录 A 二级真题模型速查与错题诊断
二级考试的题目看起来变化很多,实际常围绕固定模型展开。学生复习时,如果只按年份刷题,容易把每道题都当成新题;如果按模型训练,很多题可以归到同一类。 本附录按真题中反复出现的考法给出速查表、判断方法和常见错误。考前可以先看本附录,再回到整套卷中训练速度。
1. 概念题速查
1.1 计算机组成
| 题面关键词 | 应想到的概念 |
|---|---|
| 执行判断、运算、控制 | 处理器 / CPU |
| 保存正在运行的程序和数据 | RAM / 内存 |
| 只读、固化信息 | ROM |
| 高速缓存 | Cache |
| 采集外部数据 | 输入设备 |
| 显示、打印、播放 | 输出设备 |
| 长期保存文件 | 外存 / 硬盘 |
常见判断: - 机器人通过摄像头、传感器获取数据,属于输入设备。 - 飞行控制系统中负责执行判断的部分,更接近处理器。 - 电脑 “内存条” 通常指 RAM。 - 硬盘、U 盘用于长期保存文件,属于外存。
1.2 网络与存储单位
| 题面关键词 | 答案方向 |
|---|---|
| 教学楼、机房、家庭网络 | LAN |
| 一个城市范围 | MAN |
| 跨地区、全球互联网 | WAN |
| 文件大小中的 B | Byte |
| 最小信息单位 | bit |
| $1\text{B}$ | 8 bit |
| TCP 建立连接 | 三次握手 |
| 域名最右侧部分 | 顶级域名 |
例:
gesp.ccf.org.cn
顶级域名是:
cn
不能把最左侧的 gesp 当成顶级域名。
1.3 程序语言与操作
| 题面说法 | 对应概念 |
|---|---|
| 把高级语言源程序变成可执行程序 | 编译 |
| 写代码、修改代码 | 编辑 |
| 保存到文件 | 保存 |
| 查找并修改错误 | 调试 |
| 管理硬件和软件资源 | 操作系统 |
| 完成某个具体任务的软件 | 应用软件 |
例如鸿蒙、Windows、Linux 属于操作系统;浏览器、播放器、文字处理软件属于应用软件。
2. 流程图速查
| 流程图图形 | 含义 | C++ 对应 |
|---|---|---|
| 椭圆形 | 开始、结束 | 程序起点或终点 |
| 平行四边形 | 输入、输出 | cin、cout、scanf、printf |
| 矩形 | 处理、赋值、计算 | x = x + 1、sum += x |
| 菱形 | 条件判断 | if、while、for 条件 |
| 箭头 | 流程方向 | 下一步执行位置 |
常见错法:
if (val > max)
max = val;
其中:
if (val > max) 对应菱形框。
max = val; 对应矩形框。
输出语句:
cout << ans;
对应平行四边形框。
3. 标识符与关键字速查
3.1 合法变量名
变量名可以包含: 字母、数字、下划线 但不能以数字开头,不能是关键字,不能含空格、减号、小数点等符号。
| 写法 | 是否合法 | 原因 |
|---|---|---|
| student | 合法 | 字母组成 |
| _to | 合法 | 下划线可以开头 |
| five_star | 合法 | 含下划线 |
| score2 | 合法 | 数字可以在后面 |
| 2_from | 不合法 | 数字开头 |
| five‐Star | 不合法 | 含减号 |
| ccf‐gesp | 不合法 | 含减号 |
| Xing Ming | 不合法 | 含空格 |
| for | 不合法 | 关键字 |
3.2 常见关键字
int、double、float、char、bool、if、else、switch、case、default、for、while、do、break、continue、return、void、true、false
main、max、sqrt、printf 不是 C++ 关键字,但有约定用途,不建议当普通变量名。
3.3 大小写敏感
C++ 中:
PI
Pi
pi
是三个不同的标识符。
若定义:
double PI = 3.1415926;
只能直接使用:
cout << PI;
如果写:
cout << pi;
程序会找不到变量 pi。
4. 表达式与运算速查
4.1 = 与 ==
| 符号 | 含义 |
|---|---|
= |
赋值 |
== |
判断相等 |
例如:
int a = 3, b = 4;
a == b;
cout << a;
a == b 只是判断,没有改变 a,输出:
3
如果写:
a = b;
才会把 b 的值赋给 a。
4.2 / 与 %
| 表达式 | 含义 |
|---|---|
n / 10 |
去掉个位 |
n % 10 |
取个位 |
n / 10 % 10 |
取十位 |
n / 100 % 10 |
取百位 |
n % 2 == 0 |
判断偶数 |
n % k == 0 |
判断能被 $k$ 整除 |
例:
int n = 1234;
cout << n / 10 % 10;
输出:
3
4.3 整数除法
cout << (7 / 2);
输出:
3
(整数除法会舍去小数部分。)
cout << (7 / 2.0);
输出:
3.5
4.4 区间判断
错误写法:
1 <= x <= 5
正确写法:
1 <= x && x <= 5
字符是否为数字:
'0' <= ch && ch <= '9'
5. ASCII 与类型转换速查
5.1 常见 ASCII 码
| 字符 | ASCII 码 |
|---|---|
空格 ' ' |
32 |
'0' |
48 |
'1' |
49 |
'9' |
57 |
'A' |
65 |
'B' |
66 |
'C' |
67 |
'a' |
97 |
5.2 字符转数字
char ch = '7';
int x = ch ‐ '0';
结果:
x = 7
5.3 数字转字符
int x = 7;
char ch = x + '0';
结果:
ch = '7'
5.4 字符参与运算
char a = 'C';
cout << (a + 2);
'C' 的 ASCII 码为 67,输出:
69
若要输出字符 E,写:
cout << char(a + 2);
5.5 小数转整数
cout << int(18.9);
输出:
18 (不是四舍五入。)
cout << int(‐12.9);
输出:
‐12 (向 0 截断。)
6. 分支题速查
6.1 多分支顺序
if (score >= 90)
cout << "A";
else if (score >= 60)
cout << "B";
else
cout << "C";
判断从上到下进行,只执行第一个成立的分支。
若 score = 95,输出:
A
如果写成:
if (score >= 60)
cout << "B";
else if (score >= 90)
cout << "A";
else
cout << "C";
score = 95 会先满足 score >= 60,输出:
B
6.2 常见逻辑
| 题意 | C++ 条件 |
|---|---|
| 同时满足 | A && B |
| 满足其中一个 | A \|\| B |
| 不满足 | !A |
| 能被 3 和 5 同时整除 | x % 3 == 0 && x % 5 == 0 |
| 余数是 0 或 9 | r == 0 || r == 9 |
| 不能被 3 整除 | x % 3 != 0 或 ! (x % 3) |
6.3 闰年条件
yr % 400 == 0 || (yr % 4 == 0 && yr % 100 != 0)
6.4 switch 穿透
switch(month){
case 1:
cout << "Jan ";
case 3:
cout << "Mar ";
break;
default:
;
}
输入 1 时输出:
Jan Mar
(因为 case 1 后没有 break。)
输入 3 时输出:
Mar
7. 循环题速查
7.1 for 执行顺序
for (初始化; 条件; 更新)
循环体;
执行顺序: 初始化 -> 判断条件 -> 循环体 -> 更新 -> 判断条件 -> ...
7.2 break 与 continue
| 语句 | 作用 |
|---|---|
| break | 结束当前循环 |
| continue | 跳过本轮后续语句,进入下一轮 |
例:
for (int i = 0; i < 6; i++){
if (i == 3)
break;
cout << i;
}
输出:
012
例:
for (int i = 0; i < 6; i++){
if (i == 3)
continue;
cout << i;
}
输出:
01245
7.3 break 后更新语句不执行
int i;
for (i = 10; i > 0; i ‐= 2)
break;
cout << i;
第一次进入循环后直接 break,i ‐= 2 不执行,输出:
10
7.4 死循环判断
如果循环条件依赖的变量在循环体中没有变化,就可能死循环。
while (n)
cout << n;
若 n 初值非零,n 一直不变,会不断执行。
8. 数位处理速查
8.1 基本模板
while (n > 0){
int d = n % 10;
// 处理当前个位 d
n /= 10;
}
8.2 各位数字和
int sum = 0;
while (n > 0){
sum += n % 10;
n /= 10;
}
8.3 逆序数
int rev = 0;
while (n > 0){
rev = rev * 10 + n % 10;
n /= 10;
}
8.4 是否含有数字 7
bool ok = false;
while (n > 0){
if (n % 10 == 7){
ok = true;
break;
}
n /= 10;
}
8.5 回文数
int old = n;
int rev = 0;
while (n > 0){
rev = rev * 10 + n % 10;
n /= 10;
}
if (rev == old)
cout << "YES";
else
cout << "NO";
(关键:要保存原数 old。)
9. 周期问题速查
周期题步骤:
1. 找周期长度;
2. 决定用 n % len 还是 (n ‐ 1) % len;
3. 列出余数和答案的对应关系。
9.1 从第 1 项开始对齐
序列:
A B C A B C ...
第 1 项是 A,用:
int r = (n ‐ 1) % 3;
| $r$ | 输出 |
|---|---|
| 0 | A |
| 1 | B |
| 2 | C |
9.2 直接使用 n % len
三色球每 10 个一组: 1~5: Red 6~8: Green 9,0: Blue 代码:
int r = n % 10;
if (1 <= r && r <= 5)
cout << "Red";
else if (6 <= r && r <= 8)
cout << "Green";
else
cout << "Blue";
(余数 0 通常代表一组的最后一个位置。)
10. 图形题速查
10.1 二重循环模板
for (int i = 1; i <= n; i++){
for (int j = 1; j <= m; j++){
// 输出当前行当前列
}
cout << "\n";
}
(外层控制行,内层控制列。)
10.2 常见行列条件
| 图形 | 条件 |
|---|---|
| 主对角线 | i == j |
| 反对角线 | i + j == n + 1 |
| 第一列 | j == 1 |
| 最后一列 | j == n |
| X 字 | i == j || i + j == n + 1 |
| N 字 | j == 1 || j == n || i == j |
| 下三角 | j <= i |
10.3 ABC 循环字符
cout << (char)('A' + j % 3);
j 从 0 开始时:
| $j \pmod 3$ | 字符 |
| :--- | :--- |
| 0 | A |
| 1 | B |
| 2 | C |
10.4 换行位置
正确:
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++)
cout << "*";
cout << "\n";
}
错误:
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++){
cout << "*";
cout << "\n";
}
(后者每输出一个字符就换行。)
11. 综合编程模板
11.1 处理 𝑛 个数据
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, x;
cin >> n;
for (int i = 1; i <= n; i++){
cin >> x;
// 处理 x
}
return 0;
}
11.2 连续输入直到结束标记
#include<bits/stdc++.h>
using namespace std;
int main(){
int x;
while (true){
cin >> x;
if (x == ‐999)
break;
// 处理 x
}
return 0;
}
11.3 计数
int cnt = 0;
for (int i = 1; i <= n; i++){
cin >> x;
if (条件)
cnt++;
}
cout << cnt;
11.4 累加
int sum = 0;
for (int i = 1; i <= n; i++){
cin >> x;
sum += x;
}
cout << sum;
11.5 最大值
cin >> n;
cin >> mx;
for (int i = 2; i <= n; i++){
cin >> x;
if (x > mx)
mx = x;
}
cout << mx;
11.6 平均值
double sum = 0;
int cnt = 0;
while (true){
cin >> x;
if (x < 0)
break;
sum += x;
cnt++;
}
cout << sum / cnt;
12. 常见错误诊断
12.1 未初始化
错误:
int sum;
sum += x;
正确:
int sum = 0;
sum += x;
(计数器、累加器、标志变量都要初始化。)
12.2 修改了还要使用的原数
错误:
while (n > 0){
sum += n % 10;
n /= 10;
}
cout << n;
(循环结束后 n 已经变成 0。若还要使用原数,应先备份:int old = n;)
12.3 区间判断写错
错误:1 <= x <= 5
正确:1 <= x && x <= 5
12.4 输出格式多余
错误:cout << " 答案是:" << ans;
正确:cout << ans;
12.5 少读数据
若有 $n$ 个数据,循环常写:for (int i = 1; i <= n; i++)
如果写成:for (int i = 1; i < n; i++) 会少处理一个数据。
12.6 忘记循环变量更新
错误:
while (n > 0){
if (n % 10 == 7)
ok = true;
}
正确:
while (n > 0){
if (n % 10 == 7)
ok = true;
n /= 10;
}
12.7 switch 忘记 break
如果希望每个 case 独立执行,通常要写 break;,否则会继续执行后面的 case。
13. 考前 20 分钟检查顺序
考前最后阶段可以按这个顺序快速过一遍:
1. RAM、ROM、Cache、LAN、WAN、Byte、bit。
2. 流程图五种常见图形。
3. 标识符规则:数字不能开头,减号不能出现,关键字不能作变量名。
4. = 与 ==。
5. / 与 %。
6. ASCII:'0' 是 48,'A' 是 65,'a' 是 97。
7. 字符转数字:ch ‐ '0'。
8. 数字转字符:x + '0'。
9. 区间判断:l <= x && x <= r。
10. break 与 continue。
11. 数位模板:n % 10,n /= 10。
12. 周期题:检查余数 0。
13. 图形题:外层行、内层列、行末换行。
14. 编程题:不输出提示文字。
15. 变量初始化:cnt=0、sum=0、ans=1、ok=false。
14. 一页代码模板
14.1 二级常用头部
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
return 0;
}
14.2 数位和模板
int sumDigit(int x){
int sum = 0;
while (x > 0){
sum += x % 10;
x /= 10;
}
return sum;
}
14.3 是否含数字模板
bool hasDigit(int x, int d){
while (x > 0){
if (x % 10 == d)
return true;
x /= 10;
}
return false;
}
14.4 质数判断模板
bool isPrime(int x){
if (x < 2)
return false;
for (int i = 2; i * i <= x; i++)
if (x % i == 0)
return false;
return true;
}
14.5 最大数位和模板
int n;
cin >> n;
int ans = 0;
for (int i = 1; i <= n; i++){
int x;
cin >> x;
ans = max(ans, sumDigit(x));
}
cout << ans;
14.6 图形输出模板
int n;
cin >> n;
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (i == j)
cout << "+";
else
cout << "‐";
}
cout << "\n";
}
15. 考场做题建议
单选题遇到程序输出,不要直接看选项。先自己手算一遍,再和选项比对。选项常会放入少一个符号、多一个换行、漏掉 continue 后输出等干扰项。
判断题看到 “总是” “一定” “都” “不能” “所有” 时,要找反例。只要能找到一个反例,这句话就应判错。
编程题先写主结构,再补细节。先保证输入读完、循环能结束、输出符合格式,再考虑代码是否更短。二级题不看代码花不花哨,能稳定通过样例和边界才是关键。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com