


第8题:for循环结束以后,变量是多少?
题目代码:
int i, cnt = 0;
for (i = 0; i < 10; i++)
cnt += 1;
cout << i << ' ' << cnt;
选项:
A. 10 10
B. 9 9
C. 10 9
D. 9 10
答案:
⭐ A:10 10
① 我们先认识两个"小伙伴"
程序中有:
i
和
cnt
可以把它们想象成两个小盒子。
开始:
i = ?
cnt = 0
② for循环的三个机关
for (i = 0; i < 10; i++)
这个循环有三个部分:
① i = 0 → 出发
② i < 10 → 检查能不能继续
③ i++ → 每走一步,i增加1
循环身体:
cnt += 1;
意思就是:
cnt每次增加 1。
③ 让程序跑起来
| 第几次 | i | cnt |
|---|---|---|
| 1 | 0 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 3 |
| ... | ... | ... |
| 9 | 8 | 9 |
| 10 | 9 | 10 |
第10次循环时:
i = 9
cnt = 9
执行:
cnt += 1;
于是:
cnt = 10
然后最关键的一步来了:
i++
于是:
i = 10
接下来检查:
i < 10
也就是:
10 < 10
答案是:
❌ 假!
所以循环结束。
最终:
i = 10
cnt = 10
输出:
10 10
所以答案:
✅ A
⭐ 一个非常重要的坑
很多孩子会想:
"循环最后一次是
i=9,所以答案应该是 9。"
错!
因为:
for (i = 0; i < 10; i++)
最后一次执行完循环体以后,还会执行 i++。
所以:
循环里面最后一次是 9,循环结束时是 10。
这是一级考试中特别常见的陷阱。
第9题:负数循环 + cnt
题目代码:
int cnt, i;
cnt = 0;
for (i = -10; i < 0; i++)
cnt += 1;
cout << (i * cnt);
选项:
A. -10
B. -9
C. 0
D. 9
答案:
⭐ C:0
① 从哪里开始?
i = -10
cnt = 0
循环条件:
i < 0
② i会经历哪些数字?
-10
-9
-8
-7
-6
-5
-4
-3
-2
-1
这些数字都满足:
i < 0
所以一共循环:
10次
每次:
cnt += 1;
所以最后:
cnt = 10
③ 循环结束的时候,i是多少?
最后一次:
i = -1
循环体执行完后:
i++
于是:
i = 0
然后检查:
0 < 0
❌ 不成立。
所以循环结束。
④ 最后的计算
程序:
cout << (i * cnt);
此时:
i = 0
cnt = 10
所以:
0 × 10 = 0
答案:
✅ C
🧠 记住一个规律
对于:
for (i = -10; i < 0; i++)
结束的时候:
i不是 -1,而是 0!
因为最后还有一次:
i++
这就是第8题和第9题共同考查的:
"循环结束时,循环变量到底是多少?"
第10题:continue遇到谁?break又遇到谁?
这道题非常经典。
代码:
int i;
for (i = 1; i < 5; i++) {
if (i % 3 == 0) {
printf("%d+", i);
continue;
} else {
printf("%d-", i);
break;
}
}
printf("%dEND*", i);
选项:
A. 1-1
B. 1 - 1 END*
C. 1+1-2-2END*
D. 1-1END*
答案:
⭐ D
🧙♂️ 这里有两个魔法按钮
continue
意思:
这一次不玩了,直接进入下一轮循环。
break
意思:
别玩了!整个循环结束!
可以记成:
continue= 跳过本轮
break= 直接退场
现在开始执行
初始:
i = 1
判断:
1 % 3 == 0
显然:
1 % 3 = 1
所以条件不成立,进入:
else
执行:
printf("%d-", i);
输出:
1-
然后:
break;
💥 整个循环立即结束!
注意!
因为 break 已经把循环结束了,所以:
i = 2
还没发生。
程序直接来到:
printf("%dEND*", i);
此时:
i = 1
所以输出:
1-1END*
答案:
✅ D
⭐ 小口诀
看到:
continue;
想:
🚪 "这一轮出去,下一轮再来。"
看到:
break;
想:
🚪 "整座循环大门关闭!"
第11题:while循环到底会循环几次?
代码:
int N, tot;
cin >> N;
tot = 0;
while (N > 0) {
cout << N << "#";
tot += 1;
N -= 1;
}
cout << tot << "-END";
题目问:
下面说法错误的是哪一个?
选项:
A
输入 3:
3#2#1#3-END
B
输入 -10:
0-END
C
输入 0:
0-END
D
输入 1:
1#0-END
答案:
⭐ D
我们一个一个检查
A:输入3
开始:
N = 3
tot = 0
第1次
输出:
3#
然后:
tot = 1
N = 2
第2次
输出:
2#
然后:
tot = 2
N = 1
第3次
输出:
1#
然后:
tot = 3
N = 0
现在:
N > 0
变成:
0 > 0
❌
循环结束。
最后:
cout << tot << "-END";
输出:
3-END
所以:
3#2#1#3-END
A正确。
B:输入 -10
一开始:
N = -10
检查:
N > 0
即:
-10 > 0
❌
一次循环都不进入。
所以:
tot = 0
输出:
0-END
B正确。
C:输入0
同样:
0 > 0
❌
所以:
0-END
C正确。
D:输入1
开始:
N = 1
tot = 0
循环:
输出 1#
tot = 1
N = 0
最后:
1-END
所以完整输出:
1#1-END
而不是:
1#0-END
所以:
❌ D错误
答案:
✅ D
🧠 这道题最容易错在哪里?
有的同学很容易把:
N
和:
tot
搞混。
实际上:
-
N:倒计时 -
tot:计数器
可以想象:
N是"小火箭倒计时",每次减1;
tot是"小记者",每完成一次循环就记1笔。
第12题:用 printf 打印连续数字
题目输入:
35
要求输出:
35 34 33 32 31 30 29 28 27 26
25 24 23 22 21 20 19 18 17 16
15 14 13 12 11 10 9 8 7 6
5 4 3 2 1
代码:
int N, tot, i;
cin >> N;
tot = 0;
for (i = 0; i < N; i++) {
printf(__________);
tot = tot + 1;
if (tot % 10 == 0)
printf("\n");
}
选项:
A. "%3d", N
B. "%3d", N - i
C. N - i
D. N
答案:
⭐ B
先搞清楚两个变量
输入:
N = 35
N从头到尾都是:
35
而:
i
会:
0
1
2
3
4
...
题目要求:
35
34
33
32
...
1
那么我们可以观察:
35 - 0 = 35
35 - 1 = 34
35 - 2 = 33
35 - 3 = 32
是不是刚刚好?
所以应该打印:
N - i
为什么还要 "%3d"?
选项 B:
"%3d", N - i
这里:
%3d
意思是:
用至少3个字符的位置来打印整数。
例如:
35
前面会留一个空格:
35
这样:
35 34 33 ...
数字排列会更加整齐。
⭐ 再看每10个换一行
if (tot % 10 == 0)
printf("\n");
当:
tot = 10
换行。
当:
tot = 20
再换行。
当:
tot = 30
再换行。
所以最终正好是:
35~26
25~16
15~6
5~1
答案:
✅ B
第13题:continue之后,后面的代码还执行吗?
代码:
int k = 0;
while (k < 8) {
k += 2;
continue;
if (k > 5)
break;
cout << k << "#";
}
if (k >= 8)
cout << "FINISH";
选项:
A. FINISH
B. 2#4#6#FINISH
C. 2#4#FINISH
D. 2#4#6#8#FINISH
答案:
⭐ A
这里有一个超级重要的陷阱
程序:
k += 2;
continue;
if (k > 5)
break;
cout << k << "#";
看到:
continue;
之后:
下面的代码本轮全部不执行!
也就是说:
if (k > 5)
不会执行。
cout << k << "#";
也不会执行。
让程序跑起来
初始:
k = 0
进入:
k < 8
成立。
执行:
k += 2;
变成:
k = 2
然后:
continue;
💨 直接回到 while 条件。
第二轮:
k = 2
加2:
k = 4
continue
第三轮:
k = 4
加2:
k = 6
continue
第四轮:
k = 6
加2:
k = 8
continue
再检查:
k < 8
也就是:
8 < 8
❌
循环结束。
注意:
整个过程中,
cout << k << "#";一次都没有执行!
最后:
if (k >= 8)
成立。
所以输出:
FINISH
答案:
✅ A
🧠 一句话记忆
continue像"传送门":一出现,后面的代码全部跳过,直接开始下一轮。
第14题:如何找到一个数的"第M位"?
这是这一组题里非常值得掌握的一题。
题目:
给一个正整数
N,求它从右往左第M位。
例如:
N = 123456
从右往左:
第1位:6
第2位:5
第3位:4
第4位:3
第5位:2
第6位:1
代码:
int N, M, M10;
cin >> N;
cin >> M;
M10 = 1;
for (; M > 1; M--)
M10 *= 10;
cout << __________;
选项:
A. N / M10 % 10
B. N / M10 / 10
C. N % M10 % 10
D. N % M10 / 10
答案:
⭐ A
先理解 M10 是干什么的
开始:
M10 = 1
如果:
M = 1
不用循环:
M10 = 1
如果:
M = 2
循环一次:
M10 = 10
如果:
M = 3
循环两次:
M10 = 100
如果:
M = 4
得到:
M10 = 1000
所以:
M10 = 10^(M-1)
🌟 举个例子
假设:
N = 123456
M = 3
我们要找:
第3位
答案应该:
4
第一步:除以100
因为:
M10 = 100
所以:
123456 / 100
整数除法得到:
1234
第二步:再 % 10
1234 % 10
得到:
4
刚好就是我们想要的数字!
所以:
N / M10 % 10
答案:
✅ A
🧙♂️ 记忆方法
求:
从右往左第M位
可以想象:
先用
/把右边不需要的数字切掉。
然后:
再用
% 10把最后一位抓出来。
所以:
N
↓
除以10^(M-1)
↓
%10
↓
得到目标数字
口诀:
"除掉右边,留下目标;再取10,抓住一位。"
第15题:鸡兔同笼,程序哪里出了问题?
这道题非常有意思。
题目:
tou表示鸡和兔的头总数,jiao表示脚总数。判断下面程序的说法哪个正确。
程序:
int tou, jiao, tu_tou, ji_tou;
cin >> tou;
cin >> jiao;
for (tu_tou = 0; tu_tou < tou + 1; tu_tou++) {
ji_tou = tou - tu_tou;
if (tu_tou * 4 + ji_tou * 2 == jiao) {
printf("兔的数量=%d,鸡的数量=%d\n",
tu_tou, ji_tou);
break;
}
}
if (tu_tou == tou)
printf("无解\n");
选项:
A. 能求解鸡兔同笼。
B. ji_tou 没有初始化,在 L1 前增加 ji_tou = 0; 即可求解。
C. 将 tu_tou < tou + 1 改为 tu_tou < tou 即可求解。
D. 将 tu_tou == tou 改为 tu_tou == tou + 1 即可求解。
答案:
⭐ D
第一步:程序的思路其实是对的
假设:
头有10个
那么兔子的数量可以一个一个试:
兔0只
兔1只
兔2只
兔3只
...
兔10只
如果兔子有:
tu_tou
那么鸡就是:
ji_tou = tou - tu_tou
因为:
鸡 + 兔 = 总头数
第二步:检查脚的数量
鸡:
2只脚
兔:
4只脚
所以:
tu_tou * 4 + ji_tou * 2
就是总脚数。
如果:
总脚数 == jiao
就找到了答案。
这个思路本身没问题。
🚨 真正的BUG在哪里?
看:
for (tu_tou = 0; tu_tou < tou + 1; tu_tou++)
它会尝试:
0
1
2
...
tou
这是合理的。
因为有一种特殊情况:
全部都是兔子。
比如:
tou = 3
可能:
兔 = 3
鸡 = 0
所以必须允许:
tu_tou = tou
因此不能把:
tu_tou < tou + 1
改成:
tu_tou < tou
否则:
❌ 全部都是兔子的情况就永远检查不到。
所以 C 错。
🚨 那么问题在哪里?
看最后:
if (tu_tou == tou)
printf("无解\n");
假如:
兔 = tou
鸡 = 0
那么程序已经找到了答案,并且:
break;
跳出来。
但是:
tu_tou == tou
依然成立!
于是程序会:
先说"找到答案了!"
然后:
又说"无解!"
这就出问题了。
🎯 怎么解决?
循环结束以后,如果:
tu_tou == tou + 1
才说明:
所有可能的兔子数量都尝试过了,仍然没有找到答案。
为什么?
因为循环:
for (tu_tou = 0; tu_tou < tou + 1; tu_tou++)
如果没有 break:
tu_tou:
0
1
2
...
tou
tou+1
最后才退出。
所以:
if (tu_tou == tou + 1)
才代表:
真的无解。
因此:
✅ D正确
🌟 8~15题考点地图
| 题号 | 主要考点 | 小朋友要掌握什么 |
|---|---|---|
| 8 | for循环 |
循环结束后变量会怎样 |
| 9 | for循环 |
最后一次 i++ |
| 10 | continue、break |
一个跳本轮,一个结束循环 |
| 11 | while |
条件什么时候成立、什么时候结束 |
| 12 | printf、% |
N-i、每10个换行 |
| 13 | continue |
continue后面的代码本轮不执行 |
| 14 | 数字拆位 | /10、%10 |
| 15 | 枚举 | 一个一个尝试 + 找到答案 break |
🧠 最后送给大家一套"8~15题通关口诀"
① for循环
先初始化,再看条件,执行身体,最后更新。
② break
循环立刻结束!
🚪相当于:
"我不玩了,直接回家!"
③ continue
跳过这一轮,下一轮继续。
🚪相当于:
"这一关先跳过,下一关见!"
④ %10
抓个位!
例如:
123 % 10
得到:
3
⑤ /10
砍掉个位!
123 / 10
得到:
12
⑥ 求第M位
先
/10^(M-1),再%10。
即:
N / M10 % 10
⑦ 枚举
一个一个试,试到正确答案就
break。
🎯 最值得孩子形成的"程序阅读习惯"
以后遇到阅读程序题,千万不要一眼看答案。
让孩子拿一支笔,在草稿纸上画:
变量初值
↓
第1轮
↓
变量变化
↓
第2轮
↓
变量变化
↓
......
↓
循环结束时变量是多少?
↓
最后输出什么?
尤其要牢牢记住:
"循环体最后执行完,不代表循环变量停在那里。"
因为后面还有:
i++
以及:
continue会跳过后面的代码,break会直接结束整个循环。
这几个小陷阱,正是一级考试里非常喜欢考的地方。








