Files
project1/第07课-数组运算/教案-学生版.md

4.4 KiB
Raw Permalink Blame History

第9课数组计数法学生版

教学目标

  • 理解“数值作下标、次数存数组”的计数思想
  • 掌握数组计数的核心写法
  • 能用计数数组完成频次统计、最高频查找和去重升序输出
  • 知道数组计数法的适用条件和下标范围限制

核心考点:数值映射为下标的数组计数思想

考什么

统计整数的出现次数寻找最高频数字或完成________和有序输出。

必须理解

用数组下标 x 表示________cnt[x] 表示________。每读到一次 x就执行________。数组大小必须覆盖题目给出的全部________。

核心写法

int cnt[________] = {};
for (int i = 0; i < n; i++) {
    int x;
    cin >> x;
    ____________________;
}
for (int i = 0; i <= 100; i++) {
    if (____________________) cout << i;
}

常见错误

  • 范围是0100时数组为什么要开101________________
  • 计数数组为什么必须清零________________
  • 负数能否直接作为数组下标________

判断是否掌握

  • 我能根据数据范围确定数组大小。
  • 我能解释下标与计数值分别代表什么。
  • 我能用计数数组完成频次或去重任务。

课前认识:什么是数组计数法

如果输入的数字都在 0~100 之间,可以准备一个 cnt[101] 数组。

  • 数字 x 对应数组下标________
  • cnt[x] 保存________________
  • 每读到一个数字 x执行________________

课堂编程题

课堂1成绩频次表【适中】

题目描述: 输入若干名学生的成绩,按分数从小到大输出每个出现过的分数及人数。

输入格式: 第一行输入学生人数;第二行输入每名学生的成绩。

输出格式: 每行输出一个出现过的分数和对应人数。

数据范围: 学生人数为 11000成绩为 0100。

输入样例:

6
80 90 80 75 90 80

输出样例:

75 1
80 3
90 2

解题思路: 分数可直接作为下标;每读到一个分数,对应计数加一,最后从 0 遍历到 100。

易错提醒: 允许分数 100所以数组至少需要 101 个位置。


课堂2最受欢迎的号码【适中】

题目描述: 输入若干个 150 的号码,输出出现次数最多的号码及次数;若并列,输出较小号码。

输入格式: 第一行输入号码总数;第二行输入所有号码。

输出格式: 输出最受欢迎的号码及其出现次数。

数据范围: 号码总数为 11000。

输入样例:

7
8 3 8 5 3 8 3

输出样例:

3 3

解题思路: 先计数,再从小到大打擂台;只有次数严格更多才更新,便能保留并列时较小号码。

易错提醒: 更新条件不能写大于等于,否则并列时会留下较大号码。


课堂3去重并升序输出【适中】

题目描述: 输入若干个 0100 的整数,去掉重复数字并升序输出,同时输出不同数字的个数。

输入格式: 第一行输入整数数量;第二行输入所有整数。

输出格式: 第一行输出不同数字的个数;第二行升序输出不同数字。

数据范围: 整数数量为 11000。

输入样例:

8
4 2 4 1 2 9 1 5

输出样例:

5
1 2 4 5 9

解题思路: 计数后从小到大遍历下标,次数大于 0 就输出一次并增加不同数字个数。

易错提醒: 下标从小到大遍历时,答案天然有序。


课堂4温度统计【适中】

题目描述: 输入若干个 -2050 的整数温度,输出每个出现过的温度及次数,并输出出现次数最多的温度;并列取较低温度。

输入格式: 第一行输入记录数量;第二行输入所有温度。

输出格式: 先按温度从低到高输出频次表,最后一行输出最高频温度。

数据范围: 记录数量为 11000。

输入样例:

6
-2 0 -2 3 0 -2

输出样例:

-2 3
0 2
3 1
BEST -2

解题思路: 温度加 20 后映射到 070输出和比较时再把下标减 20 还原。

易错提醒: 负数不能直接作为数组下标;映射和还原必须使用相同偏移量。


课后作业

请完成本课对应的课后作业,见编程题文件。