大奖赛现场统分Q253

1. 题目

大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选手的最后得分。要求编程实现:
(1)根据n个选手的最后得分,从高到低输出选手的得分名次表,以确定获奖名单;
(2)根据各选手的最后得分与各评委给该选手所评分数的差距,对每个评委评分的准确性和评分水准给出一个定量的评价,每位评委的评分方法为:10 -sqrt(((评委对选手x的评分 - x的得分)^2 的累加和)/评委人数)),即
在这里插入图片描述
然后从高到低输出各评委得分的名次表。
输入格式:
“How many Athletes?”
“How many judges?”
“%d”

“Scores of Athletes:\n”
“\nAthlete %d is playing.”
“\nPlease enter his number code:”
“%d”
输出格式:
“Judge %d gives score:”
“%f”

“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\tfinal score\tnumber code\n”
“%5d\t%11.3f\t%6d\n”

“Order of judges:\n”
“order\tfinal score\tnumber code\n”
“%5d\t%11.3f\t%6d\n”

“Over!Thank you!\n”
程序运行示例如下:

How many Athletes?5
How many judges?5
Scores of Athletes:
Athlete 1 is playing.
Please enter his number code:11
Judge 1 gives score:9.5
Judge 2 gives score:9.6
Judge 3 gives score:9.7
Judge 4 gives score:9.4
Judge 5 gives score:9.0
Delete a maximum score:9.7
Delete a minimum score:9.0
The final score of Athlete 11 is 9.500

Athlete 2 is playing.
Please enter his number code:12
Judge 1 gives score:9.0
Judge 2 gives score:9.2
Judge 3 gives score:9.1
Judge 4 gives score:9.3
Judge 5 gives score:8.9
Delete a maximum score:9.3
Delete a minimum score:8.9
The final score of Athlete 12 is 9.100

Athlete 3 is playing.
Please enter his number code:13
Judge 1 gives score:9.6
Judge 2 gives score:9.7
Judge 3 gives score:9.5
Judge 4 gives score:9.8
Judge 5 gives score:9.4
Delete a maximum score:9.8
Delete a minimum score:9.4
The final score of Athlete 13 is 9.600

Athlete 4 is playing.
Please enter his number code:14
Judge 1 gives score:8.9
Judge 2 gives score:8.8
Judge 3 gives score:8.7
Judge 4 gives score:9.0
Judge 5 gives score:8.6
Delete a maximum score:9.0
Delete a minimum score:8.6
The final score of Athlete 14 is 8.800

Athlete 5 is playing.
Please enter his number code:15
Judge 1 gives score:9.0
Judge 2 gives score:9.1
Judge 3 gives score:8.8
Judge 4 gives score:8.9
Judge 5 gives score:9.2
Delete a maximum score:9.2
Delete a minimum score:8.8
The final score of Athlete 15 is 9.000
Order of Athletes:
order	final score	number code
    1	      9.600	    13
    2	      9.500	    11
    3	      9.100	    12
    4	      9.000	    15
    5	      8.800	    14
Order of judges:
order	final score	number code
    1	      9.937	     1
    2	      9.911	     2
    3	      9.859	     3
    4	      9.833	     4
    5	      9.714	     5
Over!Thank you!

2. 思路

用结构体创建对象选手和评委,每个选手和评委分别具有编号和最终分数,用二维数组保存每个评委对每个选手的打分情况,并据此二维数组计算选手和评委的最终得分。

3. 代码实现

#include <stdio.h>
#include <math.h>
#define N 50
#define M 40

typedef struct person
{
    int num_code;
    float fin_score;
} PERSON;

float AthFinScore(float a[], int athlete_num, float *max, float *min)
{
    int i;
    float sum = 0.0, avg_score;
    *max = a[1];
    *min = a[1];
    for (i = 1; i <= athlete_num; i++)
    {
        if (a[i] > *max)
            *max = a[i];
        if (a[i] < *min)
            *min = a[i];
        sum += a[i];
    }
    avg_score = (sum - (*max + *min)) / (athlete_num - 2);
    return avg_score;
}


void Order(PERSON p[], int p_num)
{
    int i, j;
    PERSON temp;
    for (i = 1; i <= p_num; i++)
    {
        for (j = i; j <= p_num; j++)
        {
            if (p[i].fin_score < p[j].fin_score)
            {
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
        }
    }
}

int main()
{
    int athlete_num, judge_num;
    printf("How many Athletes?");
    scanf("%d", &athlete_num);
    printf("How many judges?");
    scanf("%d", &judge_num);

    int i, j;
    PERSON athlete[N], judge[M];
    float all_score[N][M];
    float max = 0, min = 0;
    printf("Scores of Athletes:\n");
    for (i = 1; i <= athlete_num; i++)
    {
        printf("\nAthlete %d is playing.", i);
        printf("\nPlease enter his number code:");
        scanf("%d", &athlete[i].num_code);
        for (j = 1; j <= judge_num; j++)
        {
            printf("Judge %d gives score:", j);
            scanf("%f", &all_score[i][j]);
            judge[j].num_code = j;
        }
        athlete[i].fin_score = AthFinScore(all_score[i], athlete_num, &max, &min);
        printf("Delete a maximum score:%.1f\n", max);
        printf("Delete a minimum score:%.1f\n", min);
        printf("The final score of Athlete %d is %.3f\n", athlete[i].num_code, athlete[i].fin_score);
    }

    float sum;
    for (i = 1; i <= judge_num; i++)
    {
        sum = 0.0;
        for (j = 1; j <= athlete_num; j++)
        {
            sum += pow((all_score[j][i] - athlete[j].fin_score), 2);
        }
        judge[i].fin_score = 10 - sqrt(sum / judge_num);
    }

    Order(athlete, athlete_num);
    printf("Order of Athletes:\n");
    printf("order\tfinal score\tnumber code\n");
    for (i = 1; i <= athlete_num; i++)
    {
        printf("%5d\t%11.3f\t%6d\n", i, athlete[i].fin_score, athlete[i].num_code);
    }

    Order(judge, judge_num);
    printf("Order of judges:\n");
    printf("order\tfinal score\tnumber code\n");
    for (i = 1; i <= judge_num; i++)
    {
        printf("%5d\t%11.3f\t%6d\n", i, judge[i].fin_score, judge[i].num_code);
    }
    printf("Over!Thank you!\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值