调整课次结构:前9节重新排序,新建第06课一维数组,后3节不变
This commit is contained in:
171
第07课-数组运算/教案-学生版.md
Normal file
171
第07课-数组运算/教案-学生版.md
Normal file
@@ -0,0 +1,171 @@
|
||||
# 第9课:数组计数法(学生版)
|
||||
|
||||
## 教学目标
|
||||
|
||||
- 理解“数值作下标、次数存数组”的计数思想
|
||||
- 掌握数组计数的核心写法
|
||||
- 能用计数数组完成频次统计、最高频查找和去重升序输出
|
||||
- 知道数组计数法的适用条件和下标范围限制
|
||||
|
||||
## 核心考点:数值映射为下标的数组计数思想
|
||||
|
||||
### 考什么
|
||||
统计整数的出现次数,寻找最高频数字,或完成________和有序输出。
|
||||
|
||||
### 必须理解
|
||||
用数组下标 x 表示________,用 `cnt[x]` 表示________。每读到一次 x,就执行________。数组大小必须覆盖题目给出的全部________。
|
||||
|
||||
### 核心写法
|
||||
```cpp
|
||||
int cnt[________] = {};
|
||||
for (int i = 0; i < n; i++) {
|
||||
int x;
|
||||
cin >> x;
|
||||
____________________;
|
||||
}
|
||||
for (int i = 0; i <= 100; i++) {
|
||||
if (____________________) cout << i;
|
||||
}
|
||||
```
|
||||
|
||||
### 常见错误
|
||||
- 范围是0~100时,数组为什么要开101?________________
|
||||
- 计数数组为什么必须清零?________________
|
||||
- 负数能否直接作为数组下标?________
|
||||
|
||||
### 判断是否掌握
|
||||
- [ ] 我能根据数据范围确定数组大小。
|
||||
- [ ] 我能解释下标与计数值分别代表什么。
|
||||
- [ ] 我能用计数数组完成频次或去重任务。
|
||||
|
||||
---
|
||||
|
||||
## 课前认识:什么是数组计数法
|
||||
|
||||
如果输入的数字都在 `0~100` 之间,可以准备一个 `cnt[101]` 数组。
|
||||
|
||||
- 数字 `x` 对应数组下标:________
|
||||
- `cnt[x]` 保存:________________
|
||||
- 每读到一个数字 x,执行:________________
|
||||
|
||||
---
|
||||
|
||||
## 课堂编程题
|
||||
|
||||
### 课堂1:成绩频次表【适中】
|
||||
|
||||
**题目描述:** 输入若干名学生的成绩,按分数从小到大输出每个出现过的分数及人数。
|
||||
|
||||
**输入格式:** 第一行输入学生人数;第二行输入每名学生的成绩。
|
||||
|
||||
**输出格式:** 每行输出一个出现过的分数和对应人数。
|
||||
|
||||
**数据范围:** 学生人数为 1~1000,成绩为 0~100。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
6
|
||||
80 90 80 75 90 80
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
75 1
|
||||
80 3
|
||||
90 2
|
||||
```
|
||||
|
||||
**解题思路:** 分数可直接作为下标;每读到一个分数,对应计数加一,最后从 0 遍历到 100。
|
||||
|
||||
**易错提醒:** 允许分数 100,所以数组至少需要 101 个位置。
|
||||
|
||||
---
|
||||
|
||||
### 课堂2:最受欢迎的号码【适中】
|
||||
|
||||
**题目描述:** 输入若干个 1~50 的号码,输出出现次数最多的号码及次数;若并列,输出较小号码。
|
||||
|
||||
**输入格式:** 第一行输入号码总数;第二行输入所有号码。
|
||||
|
||||
**输出格式:** 输出最受欢迎的号码及其出现次数。
|
||||
|
||||
**数据范围:** 号码总数为 1~1000。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
7
|
||||
8 3 8 5 3 8 3
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
3 3
|
||||
```
|
||||
|
||||
**解题思路:** 先计数,再从小到大打擂台;只有次数严格更多才更新,便能保留并列时较小号码。
|
||||
|
||||
**易错提醒:** 更新条件不能写大于等于,否则并列时会留下较大号码。
|
||||
|
||||
---
|
||||
|
||||
### 课堂3:去重并升序输出【适中】
|
||||
|
||||
**题目描述:** 输入若干个 0~100 的整数,去掉重复数字并升序输出,同时输出不同数字的个数。
|
||||
|
||||
**输入格式:** 第一行输入整数数量;第二行输入所有整数。
|
||||
|
||||
**输出格式:** 第一行输出不同数字的个数;第二行升序输出不同数字。
|
||||
|
||||
**数据范围:** 整数数量为 1~1000。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
8
|
||||
4 2 4 1 2 9 1 5
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
5
|
||||
1 2 4 5 9
|
||||
```
|
||||
|
||||
**解题思路:** 计数后从小到大遍历下标,次数大于 0 就输出一次并增加不同数字个数。
|
||||
|
||||
**易错提醒:** 下标从小到大遍历时,答案天然有序。
|
||||
|
||||
---
|
||||
|
||||
### 课堂4:温度统计【适中】
|
||||
|
||||
**题目描述:** 输入若干个 -20~50 的整数温度,输出每个出现过的温度及次数,并输出出现次数最多的温度;并列取较低温度。
|
||||
|
||||
**输入格式:** 第一行输入记录数量;第二行输入所有温度。
|
||||
|
||||
**输出格式:** 先按温度从低到高输出频次表,最后一行输出最高频温度。
|
||||
|
||||
**数据范围:** 记录数量为 1~1000。
|
||||
|
||||
**输入样例:**
|
||||
```text
|
||||
6
|
||||
-2 0 -2 3 0 -2
|
||||
```
|
||||
|
||||
**输出样例:**
|
||||
```text
|
||||
-2 3
|
||||
0 2
|
||||
3 1
|
||||
BEST -2
|
||||
```
|
||||
|
||||
**解题思路:** 温度加 20 后映射到 0~70;输出和比较时再把下标减 20 还原。
|
||||
|
||||
**易错提醒:** 负数不能直接作为数组下标;映射和还原必须使用相同偏移量。
|
||||
|
||||
---
|
||||
|
||||
## 课后作业
|
||||
|
||||
> 请完成本课对应的课后作业,见编程题文件。
|
||||
Reference in New Issue
Block a user