题目描述
学校进行新生知识竞赛,最终n名同学进入决赛(n<=20
)。为此,学生会邀请了7名德高望重的老教授与10名学生组成的大众评委一起作为评委。同时,也请学习了c语言的你帮忙编写一个程序,将评委给出的成绩,去掉一个最高分,去掉一个最低分后,计算出各位选手的最终得分,并按排名显示。
为方便提取每个学生信息,你设计了一个结构体类型Score,包含学生的编号(id)、姓名(name,不超过10个字符),并以一维数组value存储17名评委给出的成绩,同时将计算出的选手获得的最终成绩finalScore、比赛排名rank也作为成员记录到该结构体中,方便选手查询自己的名次。
定义一个一维数组grade存储20位学生成绩。
需要完成的函数功能为:
-
GetScore(struct Score grade[], int n): 读入17个评委给出的n个学生成绩;
-
CalcuScore(struct Score grade[], int n): 计算n个学生的最终成绩finalScore;
-
Ranking(struct Score grade[], int n): 依据最终成绩finalScore,计算出学生当前排名,赋给结构体成员rank;
-
PrintScore(struct Score grade[], int n): 每行按照 “第i名 编号 姓名 最终成绩”的格式打印所有选手名次。每两部分之间一个空格,最终成绩按6列保留2位小数输出
自定义结构体类型
struct Score { //成员包括学生编号、姓名、评分、总成绩、排名
};
函数接口定义:
void GetScore( struct Score grade[], int n );
void CalcuScore(struct Score grade[], int n);
void Ranking(struct Score grade[], int n);
void PrintScore(struct Score grade[], int n);
其中,grade[]
和n
都是主调函数传入的参数。grade[]
是结构体数组,n
是选手人数,不超过20。
裁判测试程序样例:
#include<stdio.h>
struct Score { //成员包括学生编号、姓名、评分、总成绩、排名
};
void GetScore( struct Score grade[], int n );
void CalcuScore(struct Score grade[], int n);
void Ranking(struct Score grade[], int n);
void PrintScore(struct Score grade[], int n);
int main()
{
int n;
scanf("%d", &n); //确定参加的选手人数
struct Score grade[20];
GetScore(grade, n);
CalcuScore(grade, n);
Ranking(grade, n);
PrintScore(grade, n);
return 0;
}
/* 请在这里填写答案 */
输入样例:
10
20001 Sandy 82 79 87 64 82 75 72 94 80 94 66 82 95 98 83 83 64
20002 Andy 95 65 83 95 93 65 72 86 66 75 84 73 85 74 84 60 68
20003 Kimmy 90 68 60 98 64 81 84 81 68 74 69 100 64 96 88 86 78
20004 Sussan 82 76 89 65 65 88 90 93 62 95 64 64 80 88 69 65 89
20005 Ryan 93 65 97 80 91 92 92 99 65 91 79 96 100 95 66 85 91
20006 Jone 74 67 68 94 84 86 91 86 63 62 71 96 92 68 74 96 63
20007 Tom 75 78 98 61 100 66 97 88 72 83 97 82 71 67 60 75 60
20008 Pokky 85 73 72 88 81 74 97 81 69 77 66 92 83 78 73 71 68
20009 Adolph 94 92 81 67 80 92 74 72 81 90 88 67 95 67 84 88 77
20010 Scolt 92 93 88 70 60 85 98 97 66 97 61 97 82 65 74 73 67
输出样例:
第1名 20005 Ryan 87.47
第2名 20009 Adolph 81.80
第3名 20001 Sandy 81.20
第4名 20010 Scolt 80.47
第5名 20003 Kimmy 79.27
第6名 20006 Jone 78.47
第7名 20007 Tom 78.00
第8名 20002 Andy 77.87
第9名 20004 Sussan 77.80
第10名 20008 Pokky 77.67
答案:
struct Score { //成员包括学生编号、姓名、评分、总成绩、排名
int id,rank;
char name[15];
int value[20];
float finalScore;
};
void GetScore( struct Score grade[], int n ){
int i,j;
for (i=0;i<n;i++){
scanf("%d %s",&grade[i].id,&grade[i].name);
for (j=0;j<17;j++){
scanf("%d",&grade[i].value[j]);
}
}
return 0;
}
void CalcuScore(struct Score grade[], int n){
int i,j,max,min,sum;
for (i=0;i<n;i++){
max=0;
min=100;
sum=0;
for (j=0;j<17;j++){
if (grade[i].value[j]>max)
max=grade[i].value[j];
else if (grade[i].value[j]<min)
min=grade[i].value[j];
sum+=grade[i].value[j];
}
grade[i].finalScore=(sum-max-min)/15.0;
}
return 0;
}
void Ranking(struct Score grade[], int n){
int i,j;
struct Score k;
for (i=0;i<n;i++){
for (j=0;j<n-i-1;j++){
if (grade[j].finalScore<grade[j+1].finalScore){
k=grade[j];
grade[j]=grade[j+1];
grade[j+1]=k;
}
}
}
for (i=0;i<n;i++){
grade[i].rank=i+1;
}
return 0;
}
void PrintScore(struct Score grade[], int n){
int i;
for (i=0;i<n;i++){
printf("第%d名 %d %s %6.2f\n",grade[i].rank,grade[i].id,grade[i].name,grade[i].finalScore);
}
}