【C 语言】剔除最大最小值后,计算数组元素的平均值
双 11 也不能阻挡我学习的心!
[TOC]
问题引入
题目内容:
定义一个含 10 个整型元素的一维数组,从键盘上输入 10 个元素值,求去掉最大值和最小值之后的元素平均值.
输入格式:
用循环控制依次输入 10 个元素值,scanf 语句中的格式控制串为: “% d”
输出格式:
输出平均值,printf 中的格式控制串为 “% lf\n”
输入样例:
1 | 2 3 4 5 6 2 4 6 4 3 |
输出样例:
1 | 3.833333 |
理解 1
一般人看到这种题目,下意识会认为是去掉一个最大值一个最小值,再计算数组其他元素的最大值
毕竟很多体育赛事都是这么计算选手的得分的
实际上这道题并不是这么要求的,这点我们后面再提
先来看看如何去掉数组中的一个最大值、一个最小值吧!
去除一个最大 / 最小值
先理清思路
- 需要找到数组中的最大值和最小值
- 在计算平均值的时候需要剔除这两个值
想清楚这两点后,方法就很明确了
之前我写过一篇博客,有关如何查找数组中最大值的 [链接]
这里我们就能用上那个博客里面的方法,不过是以自定义函数的方式实现
1 | int sp1(int arr[], int sz, int* pm) |
找出最小值的代码同上,只需要将其中的 > 更改为 <
在 main 函数中,我们需要设立两个变量来接收得到的最大值和最小值的下标
1 | int main() |
在最后计算 sum 的时候,只需要用 if 语句让 K 不等于最大值和最小值的下标,就能剔除这两个值
同时,我们的平均数也只需要除以 8 即可
运行结果
键入数组中元素 1-10,程序成功的输出了剔除 1 和 10 之后 8 个元素的平均值
但当我们把题目示例输进去时,得出的答案却和题目要求不同
题目实际要求
上面提到,这道题的要求并不是只剔除一个最大值和最小值
而是剔除所有的最大值和最小值
1 | 2 3 4 5 6 2 4 6 4 3 |
观察输入样例可以发现,这 10 个数字的最大值是 6,最小值是 2
但是不管是最小值 2 和最大值 6,都不止一个
题目要求的就是要将这里面的所有 2 和 6 剔除掉,再计算剩余数据的平均值
解题思路 1&2
对上面的代码进行优化,以循环的方式继续寻找最大值的下标
缺点:此方法可能会出现多删的情况
或
更改代码,在找到最大值下标后,查找数组中有几个元素同这个最大值相同,再返回他们的下标
此方法需要用数组来存放找到的元素的下标,较为麻烦
解题思路 3 - 冒泡排序
先对数组进行冒泡排序,再剔除两边的最大值和最小值
这里我选择的就是解题思路 3
冒泡排序的方式可以参考我之前的博客 [链接]
这里只贴出主函数内需要编写的内容
计数器
因为需要剔除多个最大(小)值
所以这里我们需要用一个变量进行计数
每当我们找到和已知最大值相同的数字的时候,count 都会 ++(初值为 1)
当循环走到第一个小于最大值的数后,循环就会终止
1 | int count2 = 1; |
查找最小值的代码同上,但是 for 循环中的条件需要更改
注意,这里的下标 k 必须从 8 开始而不是从 9
因为经过冒泡排序后,arr [9] 本身就是数组中的最大值
若从它开始循环判断,就会直接把最大值赋值为 0
程序就出 bug 了
主函数代码
1 | int main() |
在最后计算平均数的时候,我们需要剔除 count1 和 count2(10 减去后即为剩余元素的个数)
这时候得出的答案就和题目所给示例相同了
你学废了嘛?
反正我是废了
- 最新
- 最热
- 最早
- 作者
点击重新获取 | 打开控制台