Files
chouka/old/第07课-卡片与数组.md
T
2026-05-16 11:09:02 +08:00

121 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 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`