1220 问题 H: 编写函数:谁能上春晚? (Append Code)

题目描述
科大电视台将在2013年2月10日举办一场大型春节晚会。为了选拔好节目,科大电视台将于近日举办一次“直通科大春晚”的节目,届时将有M名选手和N名评委参加,并选拔排名前三甲的选手参加春晚。

选手的排序原则是:对每名选手,N个评委的评分需要去掉一个最高分和一个最低分,然后求其平均分,按照平均分进行递减排序。假定任意2名选手的平均得分都不相同。

现在,已知每位评委给每名参数选手的评分,需要你来编写一个程序,输出能够参加春晚的三名选手的名字和得分。

-----------------------------------------------------------------------------

至少编写两个函数完成程序:

原型:int inputChoice(Choice peo[],int M,int N);

功能:输入M名选手的信息。选手信息存储在数组peo[]中,M和N分别是选手数和评委数。

原型:int sort(Choice peo[],int M,int N);

功能:用于对M名选手根据平均得分排成递减序。选手信息存储在数组peo[]中,M和N是选手数和评委数。

函数的调用格式见“Append Code”。

-----------------------------------------------------------------------------

“Append Code”中用到如下结构体定义:

typedef struct
{
      int score[10];//选手的10个得分,得分与评委一一对应
      double aver;//选手的平均分
      char name[81];//选手的姓名
} Choice;

输入

输入的第一行是M和N,表示有M名选手和N名评委。其中3<M<31,3<N<11。

之后是M行输入,每行以选手的名字为开头(选手名字不超过80个字符,且不含任何空白符),之后是一个空格以及N个得分,得分两两之间用一个空格隔开。

输出

输出为三行,每行是一个能够上春晚的选手的名字和得分,名字和得分用一个空格隔开。输出顺序为冠军、亚军和季军。

样例输入

4 5
Jack 91 92 93 94 95
Tom 85 84 83 82 81
Mary  92 92 92 92 92
Smith 73 73 73 73 73

样例输出

Jack 93.00
Mary 92.00
Tom 83.00

提示

Append Code

append.c

解法如下:

我个人还是喜欢用qsort排序

#include <stdio.h>
#include <stdlib.h>
typedef struct people {
	int score[10];//选手的10个得分,得分与评委一一对应
	double aver;//选手的平均分
	char name[81];//选手的姓名
} Choice;
int comp(const void *a, const void *b) {
	struct people *p = (struct people *)a;
	struct people *q = (struct people *)b;
	return q->aver > p->aver ? 1 : -1;
}
int cmp(const void *a, const void *b) {
	return *(int *)a - *(int *)b;
}
int inputChoice(Choice peo[], int M, int N) {
	int sum[1000] = {0};
	for (int i = 0; i < M; i++) {
		scanf("%s", &peo[i].name);
		for (int j = 0; j < N; j++) {
			scanf("%d", &peo[i].score[j]);
			sum[i] = peo[i].score[j]	;
		}
	}
	qsort(sum, N, sizeof(sum[0]), cmp);
}
int sort(Choice peo[], int M, int N) {
	int sum[100] = {0};
	int i, j;
	for (i = 0; i < M; i++)
		for (j = 1; j < N - 1; j++)
			sum[i] += peo[i].score[j];
	for (i = 0; i < M; i++) {
		peo[i].aver = (double)sum[i] / (N - 2);
	}
	qsort(peo, M, sizeof(peo[0]), comp);
}
int main() {
	Choice peoples[30];
	int M, N, i;
	scanf("%d%d", &M, &N);
	inputChoice(peoples, M, N);
	sort(peoples, M, N);
	for (i = 0; i < 3; i++)
		printf("%s %.2lf\n", peoples[i].name, peoples[i].aver);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值