问题描述
问题描述】某大奖赛有 n 个选手参赛,m 个评委](m>2)为依次参赛的选手评判分:最高 10 分,最低 0 分。统分规则为:每个选手所得的 m 个评分中,去掉一个最高分,去掉一个最低分,然后求平均分才是该选手的最终得分。要求根据 n 个选手的最终得分从高到低排出名次表。用冒泡法排序,实现函数,并用主函数验证其有效性。
代码
#include<stdio.h>
#define N 10
#define M 10
//定义结构体,存放选手编号及分数信息
typedef struct player{
int Id; //编号
int score[M]; // 各位评委的评分
float final_score; //最终得分
}Player;
void Input(Player p[],int n,int m){
int i,j;
printf("Please input players' information:\n");
for(i=0;i<n;i++){
p[i].Id=i+1; //给选手编号赋值
printf("The %d player:\n",i+1);
for(j=0;j<m;j++){
scanf("%d",&p[i].score[j]);
}
}
}
//获取选手最终成绩
void Score(Player p[],int n,int m){
int i,j,sum;
int max_i,min_i; //用于标记 最大最小值的下标
//首先找到选手的最低得分和最高得分
for(i=0;i<n;i++){
max_i=0;//先将最大最小值下标设为第一个
min_i=0;
for(j=0;j<m;j++){
if(p[i].score[j]>p[i].score[max_i])
max_i=j;
if(p[i].score[j]<p[i].score[min_i])
min_i=j;
}
p[i].score[max_i]=0; //将最高分和最低分的值设为0
p[i].score[min_i]=0; //表示去掉了对高分和最低分
}
//计算最终得分
for(i=0;i<n;i++){
for(j=0;j<m;j++){
sum+=p[i].score[j];
}
p[i].final_score=(float)(sum/(m-2));
}
}
//使用冒泡排序为选手排名
void Bubble_sort(Player p[],int n){
int i,j;
Player temp;
for(i=0;i<n;i++){
for(j=0;j<n-i-1;j++){
if(p[j].final_score<p[j+1].final_score){
temp=p[j];
p[j]=p[j+1];
p[j+1]=temp;
}
}
}
//输出排名
for(i=0;i<n;i++){
printf("The %dth is %d player, and the final score is %.2f\n",i+1,p[i].Id,p[i].final_score);
}
}
void main(){
int i,j,m,n;
Player p[N];
printf("Please input player's number:\n");
scanf("%d",&n);
printf("Please input judges' number:\n");
scanf("%d",&m);
Input(p,n,m);
Score(p,n,m);
Bubble_sort(p,n);
}