PTA练习题6-3 评委打分-n 武汉理工大学

6-3 评委打分-n   分数 10    作者 XXX-SJ    单位 武汉理工大学

题目描述

学校进行新生知识竞赛,最终n名同学进入决赛(n<=20)。为此,学生会邀请了7名德高望重的老教授与10名学生组成的大众评委一起作为评委。同时,也请学习了c语言的你帮忙编写一个程序,将评委给出的成绩,去掉一个最高分,去掉一个最低分后,计算出各位选手的最终得分,并按排名显示。
为方便提取每个学生信息,你设计了一个结构体类型Score,包含学生的编号(id)、姓名(name,不超过10个字符),并以一维数组value存储17名评委给出的成绩,同时将计算出的选手获得的最终成绩finalScore、比赛排名rank也作为成员记录到该结构体中,方便选手查询自己的名次。
定义一个一维数组grade存储20位学生成绩。
需要完成的函数功能为

  1. GetScore(struct Score grade[], int n): 读入17个评委给出的n个学生成绩;

  2. CalcuScore(struct Score grade[], int n): 计算n个学生的最终成绩finalScore;

  3. Ranking(struct Score grade[], int n): 依据最终成绩finalScore,计算出学生当前排名,赋给结构体成员rank;

  4. PrintScore(struct Score grade[], int n): 每行按照 “第i名 编号 姓名 最终成绩”的格式打印所有选手名次。每两部分之间一个空格,最终成绩按6列保留2位小数输出

自定义结构体类型
struct Score {  //成员包括学生编号、姓名、评分、总成绩、排名

};
 函数接口定义:
void GetScore( struct Score grade[], int n );
void CalcuScore(struct Score grade[], int n);
void Ranking(struct Score grade[], int n);
void PrintScore(struct Score grade[], int n);

其中,grade[]n都是主调函数传入的参数。grade[]是结构体数组,n是选手人数,不超过20。

裁判测试程序样例:

#include<stdio.h>
struct Score {  //成员包括学生编号、姓名、评分、总成绩、排名

};

void GetScore( struct Score grade[], int n );
void CalcuScore(struct Score grade[], int n);
void Ranking(struct Score grade[], int n);
void PrintScore(struct Score grade[], int n);

int main()
{
    int n;
    scanf("%d", &n); //确定参加的选手人数
    struct Score grade[20];
    GetScore(grade, n);
    CalcuScore(grade, n);
    Ranking(grade, n);
    PrintScore(grade, n);
    return 0;
}

/* 请在这里填写答案 */

 输入样例:

10
20001 Sandy  82  79  87  64  82  75  72  94  80  94  66  82  95  98  83  83  64
20002 Andy  95  65  83  95  93  65  72  86  66  75  84  73  85  74  84  60  68
20003 Kimmy  90  68  60  98  64  81  84  81  68  74  69 100  64  96  88  86  78
20004 Sussan  82  76  89  65  65  88  90  93  62  95  64  64  80  88  69  65  89
20005 Ryan  93  65  97  80  91  92  92  99  65  91  79  96 100  95  66  85  91
20006 Jone  74  67  68  94  84  86  91  86  63  62  71  96  92  68  74  96  63
20007 Tom   75  78  98  61 100  66  97  88  72  83  97  82  71  67  60  75  60
20008 Pokky  85  73  72  88  81  74  97  81  69  77  66  92  83  78  73  71  68
20009 Adolph  94  92  81  67  80  92  74  72  81  90  88  67  95  67  84  88  77
20010 Scolt  92  93  88  70  60  85  98  97  66  97  61  97  82  65  74  73  67

输出样例: 

第1名 20005 Ryan 87.47

第2名 20009 Adolph 81.80

第3名 20001 Sandy 81.20

第4名 20010 Scolt 80.47

第5名 20003 Kimmy 79.27

第6名 20006 Jone 78.47

第7名 20007 Tom 78.00

第8名 20002 Andy 77.87

第9名 20004 Sussan 77.80

第10名 20008 Pokky 77.67

答案参考:

struct Score {  //成员包括学生编号、姓名、评分、总成绩、排名
    //结构体里没放排名,感觉没什么必要
    char id[100];      //题目没说学号多少位,所以往大了写 
    char name[11];     //姓名 
    double score[17];  //分数,用数组存放 
    double sum;        //计算出的最终得分 
};
void GetScore( struct Score grade[], int n ){
	int i,j;
	for(i=0;i<n;i++){
		scanf("%s %s",grade[i].id,grade[i].name);
		for(j=0;j<17;j++){
			scanf("%lf",&grade[i].score[j]);
		}
	}
}

void CalcuScore(struct Score grade[], int n){
	int i,j,k;
	double temp;
	for(i=0;i<n;i++){
		for(j=0;j<17;j++){
		    for(k=j+1;k<17;k++){
		    	//这里图方便用了最简单的排列方法,建议使用冒泡、选择排序法 
		   	    if(grade[i].score[j]<grade[i].score[k]){  
                //将每一位学生的原始分数从大到小依次排列 
		   	    	temp=grade[i].score[j];
		   	    	grade[i].score[j]=grade[i].score[k];
		   	    	grade[i].score[k]=temp;
				}
		    }	
		}
	}
	for(i=0;i<n;i++){    //对排过序的分数,头和尾都变成0,即达到掐头去尾目的 
		grade[i].score[0]=0;
		grade[i].score[16]=0;
	}
	for(i=0;i<n;i++){    //计算最终得分 
		for(j=0;j<17;j++){
			grade[i].sum+=grade[i].score[j];
		}
		grade[i].sum/=15.0;
	}
}

void Ranking(struct Score grade[], int n){
	int i,j;
	struct Score temp;
	for(i=0;i<n;i++){
		for(j=i+1;j<n;j++){
			//同样建议使用更巧妙的排序法 
			if(grade[i].sum<grade[j].sum){
				temp=grade[i];
				grade[i]=grade[j];
				grade[j]=temp;
			}
		}
	}
}

void PrintScore(struct Score grade[], int n){
	int i;
	for(i=0;i<n;i++){
		//题目很坑,输出名字和成绩的中间必须要两个空格 
		printf("第%d名 %s %s  %.2f\n",i+1,grade[i].id,grade[i].name,grade[i].sum);
	}
}

       非计院学生书写,代码很浅显,只想分享自己的答案和思路,谢谢观看!有任何错误欢迎指正,我们一起进步!

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值