歌星大奖赛,评分系统

来源:互联网 发布:淘宝美工助理卡号 编辑:程序博客网 时间:2024/04/30 06:42

/*在歌星大奖赛中,有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;
}