按 知识点 重新组织 · 总分 50 分 · 25 题 · 适合 12 岁信奥选手
C++ 基础 循环 条件 运算符 数据类型春晚机器人会做空翻 + 站稳 + 保队列。把它当成一台计算机:
| 组件 | 类型 | 说明 |
|---|---|---|
| 重力传感器 | 输入 | 采集重心数据 → 送进 CPU |
| 摄像头 | 输入 | 采集"邻居"画面 → 送进 CPU |
| 遥控器 | 输入 | 接收人的指令 |
| AI 算法程序 | 软件! | 装在内存里跑的代码,不是设备 |
| 电机/扬声器 | 输出 | 让机器人动起来 / 发声 |
int N, max = 0, val;
cin >> N;
while (N) {
cin >> val;
if (val > max) // L1 ←这一行
max = val;
N--;
}
cout << max;
L1 在做"如果 val 大于 max"——这是条件判断,所以画成 菱形 🔷。
if、while 的条件部分 → 一律用菱形。cin / cout → 平行四边形。max = val 这类赋值/计算 → 矩形。
3pi ❌,pi3 ✅)int, for)PI、Pi、pi 是三个不同的变量
double PI = 3.1415926;
cout << (PI);
PI 和 pi 是两个不同变量;Pi";PI 是合法标识符;'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'4' 就是数字 4。
bool a = true;
cout << (10 + a); // 输出 11
true → 1,false → 0。10 + true = 11,10 + false = 10,不会报错。
cout << ((0.1 + 0.2) == 0.3); // 输出 0(假)
== 直接比较浮点数!
if (abs(a - b) < 1e-6) { ... } ← 看差值是否小于一个极小数 ε(epsilon)。
!(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) 等价的是?!x 是先把 x 取反再比较,意思完全变了。! / not / 一元 - → * / % → + - → < <= > >= → == != → && → ||
not i % 3for (int i = -2; i < 2; i++)
if (not i % 3) // 等价于 (!i) % 3,不是 !(i%3)
cout << i << "#";
因为 not(即 !)的优先级比 % 高,所以表达式是 (!i) % 3:
| i | !i | (!i) % 3 | 输出? |
|---|---|---|---|
| -2 | 0 | 0(假) | 否 |
| -1 | 0 | 0 | 否 |
| 0 | 1 | 1(真) | 是 → 0# |
| 1 | 0 | 0 | 否 |
最终输出:0#
!(i % 3) 或者直接 i % 3 == 0,更不容易错。
// while 版
i = 0;
while (i < 5) {
cout << i;
i += 1;
}
// 等价 for 版
for (i = 0; i < 5; i++)
cout << i;
i++。
break | continue | |
|---|---|---|
| 作用 | 跳出当前循环(彻底结束) | 跳过本次剩余语句,进入下一轮 |
| 影响范围 | 只跳出最近的一层循环 | 只影响当前所在循环 |
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#。
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? | 操作 |
|---|---|---|---|---|
| 1 | 9 | 是 | — | continue |
| 2 | 8 | 否 | 否 | 下一轮 |
| 3 | 7 | 否 | 否 | 下一轮 |
| 4 | 6 | 是 | — | continue |
| 5 | 5 | 否 | 是 | break! |
👉 输出 5
cin >> N;
while (N) // 条件只看 N,循环体不改变 N
cout << (N);
for (i = 0; i < 10; i++) {
i += 1;
continue; // 后面没东西了,删了一样
}
continue 之后已经没有任何语句,删除它对结果没有影响 → 判断题:正确。
tnt = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < i; j++)
tnt += 1;
cout << tnt << "#";
}
cout << tnt;
| i | 内层加几次 | tnt | 输出 |
|---|---|---|---|
| 0 | 0 | 0 | 0# |
| 1 | 1 | 1 | 1# |
| 2 | 2 | 3 | 3# |
| 3 | 3 | 6 | 6# |
| 4 | 4 | 10 | 10# |
| 循环结束再输出 tnt | 10 | ||
👉 最终:0#1#3#6#10#10
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 时)。
for (i = 1; i < 5; i++) {
for (j = 1; j < i + 1; j++)
cout << j;
cout << endl;
}
1 12 123 1234
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++ 不认缩进!n % 10 → 取出 最后一位n / 10 → 把 最后一位去掉(整数除法)// 把 12345 的每一位累加进 tnt
tnt = 0;
for (i = 0; i < 5; i++) {
tnt += n % 10; // 取末位加进去
n /= 10; // 去掉末位
}
| 轮 | n%10 | tnt | n/=10 后 |
|---|---|---|---|
| 1 | 5 | 5 | 1234 |
| 2 | 4 | 9 | 123 |
| 3 | 3 | 12 | 12 |
| 4 | 2 | 14 | 1 |
| 5 | 1 | 15 | 0 |
规则: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 << "符合";
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 时计数
}
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 二级好手啦!点选项查看是否正确,再点"显示解析"。
!(a < b || c == d) 等价于?!(a < b) 是 a >= b,不是 a > b。cnt = 0;
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
if (j == 2) continue;
cnt++;
}
}
cout << cnt;
'9' - '0' 的值是?'9'=57, '0'=48, 57-48=9。这是字符转数字的常用技巧!a 和 b 两个 double 变量是否相等,最稳妥的写法?| 大类 | 必背知识点 | 本套真题对应题 |
|---|---|---|
| 计算机基础 | 输入/输出设备、操作系统 | 单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 |