Files
chouka/old/第06课-循环与多抽.md
T
2026-05-16 11:09:02 +08:00

139 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 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 <iostream>
#include <cstdlib>
#include <ctime>
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`