# 第 6 课:循环与多抽(`for`) **本课目标**:把第 3 课的「输入次数」、第 4~5 课的「随机 + 稀有度」合在一起:玩家输入 **`n`**,程序用 **`for` 循环** 连续抽 **`n` 次**,每次结果可以不同。 **复习**:`cin` 读整数;`srand` 只设一次;`rand` % 100 与 `if` 判断。 --- ## 1. 这一课要搞懂什么 - **循环**:同一段代码想做很多遍,不用复制粘贴很多行。 - **`for` 句型(本课用这个)**: ```text for (起点; 是否继续; 每轮结束时做什么) { 循环体 } ``` - 本课常用写法: ```cpp for (int i = 1; i <= n; i++) { ... } ``` 含义可以记成:「`i` 从 1 开始,只要 `i` 还小于等于 `n`,就执行大括号里的话,每做完一轮让 `i` 加 1」。 - **`i`** 常用来当「第几抽」的序号,正好可以打在屏幕上:`第1抽`、`第2抽`…… --- ## 2. 随机数要放在循环里面还是外面? - **`std::srand(std::time(nullptr));`**:仍在 **`main` 开头只写一次**(和前面一样)。 - **`int r = std::rand() % 100;`**:要写在 **`for` 的循环体里面**——**每抽一次,重新得到一个 `r`**。若写在循环外,`r` 只算一次,多抽就全一样了。 --- ## 3. 完整示例(输入次数 + 连抽 + 稀有度) 保存为 `lession6.cpp`: ```cpp #include #include #include int main() { std::srand(std::time(nullptr)); int n = 0; std::cout << "抽几次?"; std::cin >> n; for (int i = 1; i <= n; i++) { int r = std::rand() % 100; std::cout << "第" << i << "抽:"; if (r < 70) { std::cout << "普通\n"; } else if (r < 95) { std::cout << "稀有\n"; } else { std::cout << "超稀有\n"; } } return 0; } ``` 运行后输入一个整数(如 `5`),应看到 5 行结果,**每行稀有度可不同**。 --- ## 4. `for` 三格分别是什么?(对号入座) 以 `for (int i = 1; i <= n; i++)` 为例: | 位置 | 本课含义 | |------|----------| | `int i = 1` | 循环变量 `i` 从 1 开始。 | | `i <= n` | 只要 `i` 不超过 `n` 就继续抽。 | | `i++` | 每抽完一轮,`i` 加 1(`++` 表示加 1)。 | --- ## 5. 和抽卡游戏的关系 | 本课组合 | 游戏效果 | |----------|----------| | `cin >> n` | 玩家决定十连、百连等 | | `for` 里每次新的 `r` + `if` | 每一抽独立判稀有度 | | 打印 `i` | 清楚是第几抽 | 第 7 课会给卡片 **起名字(数组)**;本课先熟练「多抽」。 --- ## 6. 怎么编译和运行 ```bash clang++ -std=c++17 -o lession6 lession6.cpp ./lession6 ``` 输入正整数。若输入 `0`,循环体一次都不执行,属于正常;负数本课不专门处理,可和家长讨论「该做哪些判断」当拓展。 --- ## 7. 本课课堂小练习 1. 在每一抽的输出里,顺便打印本次的 **点数 `r`**(和 `i` 一起),多运行几次,对照第 5 课区间是否一致。 2. 把 `for` 里 `i` 从 **1 开始** 改成从 **0 开始**、条件改成 `i < n`(需同时改 `cout` 里显示第几抽,如 `i + 1`)。能做出来说明你在思考「下标从 0」。 --- ## 8. 本课课后作业(选做) - 统计这一轮里 **出了几次「超稀有」**:在 `main` 里加一个 `int` 变量,在 `else`(超稀有的分支)里加 1,循环结束后 `cout` 打印总次数。 - 问家长:**`while` 和 `for` 有什么不一样?** 本课只用 `for` 就够;知道「另一种循环名」即可。 --- ## 9. 常见小问题 - **只随机了一次**:检查 `r = ...rand...` 是否在 `for` 的 `{ }` 里。 - **想抽「固定 10 次」不写 `cin`**:可以把 `n = 10;` 写死,仍然用 `for` 循环。 - **输入很大的 `n`**:会打印很多行,可以先用小数字测。 --- ## 10. 下一课预告 第 7 课学 **数组** 和 `std::string`:用编号对应「皮卡丘、小火龙」等名字,抽到稀有时打印具体卡名。 --- *学完请家长在 `学习进度与状态.md` 里更新第 6 课的状态与作业完成情况。* **下一课文档**:`第07课-卡片与数组.md`