大奖赛现场统分

题目内容:

已知某大奖赛有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");

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值