火龙信奥
  • 分享
  • 课程
  • 题库
  • CSES
    • GESP
    • CSP
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • e课堂
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

附录 A 二级真题模型速查与错题诊断

作者: 作者的头像   huolong , 时间:2026-09-08 10:07:45 , 所有人可见, 阅读  10

附录 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

关于火龙

  • 关于我们
  • 学员获奖
  • 预约试听
  • ACM课程
  • CSP课程
  • 学习指南

帮助中心

  • 用户协议
  • 打字练习 HOT
  • 在线画图
  • DevC++下载
  • CSP报名
  • GESP官网

推荐课程

  • C++零基础入门(可试看)
  • C++进阶提升
  • GESP考级辅导
  • GESP打卡
  • CSP-J/S打卡

公众号

火龙信奥公众号二维码

© 2017-2026 义乌市睿码科技有限公司版权所有 浙ICP备2021013995号

火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码