(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)
目录
第1关:大奖赛现场统分
题目:
大奖赛现场统分
以往各类大奖赛的报分与统分脱节,参赛选手的最后得分总要等到下一个选手赛完后才报,影响竞赛的正常节奏,也不能满足观众的期待心理。现在请为某大奖赛编写一个现场统分程序,在各评委打分之后,及时通报评分结果。同时,为了给评委一个约束,有利于竞赛评判的公正,要求增加给评委打分和排序的功能。
已知:某大奖赛有 n 个选手参赛,m(m>2)个评委依次为参赛的选手评判打分,最高10分,最低0分。统分规则为:在每个选手所得的 m 个得分中,去掉一个最高分,去掉一个最低分,取平均分为该选手的最后得分。要求编程实现:
根据 n 个选手的最后得分,从高到低排出名次表,以便确定获奖名单;
根据各选手的最后得分与各评委给该选手所评分的差距,对每个评委评分的准确性给出一个定量的评价。
代码思路:
这题看着很复杂,实际上源代码已经给了我们很多提示,我们只需要根据源代码的提示,补全 Sort()函数和CountJudgeScore()函数即可
注意:本题的难点在于不仅要考虑选手的评分,还要顺带考虑其编号,二者缺一不可
对于Sort()函数,我们只需要用冒泡排序即可(http://t.csdn.cn/mmU9w)
对于CountJudgeScore()函数,我们首先可以从 CountAthleteScore()函数中得知评委的评分储存在数组f[ ]中,并且是以f[i*m+j]的形式表示每个评委对同一个选手的评分,那么我们在统计评委时就可以反过来用f[j*m+i]表示评委对每个选手的评分,然后根据题目提示里面给出的公式进行计算即可,最后不要忘了对每个评委的进行编号
代码表示:
#include <stdio.h> #include <math.h> #define ATHLETE 40 //选手人数最高限 #define JUDGE 20 //评委人数最高限 void CountAthleteScore(int sh[], float sf[], int n, float f[], int m); void Sort(int h[], float f[], int n); void Print(int h[], float f[], int n); void CountJudgeScore(int ph[],float pf[],int m,float sf[],float f[],int n); int main(void) { int j, m, n; int sh[ATHLETE]; //选手的编号数组 int ph[JUDGE]; //评委的编号数组 float sf[ATHLETE]; //选手的最后得分 float pf[JUDGE]; //评委的得分 float f[ATHLETE][JUDGE]; //评委给选手的评分 printf("How many Athletes?"); scanf("%d", &n); //输入选手人数 printf("How many judges?"); scanf("%d", &m); //输入评委人数 for (j=1; j<=m; j++) { ph[j] = j; } printf("Scores of Athletes:\n"); CountAthleteScore(sh, sf, n, *f, m); //现场为选手统计分数 printf("Order of Athletes:\n"); Sort(sh, sf, n); //选手得分排序 Print(sh, sf, n); //打印选手名次表 printf("Scores of judges:\n"); CountJudgeScore(ph, pf, m, sf, *f, n); //为各个评委打分 printf("Order of judges:\n"); Sort(ph, pf, m); //评委得分排序 Print(ph, pf, m); //打印评委名次表 printf("Over!Thank you!"); return 0; } //函数功能:统计参赛选手的得分 //函数参数:整型数组sh,存放选手的编号 // 实型数组sf,存放选手的最后得分 // 整型变量n, 存放参赛选手的人数 // 实型数组f, 存放每个评委给选手的评分 // 整型变量m, 存放评委的人数 //函数返回值:无 void CountAthleteScore(int sh[], float sf[], int n, float f[], int m) { int i, j; float max, min; for (i=1; i<=n; i++) { printf("\nAthlete %d is playing." , i); printf("\nPlease enter his number code:"); scanf("%d", &sh[i]); sf[i] = 0; max = 0; min = 100; for (j=1; j<=m; j++) { printf("Judge %d give score:", j); scanf("%f", &f[i*m+j]); sf[i] = sf[i] + f[i*m+j]; if (max < f[i*m+j]) { max = f[i*m+j]; } if (min > f[i*m+j]) { min = f[i*m+j]; } } printf("Delete a maximum score:%.3f\n", max); printf("Delete a minimum score:%.3f\n", min); sf[i] = (sf[i] - max - min) / (m - 2); printf("The final score of Athlete %d is %.3f\n", sh[i], sf[i]); } } //函数功能:对分数从高到低排序 //函数参数:整型数组h,存放编号 // 实型数组f,存放最后得分 // 整型变量n,存放参评人数 //函数返回值:无 void Sort(int h[], float f[], int n) { /*************** Begin ***************/ int i,j; float t; for(i=1;i<=n-1;i++) { for(j=i+1;j<=n;j++) { if(f[i]<f[j]) { t=f[i]; f[i]=f[j]; //交换成绩 f[j]=t; t=h[i]; h[i]=h[j]; //交换编号 h[j]=t; } } } /*************** End ***************/ } //函数功能:输出名次表 //函数参数:整型数组h,存放编号 // 实型数组f,存放最后得分 // 整型变量n,存放参评人数 //函数返回值:无 void Print(int h[], float f[], int n) { int i; printf("number\tfinal score\torder\n"); for (i=1; i<=n; i++) { printf("%6d\t%11.3f\t%5d\n", h[i], f[i], i); } } //函数功能:统计评委的得分 //函数参数:整型数组ph,存放评委的编号 // 实型数组pf,存放评委的得分 // 整型变量m, 存放评委的人数 // 实型数组sf,存放选手的最后得分 // 实型数组f, 存放每个评委给选手的评分 // 整型变量n, 存放参赛选手的人数 //函数返回值:无 void CountJudgeScore(int ph[],float pf[],int m,float sf[],float f[],int n) { /*************** Begin ***************/ int i,j; float s,t; for(i=1;i<=m;i++) { s=0; for(j=1;j<=n;j++) { t=(f[j*m+i]-sf[j])*(f[j*m+i]-sf[j]); s+=t; } s=s/n; s=sqrt(s); pf[i]=10-s; ph[i]=i; } for(i=1;i<=m;i++) { printf("Judge %d give score:%.3f\n",ph[i],pf[i]); } /*************** End ***************/ }