第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-ENDB
输入-10:
0-ENDC
输入0:
0-ENDD
输入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-ENDA正确。
B:输入 -10
一开始:
N = -10检查:
N > 0即:
-10 > 0❌
一次循环都不进入。
所以:
tot = 0输出:
0-ENDB正确。
C:输入0
同样:
0 > 0❌
所以:
0-ENDC正确。
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 = 35N从头到尾都是:
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 = 4continue
第三轮:
k = 4加2:
k = 6continue
第四轮:
k = 6加2:
k = 8continue
再检查:
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会直接结束整个循环。
这几个小陷阱,正是一级考试里非常喜欢考的地方。