# 第 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 张卡**,有效下标是 **0~2**,**没有** `cards[3]`(会越界,程序可能出错)。 头文件:写 `std::string` 前要加一行 **`#include `**。 --- ## 2. 最简示例:三张卡、打印其中一张 保存为 `lession7.cpp`: ```cpp #include #include 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 ` 与 `#include `。 --- ## 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` 类型。 - **写了 `cards[3]` 只有三格,却用 `id = 3`**:越界,要改成 `id` 在 0~2,或把数组开大一点。 - **中文在终端乱码**:与系统编码有关,可先全用 **英文/拼音** 当卡名测试,再让家长和终端设置一起调。 --- ## 10. 下一课预告 第 8 课学 **函数**(`void`):把「抽一次」打成一包,用 **`draw_once()`** 多次调用,代码更整齐。 --- *学完请家长在 `学习进度与状态.md` 里更新第 7 课的状态与作业完成情况。* **下一课文档**:`第08课-函数与抽一次.md`