/*在歌星大奖赛中,有10个评委为参赛的选手打分,分数为1~100分。选手最后得分
为:去掉一个最高分和一个最低分后其余8个分数的平均值。
题目条件不变,但考虑同时对评委评分进行裁判,即在10个评委中找出最公平(即评分
最接返平均分)和最不公平(即与平均分的差距最大)的评委,程序应该怎样实现?
请编写一个程序实现。
算法分析与设计:
定义数组存放裁判的打分,遍历数组得到最高分与最低分,
去掉最高分与最低分得到选手的平均分。
设计了良好的的人机交互界面*/
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double grade[10]={0};
double random=0,max=0,min=0,avg=0,sum=0;
int i,index_max=0,index_min=0,index_min_dis=0,index_max_dis=0; //记录下标
double dis_max=0,dis_min=0; //记录与平均分相比得到的最大差距及最小差距
int index_max_dis_all[10]={0},index_min_dis_all[10]={0};
//记录与平均分相比得到最大差距及最小差距的分数对应的所有下标
//输入10位裁判的打分
for(i=0;i<=9;i++)
{
cout<<"请输入第"<<i+1<<"位裁判的打分:";
cin>>random;
while(random>100||random<0) //当输入的分数不在0~100之间时,重新输入
{
cout<<"对不起,您的输入有误,请重新输入!"<<endl;
cout<<"请输入第"<<i+1<<"位裁判的打分:";
cin>>random;
if(random<=100&&random>=0)
break;
}
grade[i]=random;
}
//遍历数组找到最高分与最低分
max=min=grade[0]; //对max,min赋值。应该设一个与数组元素相关的值;
//如使用定义时的值0,由于grade[i]>=0,min将不会改变。
index_max=index_min=0;
for(i=1;i<=9;i++)
{
if(max<grade[i])
{
max=grade[i];
index_max=i;
}
else
if(min>grade[i])
{
min=grade[i];
index_min=i;
}
}
//计算去掉最高分与最低分后的平均得分
for(i=0;i<=9;i++)
if(i!=index_max&&i!=index_min)
sum+=grade[i];
avg=sum/8;
//遍历数组计算出与平均分相差最大及最小的分数
dis_max=dis_min=fabs(grade[0]-avg); //对分数差距取绝对值,得到相对量
index_max_dis=index_min_dis=0;
for(i=1;i<=9;i++)
{
if(dis_max<fabs(grade[i]-avg))
{
dis_max=fabs(grade[i]-avg);
index_max_dis=i;
}
else
if(dis_min>fabs(grade[i]-avg))
{
dis_min=fabs(grade[i]-avg);
index_min_dis=i;
}
}
//遍历数组,找出与平均分相比得到最大差距及最小差距的分数对应的所有下标
int i_max=0,i_min=0;
for(i=0;i<=9;i++)
{
if(grade[i]==grade[index_max_dis])
{
index_max_dis_all[i_max]=i;
i_max++;
}
if(grade[i]==grade[index_min_dis])
{
index_min_dis_all[i_min]=i;
i_min++;
}
}
//输出结果
cout<<"最高分为:"<<grade[index_max]<<endl;
cout<<"最低分为:"<<grade[index_min]<<endl;
// cout<<"最公正的裁判为第"<<index_min_dis+1<<"位裁判"<<endl;
// cout<<"最不公正的裁判为第"<<index_max_dis+1<<"位裁判"<<endl;
i_max=0,i_min=0;
cout<<"最公正的裁判为:";
//数组index_min_dis_all[10],index_max_dis_all[10]初始化为0,为了满足下标为0的元素为
//距离最大或最小的情况,又因为每个数组中至少有一个元素,故用do...while...循环,至少
//输出每个数组中的第一个元素
do
{
cout<<index_min_dis_all[i_min]+1<<",";
i_min++;
}while(index_min_dis_all[i_min]!=0);
cout<<endl;
cout<<"最不公正的裁判为:";
do
{
cout<<index_max_dis_all[i_max]+1<<",";
i_max++;
}while(index_max_dis_all[i_max]!=0);
cout<<endl<<endl;
cout<<"选手最后得分为:"<<avg<<endl;
return 0;
}