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
+120
View File
@@ -0,0 +1,120 @@
# 第 7 课:卡片与数组(`string` 数组)
**本课目标**:用 **数组** 存好多张卡的名字,用 **编号(下标)** 取出其中一张。学会 **`std::string`** 和 **下标从 0 开始**
**复习**:第 6 课里每次有一张「结果」;本课在随机数上再往前一步,让结果变成 **某一张具体卡** 的名字。
---
## 1. 这一课要搞懂什么
- **一张卡有名字**(文字),在 C++ 里常用 **`std::string`** 表示一串字(不是本课的整数 `int`)。
- **很多张卡** 可以排成一行放进 **数组**里:`std::string cards[3]` 表示有 **3 个格子**(编号 `0、1、2`)。
- **下标永远从 0 开始**
- 第 1 张是 `cards[0]`
- 第 2 张是 `cards[1]`
- 第 3 张是 `cards[2]`
- 若有 **3 张卡**,有效下标是 **02****没有** `cards[3]`(会越界,程序可能出错)。
头文件:写 `std::string` 前要加一行 **`#include <string>`**。
---
## 2. 最简示例:三张卡、打印其中一张
保存为 `lession7.cpp`
```cpp
#include <iostream>
#include <string>
int main() {
std::string cards[3];
cards[0] = "小火龙";
cards[1] = "皮卡丘";
cards[2] = "妙蛙种子";
int id = 1;
std::cout << "你选中的卡:" << cards[id] << "\n";
return 0;
}
```
运行会打印 **皮卡丘**(因为 `id` 是 1,对应下标 1)。把 `id` 改成 `0``2` 再试。
---
## 3. 随机从三张里抽一张(和抽卡最相关)
3 个下标是 0、1、2,随机一个下标用:
```cpp
int id = std::rand() % 3; // 0 或 1 或 2
std::cout << "抽到:" << cards[id] << "\n";
```
**注意**:若用随机,要在 `main` 最前面先写 `std::srand(std::time(nullptr));`(和前几课一样),并加上 `#include <cstdlib>``#include <ctime>`
---
## 4. 和稀有度、多抽怎么拼?(进阶思路)
- 本课可以只做:**在「普通 / 稀有」某一档里**,再随机出 **具体卡名**(用 `cards[id]`)。
- 也可以先生成 `r` 判稀有度,**分支里** 用 **不同的小数组****同数组不同下标范围**(慢慢加,不着急一次写完)。
**第 6 课** 的拼法:在 `for` 的每一轮里,除了打印「普通/稀有」,再打印 `cards[某个 id]`
---
## 5. 本课必须记住的规矩
| 点 | 说明 |
|----|------|
| 3 格数组 | 合法下标是 `0、1、2` |
| `% 3` | 得到 0~2,正好当这三张的编号 |
| `string``int` 不同 | 算卡名用 `string`;第几张、下标、随机 0/1/2 用 `int` |
---
## 6. 怎么编译和运行
```bash
clang++ -std=c++17 -o lession7 lession7.cpp
./lession7
```
(若和随机数、循环写在同一个 `.cpp` 里,**所有**需要的 `#include` 都写上。)
---
## 7. 本课课堂小练习
1.`cards[3]` 改成 **4 张卡**`cards[4]`),自己写四个名字,用 `std::rand() % 4` 随机抽一张并打印名字。
2.`for``i = 0``i < 3`,在循环里 **`cout` 打印** `cards[i]`,看是否按顺序列出一排卡名。
---
## 8. 本课课后作业(选做)
- 在每一张卡名后面,再存一个 **等级数字** 太麻烦,以后可以用 **结构体**;本选做可改成:**两张表**—`std::string cards[3]``int level[3]`,下标相同表示同一张卡的名字和等级,打印时两个一起输出。
- 问家长:生活中哪些东西像「下标从 0 开始」?(例如有的小区楼层、有国家的年级说法不同——先当聊天即可。)
---
## 9. 常见小问题
- **忘了 `#include <string>`**:可能报错找不到 `string` 类型。
- **写了 `cards[3]` 只有三格,却用 `id = 3`**:越界,要改成 `id` 在 02,或把数组开大一点。
- **中文在终端乱码**:与系统编码有关,可先全用 **英文/拼音** 当卡名测试,再让家长和终端设置一起调。
---
## 10. 下一课预告
第 8 课学 **函数**`void`):把「抽一次」打成一包,用 **`draw_once()`** 多次调用,代码更整齐。
---
*学完请家长在 `学习进度与状态.md` 里更新第 7 课的状态与作业完成情况。*
**下一课文档**`第08课-函数与抽一次.md`