C++信奥while循环基础01

🚀 While循环------当"不确定"时怎么办?**


🌟 一、课前小故事:While就像"吃薯片停不下来"

想象一下,你有一包薯片,妈妈说:"只要还有薯片 ,你就可以继续吃 !"

这个"只要...就..."就是while循环的精髓!


🔄 二、认识新朋友:while循环

🤔 while循环是什么?

cpp 复制代码
while (条件) {
    // 条件成立时就重复执行!
}

🎯 形象比喻:

  • while = "当...的时候"
  • 条件 = 一个"开关"
  • 循环体 = 重复做的动作

📖 生活例子:

  1. 看电视while (还没到9点) { 继续看电视 }
  2. 写作业while (作业没写完) { 继续写作业 }
  3. 吃糖果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等于多少?

🧠 解题步骤:

  1. x++:先使用x=5,然后x变成6
  2. ++x:先把x从6变成7,然后使用x=7
  3. y = 5 + 7 = 12
  4. 答案:y=12,x=7

🎯 游戏2:循环猜谜

cpp 复制代码
int i = 0;
while (i++ < 3) {
    cout << i << " ";
}

🤔 输出什么?

🧠 解题步骤:

  1. 第一次:i++ < 3 → 0<3成立,i变成1,输出1
  2. 第二次:i++ < 3 → 1<3成立,i变成2,输出2
  3. 第三次:i++ < 3 → 2<3成立,i变成3,输出3
  4. 第四次:i++ < 3 → 3<3不成立,退出
  5. 答案:输出"1 2 3"

🎯 游戏3:换个写法

cpp 复制代码
int i = 0;
while (++i < 3) {
    cout << i << " ";
}

🤔 这次输出什么?

🧠 解题步骤:

  1. 第一次:++i < 3 → i先变成1,1<3成立,输出1
  2. 第二次:++i < 3 → i先变成2,2<3成立,输出2
  3. 第三次:++i < 3 → i先变成3,3<3不成立,退出
  4. 答案:输出"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,可能导致死循环或跳过循环
}

✅ 最佳实践:

  1. 简单情况 :单独一行使用,i++++i效果一样
  2. 复杂表达式:避免在复杂表达式中使用自增
  3. 循环中for循环通常用++i(效率稍高)
  4. 可读性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)暂时不要求掌握
  • 重点是理解执行顺序的概念

总结:三句话记住

  1. i++:先做事,后加1(像"先吃饭,再洗碗")
  2. ++i:先加1,后做事(像"先洗碗,再吃饭")
  3. 循环中:通常放循环末尾,两者效果一样

🎮 四、闯关任务

🔢 第一关:P2020《第几项》

📖 情景故事:

小明的储蓄罐计划:

  • 第1天存1元
  • 第2天存2元
  • 第3天存3元
  • ...
    问题 :存到多少钱时,总数会第一次超过100元
🧠 思维过程:
  1. 初始化:总钱数 = 0,天数 = 0
  2. 条件:总钱数 ≤ 100元
  3. 循环内
    • 天数加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)
  • 更新变量 :在循环内更新daytotal
  • 退出时机 :当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循环的例子:

  1. 微波炉while (时间没到) { 继续加热 }
  2. 电梯while (有人按按钮) { 继续运行 }
  3. 你的例子:___________________

🏆 八、勋章墙

任务 完成要求 勋章
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循环 真奇妙,条件开关说了算;

成立就进循环体,不成立时就再见;

变量更新别忘记,否则程序转圈圈!"


相关推荐
@大迁世界1 小时前
6 款轻量级 CLI 工具,取代了我臃肿的开发软件
开发语言·lua
handler011 小时前
算法:Trie树(字典树)
c语言·数据结构·c++·笔记·算法·深度优先
思麟呀1 小时前
应用层自定义协议与序列化
linux·运维·服务器·网络·c++
MegaDataFlowers2 小时前
依赖注入(DI)
java·开发语言
csbysj20202 小时前
Foundation 输入框尺寸指南
开发语言
坚定学代码2 小时前
qt c++ 局域网聊天小工具
c++·qt·个人开发
码云数智-园园2 小时前
Tailwind CSS vs. 传统CSS/Sass:2026年前端样式开发的深度博弈
开发语言
lly2024062 小时前
《jEasyUI 创建 XP 风格左侧面板》
开发语言
晓纪同学2 小时前
EffctiveC++_01第一章
java·开发语言·c++