在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
*问题分析与算法设计
这个问题的算法十分简单,但是要注意在程序中判断最大、最小值的变量是如何赋值的。
下面是我写的程序,在输入时算出最大最小的是第几个,再算平均分,然后再输出。
#include <stdio.h>
#define N 10
int main()
{
int sco[N];
int i;
int re = 0;
int max = 0;
int min = 0;
for(i = 0;i < N;i++)
{
printf("请输入第%d个评委的打分\n",i + 1);
scanf("%d",sco + i);
if(sco[max] < sco[i])
{
max = i;
}
if(sco[min] > sco[i])
{
min = i;
}
}
for(i = 0;i < N;i++)
{
if(i != min && i != max)
{
re = re + sco[i];
}
}
re = re / (N - 2);
printf("the score = %d\n",re);
return 0;
}
这是答案的程序:输入的同时算最小最大值和和,然后再输出,比我的程序时间效率高。
#include<stdio.h>
int main()
{
int integer,i,max,min,sum;
max=-32768; /*先假设当前的最大值max为C语言整型数的最小值*/
min=32767; /*先假设当前的最小值min为C语言整型数的最大值*/
sum=0; /*将求累加和变量的初值置为0*/
for(i=1;i<=10;i++)
{
printf("Input number %d=",i);
scanf("%d",&integer); /*输入评委的评分*/
sum+=integer; /*计算总分*/
if(integer>max)max=integer; /*通过比较筛选出其中的最高分*/
if(integer<min)min=integer; /*通过比较筛选出其中的最低分*/
}
printf("Canceled max score:%d\nCanceled min score:%d\n",max,min);
printf("Average score:%d\n",(sum-max-min)/8); /*输出结果*/
}
*思考题
题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分最接返平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?
最不偏心的我用循环来找出与平均分差距最小的,再循环中需要判断是大于0还是小于0,最偏心的我在最大值和最小值中找出。
#include <stdio.h>
#define N 10
int main()
{
int sco[N];
int i;
int tmp;
int bias_g = 0;
int bias_b = 0;
int re = 0;
int max = 0;
int min = 0;
for(i = 0;i < N;i++)
{
printf("请输入第%d个评委的打分\n",i + 1);
scanf("%d",sco + i);
if(sco[max] < sco[i])
{
max = i;
}
if(sco[min] > sco[i])
{
min = i;
}
}
for(i = 0;i < N;i++)
{
if(i != min && i != max)
{
re = re + sco[i];
}
}
re = re / (N - 2);
tmp = (sco[0] - re >= 0) ? sco[0] - re : re - sco[0];
for(i = 0;i < N;i++)
{
if(sco[i] - re < 0)
{
if(re - sco[i] < tmp)
{
bias_g = i;
tmp = re - sco[i];
}
}
else
{
if(sco[i] - re < tmp)
{
bias_g = i;
tmp = sco[i] - re;
}
}
}
bias_b = (re - sco[min]) < (sco[max] - re) ? max : min;
printf("the score = %d\n",re);
printf("最偏心的是第%d个评委\n",bias_b + 1);
printf("最不偏心的是第%d个评委\n",bias_g + 1);
return 0;
}
一个在努力中的未来程序员,如果有更好的想法,欢迎评论。