青年歌手大奖赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分。
Input
输入数据有多组,每组占一行,每行的第一个数是n(2<n<=100),表示评委的人数,然后是n个评委的打分。
Output
对于每组输入数据,输出选手的得分,结果保留2位小数,每组输出占一行。
Sample Input
3 99 98 97
4 100 99 98 97
Sample Output
98.00
98.50
# include<stdio.h>
#include<math.h>
int main()
{
int n, i, max, min, maxsign, minsign;
double sum, average;
while(scanf("%d", &n) != EOF)
{
sum = 0;
maxsign = 0; minsign = 0;
double a[10000] = {0};
for( i = 0; i < n; i++)
scanf("%lf", &a[i]);
max = a[0], min = a[0];
for(i = 0; i < n; i++)
{
//max = a[0], min = a[0];我犯错了老是想我是不是语句有错误,哪里基本知识又不够啊。很少想自己的逻辑错误。给学长一看就看出了我的逻辑错误。
if(a[i] >= max)
{
max = a[i];
maxsign = i;
}
if(a[i] < min) //if(a[i] <= min)代码基本功能实现后还要想特殊情况的,这样功能才完美。右边这注释掉的好几行是之前写的代码。如果这里写等号且按下面的最大最小都置为0的话,当所有评委都打100分的话,那么最大最小就在最后了。我只会把一个数值置0.这里不用等号最大最小才不会出现在同一个下标。
{
min = a[i];
minsign = i;
}
}
//a[maxsign] = 0;
//a[minsign] = 0;
for(i = 0; i < n; i++)
sum += a[i]; //for(i = 0; i < n; i++)
// sum += a[i];
average = (sum - max - min)/(n-2);
//average = sum/(n-2);
printf("%.2lf\n", average);
}
return 0;
}
以下是不用数组的写法
# include<stdio.h>
#include<math.h>
int main()
{
double n, i, max, min, sum, average, a;
while(scanf("%lf", &n) != EOF)
{
sum = 0;
min = 101;
max = -1;
for( i = 0; i < n; i++)
{
scanf("%lf", &a);///scanf会有一个缓冲区,把读进来的数据都放到缓冲区里。
///等scanf结束后按先进先出的方式,把数据释放出来继续跑下去。
sum += a;
if(a > max)
max = a;
if(a < min)
min = a;
}
average = (sum - max - min)/(n-2);
printf("%.2lf\n", average);
}
return 0;
}
第二个解法是参考网址https://zhidao.baidu.com/question/144013865.html
的。