?? 歌手評分.cpp
字號:
/*1. 某大獎賽中,有10個評委為參賽的選手打分,分數為1~100分。選手最
后得分為:去掉一個最高分和一個最低分后其余8個分數的平均值。請編寫一個
程序實現:
a) 從文件中讀入選手信息,包括:姓名,選手編號,評委打的分數。
b) 計算選手最后得分,并根據選手得分從高到低進行排序。
c) 按照以下格式,存入文件中:
例:一等獎 3個 姓名:歌手2、歌手3、歌手4
d) 同時考慮對評委評分進行裁判,即在10個評委中找出最公平(即評分最接近
均分)和最不公平(即與平均分的差距最大)的評委;
*/
#include <iostream>
#include <math.h>
#include <malloc.h>
using namespace std;
class player_file
{
public:
int num;
char name[10];
int judge[10];
int score;
};
void input(char *filename,player_file player[] ,int *n);//把數據保存到結構體中
void get_avrage(player_file player[],int n);//求每位選手的平均分
void sort(player_file player[],int n);//對選手的成績排序
void output(player_file player[],int n,char award[50]);//把排名結果輸出到指定文件中去
void judger_compare(player_file player[],int n);//裁判排序
void get_maxmin(player_file player[],int i,int *max,int *min);
void main()
{
char filename[50];
player_file player[50];
int n;
cout<<"請輸入文件路徑:"<<endl;
gets(filename);
input(filename,player,&n);
get_avrage(player,n);
}
void input(char *filename,player_file player[],int *n)
{
int i=0,j;
FILE *fp;
if((fp=fopen(filename,"r"))==NULL)
{
cout<<"cann't open file"<<endl;
cout<<"請從新輸入文件路徑:"<<endl;
while((fp=fopen(filename,"r"))==NULL)
{
gets(filename);
}
}
while(1)
{
fscanf(fp,"%d%s",&player[i].num,player[i].name);
for(j=0;j<10;j++)
{
fscanf(fp,"%d",&player[i].judge[j]);
}
if(feof(fp))
break;
else
{
i++;
}
}
*n=i;
fclose(fp);
}
void get_avrage(player_file player[],int n)
{
int i,j;
int sum;
int *max,*min;
max=(int *)malloc(sizeof(j));
min=(int *)malloc(sizeof(j));
cout<<"比塞結果:"<<endl;
for(i=0;i<n;i++)
{
sum=0;
*max=player[i].judge[0];
*min=player[i].judge[0];
get_maxmin(player,i,max,min);
for(j=0;j<10;j++)
{
sum=sum+player[i].judge[j];
}
player[i].score=(sum-*max-*min)/8;//max,min 為最大和最小得分
cout<<endl<<"第"<<i+1<<"名選手,去掉一個最高分:"<<*max<<"分,去掉一個最低分:"<<*min<<"分,最后得分:"<<player[i].score<<"分"<<endl;
cout<<"評委排名:"<<endl;
judger_compare(player,i);
}
sort(player,n);
}
void get_maxmin(player_file player[],int i,int *max,int *min)
{
int j;
for(j=0;j<10;j++)
{
if(*max<player[i].judge[j])
{
*max=player[i].judge[j];
}
if(*min>player[i].judge[j])
{
*min=player[i].judge[j];
}
}
}
void sort(player_file player[],int n)
{
int i,j,maxi;
player_file tmp;
char award[50];
for(i=0;i<n;i++)
{
maxi=i;
for(j=i;j<n;j++)
{
if(player[j].score>player[maxi].score)
{
maxi=j;
}
}
tmp=player[maxi];
player[maxi]=player[i];
player[i]=tmp;
}
output(player,n,award);
}
void output(player_file player[],int n,char award[50])
{
int i,j,k=0,m=1;
FILE *fp;
cout<<"請輸入存儲獲獎名單路徑:"<<endl;
gets(award);
if((fp=fopen(award,"w"))==NULL)
{
cout<<"cann't open file"<<endl;
cout<<"請從新輸入存儲文件路徑:"<<endl;
while((fp=fopen(award,"w"))==NULL)
{
gets(award);
}
}
cout<<"選手獲獎名單:"<<endl;
for(i=0;i<n;i++)
{
if(player[i].score==player[i+1].score)
{
m++;
}
else
{
k++;
fprintf(fp,"第%d名 %d個 成績:%d 姓名:",k,m,player[i].score);
cout<<"第"<<k<<"名 "<<m<<"個 成績:"<<player[i].score<<"姓名:";
k=k+m-1;
for(j=i;j<i+m&&j<10;j++)
{
fprintf(fp,"%s ",player[j].name);
cout<<player[j].name;
}
fprintf(fp,"\n");
cout<<endl;
m=1;
}
}
fclose(fp);
}
void judger_compare(player_file player[],int n)
{
int i,j,a[10],tmp,count_i=1,k=1,b[10]={0};
for(i=0;i<10;i++)
a[i]=i;
for(i=0;i<10;i++)
{
for(j=i+1;j<10;j++)
{
if(fabs(player[n].judge[a[i]]-player[n].score)>fabs(player[n].judge[a[j]]-player[n].score))
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
}
j=0;
for(i=0;i<10;i++)
{
if(fabs(player[n].judge[a[i]]-player[n].score)==fabs(player[n].judge[a[i+1]]-player[n].score))
{
k++;
count_i++;
}
else
{
if(k>0)
{
count_i=count_i-k+1;
cout<<"第"<<count_i<<"名"<<k<<"個 下標:";
for(;j<count_i+k-1;j++)
{
cout<<a[j]<<" ";
}
cout<<endl;
}
count_i=count_i+k;
k=1;
}
}
cout<<endl;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -