save code

This commit is contained in:
xsl
2026-05-16 11:09:02 +08:00
parent 478b3451a1
commit a169ceb263
45 changed files with 2226 additions and 0 deletions
+138
View File
@@ -0,0 +1,138 @@
# 第 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`