🎓 GESP 二级 · 2026年3月真题 课堂讲义

知识点 重新组织 · 总分 50 分 · 25 题 · 适合 12 岁信奥选手

C++ 基础 循环 条件 运算符 数据类型
你好呀!我是讲义小助手 BOT 同学 🤖。这份讲义会把 25 道题里的 知识点 拆出来一个个讲清楚。每一节都有:
① 知识讲解 ② 真题例题 ③ 易错点提醒 ④ 交互小测验。试着自己先做做看!

📚 目录(共 9 个知识专题)

  1. 计算机系统的组成 —— 谁是输入设备?
  2. 流程图的图形与含义
  3. C++ 标识符规则与大小写敏感
  4. 数据类型陷阱:字符、bool、浮点
  5. 逻辑运算与德摩根律
  6. 运算符优先级 —— 不加括号会翻车
  7. 循环大乱斗:for / while / break / continue
  8. 嵌套循环与图形输出
  9. 综合应用:数字位拆解、条件统计、格式化输出

1️⃣ 计算机系统的组成 —— 谁是输入设备?

一台计算机 = 硬件 + 软件。硬件分五大件:
① 输入设备(鼠标、键盘、传感器、摄像头、麦克风、遥控器…)
② 输出设备(显示器、音箱、打印机、电机…)
③ 存储器(内存、硬盘)
④ 运算器 + ⑤ 控制器(合称 CPU)
程序 / 算法 / 操作系统 都属于 软件,不是任何一种"设备"。

🎬 真题场景:2026 春晚《武 BOT》

春晚机器人会做空翻 + 站稳 + 保队列。把它当成一台计算机:

组件类型说明
重力传感器输入采集重心数据 → 送进 CPU
摄像头输入采集"邻居"画面 → 送进 CPU
遥控器输入接收人的指令
AI 算法程序软件!装在内存里跑的代码,不是设备
电机/扬声器输出让机器人动起来 / 发声
区分"硬件"和"软件"的口诀:能摸到的是硬件,跑起来的是软件。
程序、算法、模型、操作系统 → 全是软件。
🧠 小测验:哪一项不能作为输入设备?
  • A. 重力传感器
  • B. 预装的 AI 算法程序
  • C. 接收指令的遥控器
  • D. 拍摄画面的摄像头
✅ 答案 B。"算法程序"是软件,不属于任何硬件设备。
📌 拓展:判断题——电话手表里有操作系统吗? 电话手表能打电话、收信息、运行多种应用,必须有一个"管家"协调硬件与软件,这个"管家"就是 嵌入式操作系统(比如 Wear OS、RTOS)。
👉 答案:正确。不是只有电脑/手机才有操作系统,路由器、电视、汽车、智能手表 里都有。

2️⃣ 流程图的图形与含义

流程图四大基础图形,形状不同含义不同,背熟它!
椭圆 / 圆角
开始 / 结束
平行四边形
输入 / 输出
矩形
处理 / 赋值
菱形
判断 / 条件

🎬 真题例题

int N, max = 0, val;
cin >> N;
while (N) {
    cin >> val;
    if (val > max)   // L1 ←这一行
        max = val;
    N--;
}
cout << max;

L1 在做"如果 val 大于 max"——这是条件判断,所以画成 菱形 🔷。

看到 ifwhile 的条件部分 → 一律用菱形。
看到 cin / cout → 平行四边形。
看到 max = val 这类赋值/计算 → 矩形。

3️⃣ C++ 标识符规则与大小写敏感

C++ 的变量名、函数名(统称标识符)规则:
✅ 只能由 字母、数字、下划线 组成
✅ 不能以数字开头(3pi ❌,pi3 ✅)
✅ 不能与 关键字 冲突(如 int, for
大小写敏感!PIPipi 是三个不同的变量

🎬 真题例题

double PI = 3.1415926;
cout << (PI);
下列说法哪个是对的?
  • A. cout << (PI)cout << (pi) 效果相同
  • B. 把 PI 改成 Pi 仍能正常运行
  • C. PI 不能作为变量名
  • D. 把程序中全部 PI 都改成 Pai,仍能正常运行
✅ 答案 D。
A ❌ 大小写敏感,PIpi 是两个不同变量;
B ❌ 只改一处会导致"用了未定义的 Pi";
C ❌ PI 是合法标识符;
D ✅ 只要把"声明"和"使用"全部一起改名,程序仍能正常工作。
变量名就像同学的名字 —— 小明 ≠ 小Ming ≠ 小MING。如果你要给小明改名叫小红,那叫他的所有地方都要一起改!

4️⃣ 数据类型陷阱:字符、bool、浮点

🔸 子知识点 A:字符常量 = ASCII 码

单引号包起来的就是 字符常量,参与算术运算时按 ASCII 码 处理。
记住几个:'0'=48 '1'=49 '2'=50 … '9'=57 
'A'=65 'a'=97 空格 ' '=32
🎬 例题:'4' % '2' == '2' * '2' % 2 输出是 1 吗?
  • '4' % '2' = 52 % 50 = 2
  • '2' * '2' % 2 = 50 × 50 % 2 = 2500 % 2 = 0
  • 2 == 0 → 假 → 输出 0
👉 判断题答案:错误。陷阱在于以为 '4' 就是数字 4。

🔸 子知识点 B:bool 会自动变成 0 / 1

bool a = true;
cout << (10 + a);   // 输出 11
bool 类型在算术运算中会隐式转换true → 1false → 0
所以 10 + true = 1110 + false = 10不会报错

🔸 子知识点 C:浮点数精度 —— 0.1 + 0.2 ≠ 0.3 ?!

cout << ((0.1 + 0.2) == 0.3);   // 输出 0(假)
计算机用 二进制 存浮点数,而 0.1、0.2、0.3 在二进制下都是无限循环,只能近似存储,所以会有微小误差。
👉 永远不要用 == 直接比较浮点数!
比较浮点数的标准做法:
if (abs(a - b) < 1e-6) { ... } ← 看差值是否小于一个极小数 ε(epsilon)。

5️⃣ 逻辑运算与德摩根律

三大逻辑运算:
&&(与):两个都真才真
||(或):至少一个真就真
!(非):真变假、假变真

🌟 德摩根律(取反公式)
!(A && B) ≡ (!A) || (!B)
!(A || B) ≡ (!A) && (!B)
口诀:取反时——括号扒开,每项都取反,"且"变"或","或"变"且"

🎬 真题例题

化简 !(x > 5 && y <= 10)

步骤表达式
原式!(x > 5 && y <= 10)
扒开括号(!(x > 5)) || (!(y <= 10))
每项取反(x <= 5) || (y > 10)
问:与 !(x > 5 && y <= 10) 等价的是?
  • A. x <= 5 && y > 10
  • B. x > 5 || y <= 10
  • C. x <= 5 || y > 10
  • D. !x > 5 && !y <= 10
✅ 答案 C。注意 D 是错的——!x 是先把 x 取反再比较,意思完全变了。

6️⃣ 运算符优先级 —— 不加括号会翻车

常考优先级(从高到低):
! / not / 一元 - → * / % → + - → < <= > >= → == != → && → ||

🎬 真题陷阱:not i % 3

for (int i = -2; i < 2; i++)
    if (not i % 3)         // 等价于 (!i) % 3,不是 !(i%3)
        cout << i << "#";

因为 not(即 !)的优先级比 % 高,所以表达式是 (!i) % 3

i!i(!i) % 3输出?
-200(假)
-100
011(真)是 → 0#
100

最终输出:0#

只要拿不准优先级,就加括号!想表达"i 能被 3 整除" → 写 !(i % 3) 或者直接 i % 3 == 0,更不容易错。

7️⃣ 循环大乱斗:for / while / break / continue

🔸 子知识点 A:while ↔ for 等价转换

// while 版
i = 0;
while (i < 5) {
    cout << i;
    i += 1;
}
// 等价 for 版
for (i = 0; i < 5; i++)
    cout << i;
for 的三段结构 = 初始化 + 条件 + 步进,正好对应 while 之前的赋值、while 的条件、while 内的 i++

🔸 子知识点 B:break vs continue 一定要分清!

breakcontinue
作用跳出当前循环(彻底结束)跳过本次剩余语句,进入下一轮
影响范围只跳出最近的一层循环只影响当前所在循环

🎬 真题例题 1:break 只跳一层!

int cnt = 0, i, j;
for (i = 1; i < 5; i++) {
    for (j = 0; j < i; j++)
        cout << j << "#";
    break;       // ← 跳出的是外层 for
}
if (i >= 5)
    cout << (i * j);

分析:i=1 时内层输出 0#,然后 break 跳出外层 for。此时 i=1 不满足 i>=5,所以最终输出只有 0#

🎬 真题例题 2:continue 与计数器

int n = 10;
while (n > 0) {
    n -= 1;
    if (n % 3 == 0) continue;   // 跳过本轮剩余
    if (n == 5) break;          // 退出循环
}
cout << n;
进入循环n -= 1 后n%3==0?n==5?操作
19continue
28下一轮
37下一轮
46continue
55break!

👉 输出 5

🔸 子知识点 C:死循环

cin >> N;
while (N)           // 条件只看 N,循环体不改变 N
    cout << (N);
循环体没有让条件"变假"的语句 → 死循环
判断题答案:执行 0 次(N=0 时)或无限次(N≠0 时),正确
👉 写循环时一定要检查:"条件变量"会不会变?

🔸 子知识点 D:continue 没作用的情况

for (i = 0; i < 10; i++) {
    i += 1;
    continue;     // 后面没东西了,删了一样
}

continue 之后已经没有任何语句,删除它对结果没有影响 → 判断题:正确

8️⃣ 嵌套循环与图形输出

🎬 例题 1:累加金字塔

tnt = 0;
for (int i = 0; i < 5; i++) {
    for (int j = 0; j < i; j++)
        tnt += 1;
    cout << tnt << "#";
}
cout << tnt;
i内层加几次tnt输出
0000#
1111#
2233#
3366#
441010#
循环结束再输出 tnt10

👉 最终:0#1#3#6#10#10

🎬 例题 2:循环里改 i —— 坑!

cnt = 0;
for (i = 0; i < 5; i++) {
    i = -i;                      // 把 i 变负
    for (j = i; j < -i; j++)
        cnt += 1;             // 内层共跑 (-i)-i = -2i 次
    i = -i;                      // 改回正数
}

外层 i = 0,1,2,3,4,每次内层跑 0+2+4+6+8 = 20 次。

判断循环次数的公式:
for (j = a; j < b; j++)b - a 次(当 b > a 时)。

🎬 例题 3:经典数字三角形

for (i = 1; i < 5; i++) {
    for (j = 1; j < i + 1; j++)
        cout << j;
    cout << endl;
}
1
12
123
1234
两层循环画图的套路:外层管"行",内层管"列"。改一改内层输出的内容,可以画出各种形状。

🎬 例题 4:缩进不等于结构!

for (i = 1; i < 10; i++)
    for (j = 0; j < i; j++)
        if (i * j % 10 == 0)
            break;             // 内层 for 的语句就是这个 if
if (i >= 10)              // ←这个 if 已经在循环外面了!
    cout << (i * j);
没有 { } 时,for / if 后面只跟着紧挨的一条语句。缩进只是给人看的,C++ 不认缩进!
👉 写代码时一定记得:要执行多条语句就加大括号

9️⃣ 综合应用:位拆解、条件统计、格式化输出

🔸 子知识点 A:拆数字的每一位

两大法宝:
n % 10 → 取出 最后一位
n / 10 → 把 最后一位去掉(整数除法)
循环使用,就能把整数从右往左一位一位拆开。
// 把 12345 的每一位累加进 tnt
tnt = 0;
for (i = 0; i < 5; i++) {
    tnt += n % 10;       // 取末位加进去
    n /= 10;             // 去掉末位
}
n%10tntn/=10 后
1551234
249123
331212
42141
51150

🎬 真题应用:图书馆借阅卡校验码

规则:6 位卡号,前 5 位相加 % 10 = 第 6 位。比如 123455(1+2+3+4+5=15,15%10=5 ✓)。

order_num = N / 10;     // 前5位
check_num = N % 10;     // 第6位
tnt = 0;
for (i = 0; i < 5; i++) {
    tnt += order_num % 10;   // ← 填空 1
    order_num /= 10;
}
if (tnt % 10 == check_num)  // ← 填空 2
    cout << "符合";

🔸 子知识点 B:条件统计套路

"一边输入,一边判断,一边统计"的模板:
total = 0;     // 累加器
count = 0;     // 计数器
for (...) {
    cin >> x;
    total += x;                // 每次都累加
    if (满足条件) count += 1;  // 满足才计数
}

真题:8 位评委打分,分数 ≥6 的评委 ≥5 人才算有效,最终得分 = 总分。

for (i = 0; i < 8; i++) {
    cin >> score;
    total_score += score;     // 总是累加
    if (score >= 6)
        high_count += 1;     // 只在 ≥6 时计数
}

🔸 子知识点 C:printf 字段宽度

printf(" %d", x) → 数字前加一个空格,不等宽
printf("%3d", x) → 输出宽度为 3(右对齐,不足补空格),所有列都对齐!
用 " %d"        用 "%3d"
1 2 3 4 5       1 2 3 4 5
2 4 6 8 10      2 4 6 8 10  ← 两位数也对齐
3 6 9 12 15     3 6 9 12 15

🏆 终极闯关:综合小测

下面 5 道题覆盖了今天所有知识点,全部答对就是 GESP 二级好手啦!点选项查看是否正确,再点"显示解析"。

Q1. 关于 C++ 标识符,正确的是?
  • A. 大小写不敏感
  • B. 可以以数字开头
  • C. 区分大小写,PI 和 pi 是两个不同变量
  • D. 不能包含下划线
✅ C。C++ 严格区分大小写;标识符可以包含字母/数字/下划线但不能以数字开头。
Q2. 表达式 !(a < b || c == d) 等价于?
  • A. a >= b || c != d
  • B. a < b && c == d
  • C. a >= b && c != d
  • D. a > b && c != d
✅ C。德摩根律:每项取反 + 或→与。注意 !(a < b)a >= b,不是 a > b
Q3. 下面代码输出?
cnt = 0;
for (i = 1; i <= 3; i++) {
    for (j = 1; j <= 3; j++) {
        if (j == 2) continue;
        cnt++;
    }
}
cout << cnt;
  • A. 9
  • B. 6
  • C. 3
  • D. 0
✅ B。每轮 j=1,2,3,j=2 时跳过 → 每轮 +2;3 轮共 6。
Q4. '9' - '0' 的值是?
  • A. '9'
  • B. 编译错误
  • C. 9
  • D. 57
✅ C。'9'=57, '0'=48, 57-48=9。这是字符转数字的常用技巧!
Q5. 如果想比较 ab 两个 double 变量是否相等,最稳妥的写法?
  • A. if (a == b)
  • B. if (a - b == 0)
  • C. if (abs(a - b) < 1e-6)
  • D. if (!(a - b))
✅ C。浮点数有精度误差,只能判断"差值足够小"。

🗺️ 二级核心知识地图(请收藏)

大类必背知识点本套真题对应题
计算机基础输入/输出设备、操作系统单1, 判1
流程图椭圆/平行四边形/矩形/菱形单2
标识符大小写敏感、合法字符单3
数据类型字符→ASCII、bool→0/1、浮点精度单5, 判2, 判3
逻辑运算德摩根律单4
运算符优先级! > % > 比较 > && > ||单7
循环控制for/while 转换、break/continue单8,9,10,11, 判4,5,6
嵌套循环循环次数计算、循环内改 i、缩进≠结构单6,12,14, 判8,9
算法套路数字位拆解、条件统计单13, 单15
输出格式printf 字段宽度 %3d判10