C语言一维数组实验题 (输入输出格式化、一维数组)


题目描述

大奖赛现场统分。已知某大奖赛有n个选手参赛,m(m>2)个评委为参赛选手评分(最高10分,最低0分)。统分规则为:在每个选手的m个得分中,去掉一个最高分和一个最低分后,取平均分作为该选手的最后得分。要求编程实现:

  1. 根据n个选手的最后得分,从高到低输出选手的得分名次表,以确定获奖名单;
  2. 根据各选手的最后得分与各评委给该选手所评分数的差距,对每个评委评分的准确性和评分水准给出一个定量的评价,每位评委的评分方法:(10 -(评委对选手x的评分 - x的得分)^2 的累加和),从高到低输出各评委得分的名次表。

输入输出样例

程序运行实例

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.980	     1
    2	      9.960	     2
    3	      9.900	     3
    4	      9.860      4
    5	      9.590	     5
Over!Thank you!

一、解题思路

题目不难,多为数组操作,注意输入输出的格式即可


二、题解

源代码

代码如下:

/*
* Author:	FeverTwice
* Date:		2021-06-02
* Func:		Solution for Competition
*/

#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()
{   	 	   
    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); 		/* 现场为选手统计分数 */
    CountJudgeScore(ph, pf, m, sf, *f, n); 		/* 为各个评委打分 */
    printf("Order of Athletes:\n");
    Sort(sh, sf, n);                      			/* 选手得分排序 */
    Print(sh, sf, n);                     			/* 打印选手名次表 */

    printf("Order of judges:\n");
    Sort(ph, pf, m);                      			/* 评委得分排序 */
    Print(ph, pf, m);                     			/* 打印评委名次表 */
    printf("Over!Thank you!\n");
    return 0;
}   	 	   
/* 函数功能:统计参赛选手的得分 */
void  CountAthleteScore(int sh[], float sf[], int n, float f[], int m)
{   	 	   
    int  i, j;
    float  max, min;
    for (i = 1; i <= n; i++)                     /* 第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++)              /* 第j个评委 */
        {   	 	   
            printf("Judge %d gives score:", j);
            scanf("%f", &f[i * m + j]);
            sf[i] = sf[i] + f[i * m + j];   /* 累加评委对第i个选手的评分 */
            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:%.1f\n", max);
        printf("Delete a minimum score:%.1f\n", min);
        sf[i] = (sf[i] - max - min) / (m - 2); /*去掉一个最高分和最低分*/
        printf("The final score of Athlete %d is %.3f\n", sh[i], sf[i]);
    }
}   	 	   
/* 函数功能:对分数从高到低排序 */
void Sort(int h[], float f[], int n)
{   	 	   
    int  i, j, k, temp2;
    float  temp1;
    for (i = 1; i <= n - 1; i++)
    {   	 	   
        k = i;
        for (j = i + 1; j <= n; j++)
        {   	 	   
            if (f[j] > f[k])  k = j;
        }
        if (k != i)
        {   	 	   
            temp1 = f[k];
            f[k] = f[i];
            f[i] = temp1;
            temp2 = h[k];
            h[k] = h[i];
            h[i] = temp2;
        }
    }
}   	 	   
/* 函数功能:打印名次表 */
void Print(int h[], float f[], int n)
{   	 	   
    int  i;
    printf("order\tfinal score\tnumber code\n");
    for (i = 1; i <= n; i++)
    {   	 	   
        printf("%5d\t%11.3f\t%6d\n", i, f[i], h[i]);
    }
}   	 	   
/* 函数功能:统计评委的得分 */
void CountJudgeScore(int ph[], float pf[], int m, float sf[], float f[],
                     int n)
{   	 	   
    int  i, j;
    for (j = 1; j <= m; j++)         /* 第j个评委 */
    {   	 	   
        pf[j] = 0;
        for (i = 1; i <= n; i++)    /* 第i个选手 */
        {   	 	   
            pf[j] = pf[j] + (f[i * m + j] - sf[i]) * (f[i * m + j] - sf[i]);
        }
        pf[j] = 10 - pf[j];
    }
}   	



写在最后

各位看官,都看到这里了,麻烦动动手指头给博主来个点赞8,您的支持作者最大的创作动力哟! <(^-^)>
才疏学浅,若有纰漏,恳请斧正
本文章仅用于各位同志作为学习交流之用,不作任何商业用途,若涉及版权问题请速与作者联系,望悉知

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值