121 lines
4.1 KiB
Markdown
121 lines
4.1 KiB
Markdown
# 第 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 <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` 在 0~2,或把数组开大一点。
|
||
- **中文在终端乱码**:与系统编码有关,可先全用 **英文/拼音** 当卡名测试,再让家长和终端设置一起调。
|
||
|
||
---
|
||
|
||
## 10. 下一课预告
|
||
|
||
第 8 课学 **函数**(`void`):把「抽一次」打成一包,用 **`draw_once()`** 多次调用,代码更整齐。
|
||
|
||
---
|
||
|
||
*学完请家长在 `学习进度与状态.md` 里更新第 7 课的状态与作业完成情况。*
|
||
|
||
**下一课文档**:`第08课-函数与抽一次.md`
|