题目内容:
已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选手的最后得分。要求编程实现:
(1)根据n个选手的最后得分,从高到低输出选手的得分名次表,以确定获奖名单;
(2)根据各选手的最后得分与各评委给该选手所评分数的差距,对每个评委评分的准确性和评分水准给出一个定量的评价,从高到低输出各评委得分的名次表。
提示:首先设计如下5个数组:
(1)sh[i],存放第i个选手的编号;
(2)sf[i],存放第i个选手的最后得分,即去掉一个最高分和一个最低分以后的平均分;
(3)ph[j],存放第j个评委的编号;
(4)f[i][j],存放第j个评委给第i个选手的评分;
(5)pf[j],存放代表第j个评委评分水准的得分。
解决本问题的关键在于计算选手的最后得分和评委的得分。
先计算选手的最后得分。外层循环控制参赛选手的编号i从1变化到n,当第i个选手上场时,输入该选手的编号sh[i]。内层循环控制给选手评分的评委的编号j从1变化到m,依次输入第j个评委给第i个选手的评分f[i][j],并将其累加到sf[i]中,同时求出最高分max和最低分min。当第i个选手的m个得分全部输入并累加完毕后,去掉一个最高分max,去掉一个最低分min,于是第i个选手的最后得分为:
sf[i] = (sf[i] – max – min)/(m-2);
当n个参赛选手的最后得分sf[0],sf[1],…,sf[n]全部计算完毕后,再将其从高到低排序,打印参赛选手的名次表。
下面计算评委的得分。评委给选手评分存在误差,即f[i][j]≠sf[i]是正常的,也是允许的。但如果某个评委给每个选手的评分与各选手的最后得分都相差太大,则说明该评委的评分有失水准。可用下面的公式来对各个评委的评分水平进行定量评价:
程序的运行结果示例:
How many Athletes?
3↙
How many judges?
4↙
Scores of Athletes:
Athlete 1 is playing.
Please enter his number code:
101↙
Judge 1 gives score:
9.8↙
Judge 2 gives score:
9.7↙
Judge 3 gives score:
9.5↙
Judge 4 gives score:
9.1↙
Delete a maximum score:9.8
Delete a minimum score:9.1
The final score of Athlete 101 is 9.600
Athlete 2 is playing.
Please enter his number code:
102↙
Judge 1 gives score:
8.9↙
Judge 2 gives score:
8.1↙
Judge 3 gives score:
8.6↙
Judge 4 gives score:
8.4↙
Delete a maximum score:8.9
Delete a minimum score:8.1
The final score of Athlete 102 is 8.500
Athlete 3 is playing.
Please enter his number code:
103↙
Judge 1 gives score:
9.0↙
Judge 2 gives score:
9.5↙
Judge 3 gives score:
9.4↙
Judge 4 gives score:
9.2↙
Delete a maximum score:9.5
Delete a minimum score:9.0
The final score of Athlete 103 is 9.300
Order of Athletes:
order final score number code
1 9.600 101
2 9.300 103
3 8.500 102
Order of judges:
order final score number code
1 9.900 3
2 9.735 2
3 9.700 4
4 9.689 1
Over!Thank you!
程序中浮点数的数据类型均为float。
输入选手人数提示信息:“How many Athletes?\n”
输入评委人数提示信息:“How many judges?\n”
输入选手编号提示信息:“Please enter his number code:\n”
输入格式:
评委人数、选手人数、选手编号:"%d"
评委打分:"%f"
输出格式:
选手得分提示信息:“Scores of Athletes:\n”
当前选手提示信息:“Athlete %d is playing.\n”
评委打分提示信息:“Judge %d gives score:\n”
去掉最高分:“Delete a maximum score:%.1f\n”
去掉最低分:“Delete a minimum score:%.1f\n”
选手最后得分提示信息:“The final score of Athlete %d is %.3f\n”
选手得分排序提示信息:“Order of Athletes:\n”
评委排序提示信息:“Order of judges:\n”
选手/评委 排序表头提示信息都是:“order\tfinal score\tnumber code\n”
选手/评委 得分排序输出格式都是:"%5d\t%11.3f\t%6d\n"
评委排序表头提示信息: “order\tfinal score\tnumber code\n”
评分结束提示信息: “Over!Thank you!\n”
为避免出现格式错误,请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,m,b[10],p[10],t,max,min,j,x;
float f[10], pj[10][10],s[10],z;
printf(“How many Athletes?\n”);
scanf("%d", &n);
printf(“How many judges?\n”);
scanf("%d", &m);
printf(“Scores of Athletes:\n”);
for (i = 0; i < n;i++)
{
printf(“Athlete %d is playing.\n”,i+1);
printf(“Please enter his number code:\n”);
scanf("%d", &b[i]);
for (t = 0; t < m; t++)
{
printf(“Judge %d gives score:\n”, t + 1);
scanf("%f", &pj[i][t]);
}
max = 0;
min = 0;
for (t = 0; t < m; t++)
{
if (pj[i][t]>pj[i][max])
max = t;
if (pj[i][t]<pj[i][min])
min = t;
}
f[i] = 0.0;
for (t = 0; t < m; t++)
{
if (t != max&&t != min)
f[i] += pj[i][t];
}
f[i] = f[i] / (m - 2.0);
printf("Delete a maximum score:%.1f\n", pj[i][max]);
printf("Delete a minimum score:%.1f\n", pj[i][min]);
printf("The final score of Athlete %d is %.3f\n", b[i], f[i]);
}
for (t = 0; t < m; t++)
{
z = 0;
for (i = 0; i < n; i++)
{
z = z + pow(pj[i][t] - f[i], 2);
}
z = z / n;
s[t] = 10 - sqrt(z);
}
for (i =0; i < m; i++)
{
p[i] = i+1;
}
for (i = 0; i < m-1;i++)
{
for (t=i+1; t < m; t++)
{
if (s[i] < s[t])
{
z=s[t];
s[t]=s[i];
s[i] = z;
x = p[t];
p[t] =p[i];
p[i] =x;
}
}
}
for (j = 0;j<n-1;j++)
{
for (t =j+1;t<n;t++)
{
if (f[j]< f[t])
{
z = f[j];
f[j] = f[t];
f[t] = z;
x = b[j];
b[j] = b[t];
b[t] = x;
}
}
}
printf("Order of Athletes:\n");
printf("order\tfinal score\tnumber code\n");
for (i = 0; i < n; i++)
{
printf("%5d\t%11.3f\t%6d\n", i + 1, f[i], b[i]);
}
printf("Order of judges:\n");
printf("order\tfinal score\tnumber code\n");
for (i = 0; i <m; i++)
{
printf("%5d\t%11.3f\t%6d\n", i + 1,s[i],p[i]);
}
printf("Over!Thank you!\n");
}