📄 歌手评分.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 + -