🚀 While循环------当"不确定"时怎么办?**
🌟 一、课前小故事:While就像"吃薯片停不下来"
想象一下,你有一包薯片,妈妈说:"只要还有薯片 ,你就可以继续吃 !"
这个"只要...就..."就是while循环的精髓!
🔄 二、认识新朋友:while循环
🤔 while循环是什么?
cpp
while (条件) {
// 条件成立时就重复执行!
}
🎯 形象比喻:
- while = "当...的时候"
- 条件 = 一个"开关"
- 循环体 = 重复做的动作
📖 生活例子:
- 看电视 :
while (还没到9点) { 继续看电视 } - 写作业 :
while (作业没写完) { 继续写作业 } - 吃糖果 :
while (嘴里还有糖) { 继续吃 }
🔍 三、while vs for 大比拼
| 循环类型 | 适合场景 | 例子 | 特点 |
|---|---|---|---|
| for循环 | 知道具体次数 | 翻10个跟斗 | 有明确的"终点站" |
| while循环 | 不知道次数,只看条件 | 吃到饱为止 | 条件说了算! |
💡 记忆口诀:
"for 循环数得清,while 循环看心情;
条件成立就一直做,不成立时就喊停!"
🔄 While循环特别篇:++i vs i++ 大揭秘!
🎯 1、什么是"自增"?
🤔 自增运算符是什么?
i++或++i都表示:i = i + 1- 就像游戏里的"升级"按钮,按一下等级+1!
🎮 生活例子:
cpp
int 糖果数 = 5;
糖果数++; // 现在有6颗糖果了!
🔍 2、i++ 和 ++i 的区别大比拼
📖 核心区别:
i++:先用后加(先使用i的值,再让i+1)++i:先加后用(先让i+1,再使用i的值)
🎯 形象比喻:
例子1:排队取餐
cpp
int 我的号码 = 5;
// i++:先取餐,再叫下一个号
cout << "我的号码是:" << 我的号码++; // 显示5,然后变成6
// ++i:先叫下一个号,再取餐
cout << "我的号码是:" << ++我的号码; // 先变成6,再显示6
例子2:数手指头
cpp
int 手指头 = 0;
// 方法A:i++
cout << "现在数到第" << 手指头++ << "根手指"; // 显示0,然后手指头=1
cout << "现在数到第" << 手指头++ << "根手指"; // 显示1,然后手指头=2
// 方法B:++i
cout << "现在数到第" << ++手指头 << "根手指"; // 手指头先变成3,再显示3
💻 3、代码实验
🔬 实验1:基础对比
cpp
#include <iostream>
using namespace std;
int main() {
int a = 5;
int b = 5;
cout << "实验开始!" << endl;
cout << "初始值:a=" << a << ", b=" << b << endl << endl;
// 使用i++
cout << "使用 a++:" << endl;
cout << "输出 a++:" << a++ << endl; // 输出5
cout << "现在 a=" << a << endl << endl; // 输出6
// 使用++i
cout << "使用 ++b:" << endl;
cout << "输出 ++b:" << ++b << endl; // 输出6
cout << "现在 b=" << b << endl; // 输出6
return 0;
}
📊 运行结果:
实验开始!
初始值:a=5, b=5
使用 a++:
输出 a++:5
现在 a=6
使用 ++b:
输出 ++b:6
现在 b=6
🔬 实验2:在循环中的表现
cpp
#include <iostream>
using namespace std;
int main() {
cout << "=== while循环测试 ===" << endl;
// 方法1:使用i++
cout << "\n方法1:while (i < 3) { i++ }" << endl;
int i = 0;
while (i < 3) {
cout << "循环中:i=" << i << endl;
i++; // 循环结束后i+1
}
cout << "循环结束:i=" << i << endl;
// 方法2:使用++i
cout << "\n方法2:while (j < 3) { ++j }" << endl;
int j = 0;
while (j < 3) {
cout << "循环中:j=" << j << endl;
++j; // 循环结束后j+1
}
cout << "循环结束:j=" << j << endl;
return 0;
}
💡 发现: 在while循环中,i++和++i效果一样!因为:
- 它们都在语句执行完后才改变i的值
- while只关心条件判断时的i值
🎮 4、游戏:猜猜输出结果
🎯 游戏1:数学大挑战
cpp
int x = 5;
int y = x++ + ++x;
cout << "y = " << y;
🤔 想一想:y等于多少?
🧠 解题步骤:
x++:先使用x=5,然后x变成6++x:先把x从6变成7,然后使用x=7y = 5 + 7 = 12- 答案:y=12,x=7
🎯 游戏2:循环猜谜
cpp
int i = 0;
while (i++ < 3) {
cout << i << " ";
}
🤔 输出什么?
🧠 解题步骤:
- 第一次:
i++ < 3→ 0<3成立,i变成1,输出1 - 第二次:
i++ < 3→ 1<3成立,i变成2,输出2 - 第三次:
i++ < 3→ 2<3成立,i变成3,输出3 - 第四次:
i++ < 3→ 3<3不成立,退出 - 答案:输出"1 2 3"
🎯 游戏3:换个写法
cpp
int i = 0;
while (++i < 3) {
cout << i << " ";
}
🤔 这次输出什么?
🧠 解题步骤:
- 第一次:
++i < 3→ i先变成1,1<3成立,输出1 - 第二次:
++i < 3→ i先变成2,2<3成立,输出2 - 第三次:
++i < 3→ i先变成3,3<3不成立,退出 - 答案:输出"1 2"
📝 5、实际应用场景
✅ 场景1:数组遍历(推荐++i)
cpp
int scores[5] = {90, 85, 95, 88, 92};
for (int i = 0; i < 5; ++i) { // 通常用++i,效率稍高
cout << "第" << i+1 << "个成绩:" << scores[i] << endl;
}
✅ 场景2:计数器
cpp
int 点赞数 = 0;
// 有人点赞
点赞数++; // 更直观:点赞数增加
cout << "当前点赞数:" << 点赞数;
✅ 场景3:游戏生命值
cpp
int 生命值 = 3;
// 被攻击
生命值--; // 同理:--生命值 和 生命值-- 的区别
if (生命值 <= 0) {
cout << "游戏结束!";
}
🚨 6、常见错误和注意事项
❌ 错误1:在复杂表达式中混用
cpp
int a = 1;
int b = a++ + a++; // ❌ 不要这样写!结果不确定
❌ 错误2:改变循环变量
cpp
for (int i = 0; i < 10; i++) {
i = i + 2; // ❌ 在循环内修改i,可能导致死循环或跳过循环
}
✅ 最佳实践:
- 简单情况 :单独一行使用,
i++和++i效果一样 - 复杂表达式:避免在复杂表达式中使用自增
- 循环中 :
for循环通常用++i(效率稍高) - 可读性 :
i++更符合英语习惯("i plus plus")
🎓 7、记忆口诀
📚 口诀1:
i++ 是 "先用再加" → "先做事,再升级"
++i 是 "先加再用" → "先升级,再做事"
📚 口诀2:
后加加(i++):先展示,后增加
前加加(++i):先增加,后展示
📚 口诀3(while循环专用):
while循环看条件,i++/++i放后面;
条件判断在前头,自增顺序无影响;
若是放在条件里,一定小心看仔细!
🧩 8、小测验
📝 测验1:填空题
cpp
int m = 5, n = 5;
int result1 = m++ * 2; // result1 = ______, m = ______
int result2 = ++n * 2; // result2 = ______, n = ______
答案:
- result1 = 10, m = 6
- result2 = 12, n = 6
📝 测验2:选择题
以下代码输出什么?
cpp
int k = 3;
while (k-- > 0) {
cout << k << " ";
}
A) 3 2 1
B) 2 1 0
C) 3 2 1 0
D) 2 1 0 -1
答案:B) 2 1 0
⚠️ 注意:
- 对于初学者,建议先掌握一种 (如
i++) - 复杂用法(如
a = i++ + ++i)暂时不要求掌握 - 重点是理解执行顺序的概念
✨ 总结:三句话记住
i++:先做事,后加1(像"先吃饭,再洗碗")++i:先加1,后做事(像"先洗碗,再吃饭")- 循环中:通常放循环末尾,两者效果一样
🎮 四、闯关任务
🔢 第一关:P2020《第几项》
📖 情景故事:
小明的储蓄罐计划:
- 第1天存1元
- 第2天存2元
- 第3天存3元
- ...
问题 :存到多少钱时,总数会第一次超过100元?
🧠 思维过程:
- 初始化:总钱数 = 0,天数 = 0
- 条件:总钱数 ≤ 100元
- 循环内 :
- 天数加1
- 今天存的钱 = 天数
- 总钱数增加
✅ 代码:
cpp
#include <iostream>
using namespace std;
int main() {
int total = 0; // 总钱数
int day = 0; // 天数
while (total <= 100) { // 只要没超过100元
day++; // 新的一天
total += day; // 存钱:第n天存n元
}
cout << "第" << day << "天,总钱数第一次超过100元!" << endl;
cout << "总钱数:" << total << "元" << endl;
return 0;
}
🎯 重点:
- while的条件 :
total <= 100(还没超过100) - 更新变量 :在循环内更新
day和total - 退出时机 :当
total > 100时自动退出
🤔 动脑筋:
如果改成"存到刚好100元或超过",条件怎么改?
cpp
while (total < 100) { // 改成小于100
// ...
}
🔢 第二关:P2021《最大公约数》
📖 情景故事:
最大公约数就像找"共同好友":
- 数字12的朋友:1, 2, 3, 4, 6, 12
- 数字18的朋友:1, 2, 3, 6, 9, 18
- 共同好友:1, 2, 3, 6
- 最好的朋友(最大):6 ← 这就是最大公约数!
🎯 什么是最大公约数?
- 公约数:两个数都能整除的数
- 最大公约数:所有公约数中最大的那个
- 符号:gcd(a, b)
🔧 计算方法:辗转相除法(欧几里得算法)
形象理解:用大数除以小数,用余数代替大数,直到余数为0!
例子:求gcd(12, 18)
18 ÷ 12 = 1 ... 6 (余数6)
12 ÷ 6 = 2 ... 0 (余数0)
→ 最大公约数是6!
✅ 代码:
cpp
#include <iostream>
using namespace std;
int main() {
int a, b;
cout << "请输入两个正整数:" << endl;
cin >> a >> b;
// 确保a是较大的数
if (a < b) {
int temp = a;
a = b;
b = temp;
}
// 辗转相除法
int remainder; // 余数
while (b != 0) { // 只要余数不为0
remainder = a % b; // 计算余数
a = b; // 原来的除数变成被除数
b = remainder; // 余数变成除数
}
cout << "最大公约数是:" << a << endl;
return 0;
}
🔄 循环过程演示(以12和18为例):
| 循环次数 | a | b | remainder | 说明 |
|---|---|---|---|---|
| 初始 | 18 | 12 | - | 确保a≥b |
| 第1次 | 18 | 12 | 6 | 18÷12=1...6 |
| 第2次 | 12 | 6 | 0 | 12÷6=2...0 |
| 结束 | 6 | 0 | - | b=0,退出循环 |
🎨 形象比喻:
想象两个小朋友分糖果:
- 小明有18颗糖,小红有12颗糖
- 他们想分成一样多的小堆
- 每次都用剩下的糖继续分
- 直到能正好分完 → 那堆的大小就是最大公约数!
🎯 五、while循环的三大要点
1. 条件要会变!
cpp
int count = 0;
while (count < 5) { // 条件
cout << "第" << count+1 << "次循环" << endl;
count++; // ⚠️ 一定要改变条件变量!
}
// 如果不加count++,就会变成"死循环"!
2. 小心"无限循环"陷阱
cpp
// ❌ 错误示范:永远停不下来!
while (true) {
cout << "救命啊!停不下来!" << endl;
}
// ✅ 正确做法:确保条件能变成false
int i = 0;
while (i < 10) {
cout << i << endl;
i++; // 这个很重要!
}
3. 先判断,后执行
cpp
int x = 10;
while (x > 0) {
cout << x << " ";
x--;
}
// 输出:10 9 8 7 6 5 4 3 2 1
// 注意:当x=0时,条件不成立,直接退出
🎲 六、小游戏
🕹️ 游戏1:"猜猜停在哪"
cpp
int num = 20;
while (num > 0) {
num = num - 3;
}
cout << "最后的num是:" << num;
问题 :最后的num是多少?
答案:-1(因为20-3×7=-1)
🎯 游戏2:"while循环接龙"
老师:int i = 1;
学生A:while (i <= 10) {
学生B: cout << i << " ";
学生C: i++;
学生D:}
📝 七小任务
✏️ 任务1:画流程图
画出while循环的流程图:
开始
↓
条件成立? →否→ 结束
↓是
执行循环体
↓
更新变量
↓
返回判断条件
🤔 任务2:生活发现
找出生活中3个while循环的例子:
- 微波炉 :
while (时间没到) { 继续加热 } - 电梯 :
while (有人按按钮) { 继续运行 } - 你的例子:___________________
🏆 八、勋章墙
| 任务 | 完成要求 | 勋章 |
|---|---|---|
| P2020 | 理解并运行成功 | ⭐ 条件小能手 |
| P2021 | 理解辗转相除法 | ⭐ 数学小天才 |
| 两题全对 | 独立完成改编题 | 🏅 while循环大师 |
cpp
// 隐藏彩蛋:这个循环会输出什么?
int secret = 1;
while (secret < 1000) {
secret = secret * 2;
cout << secret << " ";
}
// 答案:2 4 8 16 32 64 128 256 512 1024
📚 九、小贴士
1. 本周学习重点
- 理解while循环的条件控制特点
- 掌握while循环的三要素:初始化、条件判断、变量更新
- 学会用while解决不确定次数的问题
2. 生活联系
- 游戏 :
while (生命值>0) { 继续游戏 } - 吃饭 :
while (碗里还有饭) { 继续吃 } - 存钱 :
while (存款<目标) { 继续存 }
3. 常见错误提醒
- ❌ 忘记更新循环变量 → 无限循环
- ❌ 条件永远为真 → 程序停不下来
- ✅ 解决方案:在循环内一定要改变条件相关的变量
✨ 十、魔法口诀
"while循环 真奇妙,条件开关说了算;
成立就进循环体,不成立时就再见;
变量更新别忘记,否则程序转圈圈!"