139 lines
4.1 KiB
Markdown
139 lines
4.1 KiB
Markdown
# 第 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`
|