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
+139
View File
@@ -0,0 +1,139 @@
# 第 9 课:菜单与循环(`while` + `break`
**本课目标**:让程序像小游戏一样 **反复显示菜单**,玩家输入数字选择:**抽一次卡 / 看说明 / 退出**。学会 **`while (true)`** 以及 **`break`** 跳出循环。
**复习**:第 8 课的 **`draw_once()`**;第 3 课的 **`cin`**。本课把「输入选项」包在一个 **一直转的大圈** 里。
---
## 1. 这一课要搞懂什么
- **`while (条件)`**:条件成立就反复执行 `{ ... }` 里的代码。
- **`while (true)`**`true` 永远成立 → **无限循环**,除非里面用 **`break`** 强行离开。
- **`break`**:用在循环里,表示 **立刻结束这一层循环**,继续执行循环后面的代码(通常是 `return 0` 结束程序)。
- **菜单**:每一圈先 **`cout` 打印选项**,再 **`cin >> choice`**,再用 **`if` / `else if` / `else`** 判断选了哪一项。
---
## 2. 推荐选项编号(示例)
| 输入数字 | 动作 |
|----------|------|
| `1` | 调用 **`draw_once()`** 抽一次 |
| `2` | 打印几句游戏规则说明 |
| `0` | **`break`** 退出循环(说再见) |
你也可以改成 `3` 退出,只要在文档里写清楚即可。
---
## 3. 完整示例程序
保存为 `lession9.cpp`
```cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
void draw_once() {
int r = std::rand() % 100;
if (r < 70) {
std::cout << "普通卡\n";
} else if (r < 95) {
std::cout << "稀有卡\n";
} else {
std::cout << "超稀有卡\n";
}
}
int main() {
std::srand(std::time(nullptr));
while (true) {
std::cout << "\n===== 抽卡小游戏 =====\n";
std::cout << "1 抽一次\n";
std::cout << "2 说明\n";
std::cout << "0 退出\n";
std::cout << "请选择:";
int choice = 0;
std::cin >> choice;
if (choice == 1) {
draw_once();
} else if (choice == 2) {
std::cout << "随机出普通/稀有/超稀有,选 1 抽一次,选 0 退出。\n";
} else if (choice == 0) {
std::cout << "再见!\n";
break;
} else {
std::cout << "没有这个选项,请重新输入。\n";
}
}
return 0;
}
```
### 程序是怎么跑的?
1. 进入 **`while (true)`**,显示菜单。
2. 等你输入 **`choice`**。
3. 若选 **`0`**:打印再见 → **`break`** → 循环结束 → 执行 **`return 0`**。
4. 否则再回到步骤 1(又是新的一圈菜单)。
---
## 4. 两个循环的区别(回忆)
| 循环 | 适合干什么 |
|------|------------|
| **`for`** | 次数明确,例如「抽 `n` 次」 |
| **`while`** | 次数不固定,例如「一直显示菜单直到选退出」 |
菜单用 **`while`** 很自然;菜单里选「抽十次」可以再写一个 **`for`** 调用 **`draw_once()`**。
---
## 5. 怎么编译和运行
```bash
clang++ -std=c++17 -o lession9 lession9.cpp
./lession9
```
---
## 6. 本课课堂小练习
1. 增加菜单项 **`3`****先问「抽几次?」**,读入 **`n`**,用 **`for`** 调用 **`draw_once()`** `n` 次(把第 6、8 课合在一起)。
2. 把菜单文字改成你喜欢的标题和选项说明。
---
## 7. 本课课后作业(选做)
- 加一个 **`int coins`**:每抽一次扣 10 金币,金币不够时提示并禁止抽卡(需要 **`if (coins >= 10)`** 再抽)。
- 问家长:**为什么退出要用 `break`,而不是直接写 `return 0` 在分支里?**(两种有时都能用;本课先理解 `break` 只跳出 **`while`**。)
---
## 8. 常见小问题
- **退出不了**:检查退出分支里有没有 **`break`**;条件是不是写成了赋值 **`=`** 而不是比较 **`==`**。
- **菜单刷屏**:每一圈开头加一点点分隔线(示例里用了 `\n``=====`)会好看一些。
- **`cin` 输入错了类型**:输入字母可能导致菜单卡住,选做以后再学清理输入流;本课先用数字测试。
---
## 9. 下一课预告
第 10 课是 **综合小项目**:把欢迎语、菜单、金币或次数、统计超稀有等整理成你自己的「迷你抽卡游戏」版本。
---
*学完请家长在 `学习进度与状态.md` 里更新第 9 课的状态与作业完成情况。*
**下一课文档**`第10课-综合小项目.md`(创建后将放在工作区;也可先对照 `教程-抽卡游戏-C++-10课.md` 第 10 节)。