某大奖赛有n个选手参赛,m个评委为依次参赛的选手评判打分

题目描述
某大奖赛有n(1<n<40)个选手参赛,m(2<m<20)个评委为依次参赛的选手评判打分:最高10分,最低0分。统分规则为:每个选手所得的m个得分中,去掉一个最高分,去掉一个最低分,最后平均为该选手的最后得分。根据n个选手的最后得分从高到低排出名次表,以便确定获奖名单。
输入
输入选手的数目n(1<n<40),评委的数目m(2<m<20),以及评委对每位选手的打分。
输出
选手的排名及最终的得分值(小数点后保留两位)。
样例输入
3,5
5.6 7.8 9.4 5.8 8.8
7.8 6.7 8.3 6.9 5.5
6.7 9.2 8.8 8.3 9.0
样例输出
第1名:3号选手,得分8.70
第2名:1号选手,得分7.47
第3名:2号选手,得分7.13提示
1.在输入样例中,第一行的"3,5”表示3个选手,5个评委。
2.在输入样例中,第二行为5个评委对第1位选手的分别打分;第三行为5个评委对第2位选手的分别打分;第四行为5个评委对第3位选手的分别打分.
3.在输出样例中出现的标点符号均在英文状态下输入的。 */

#include <stdio.h>
void swap(float *, float *);
float average(int m, float judge[]);
void bubble_sort(int n, float competitor[]);

int main() {
	int n, m;
	int max ;
	float judge[20];
	float competitor[40];
	float copycompetior[40];
	int numberOfcompetitor[40];//储存选手编号
	scanf("%d%d", &n, &m);//届时注意输入分隔符,
	for (int i = 0; i < n; i++) {
		competitor[i] = average(m, judge);
		// printf("%d\n",competitor[// printf(“%d \ n”,competitor [i]);i]);
	}
	for (int i = 0; i < n; i++) {
		copycompetior[i] = competitor[i];
	}
	for (int i = 0; i < n ; i++) {
		//找到该趟次中最大元素所在位置索引.
		max = 0;
		for (int j = 1; j < n ; j++) {
			if (copycompetior[max] < copycompetior[j])
				max = j ;//再打各补丁?

		}
		numberOfcompetitor[i] = max;//记录位置
		copycompetior[max] = 0;//使之不会影响下一个排名的选手的查找.
		
	}
	bubble_sort(n, competitor);

	for (int i = 0; i < n; i++)
	{
		printf("第%d名: %d 号选手 得分%.2f分\n", i+1, numberOfcompetitor[i]+1, competitor[i]);//printf("%f(修改时若忽视将导致输出异常")
	}

	return 0;//主函数.
}
//
void swap(float *a, float *b) {
	float temp;
	temp = *a;
	*a = *b;
	*b = temp;
	return;//修改旧变量(这一操作),二不带回其他值.

}
float average(int m, float judge[]) {
	float min, max, temp, sum = 0;
	scanf("%f", &judge[0]);//(也可以整合到for里面去),则min = max =judge[0]//初始化为0
	min = max = judge[0];
	//这是就要及时地为sum赋上第一个值(judge[0]),否则第一个值将丢失.
	sum = judge[0];
	for (int i = 1; i < m; i++) {
		//不对数组进行任何排序性修改,只是记录最值,并保存(迭代更换)到指定的变量里
		scanf("%f", &judge[i]);//函数内部的变量类型也要在修改函数是注意
		sum += judge[i];

		if (min > judge[i]) {        //也可以使用swap()
			temp = judge[i];
			judge[i] = min;
			min = temp;
		}
		else if (max < judge[i]) {
			temp = judge[i];
			judge[i] = max;
			max = temp;
		}
	}
	sum = sum - min - max;
	return sum / (m - 2.0);
}
//循环:loop
void bubble_sort(int n, float competitor[]) {
	int max;
	//事实上,选择排序法更适合于本题

	for (int i = 0; i < n - 1; i++) {//i = 0的版本.
		 
		//j作箭头指着.(从最后一个索引(n-1))
		for (int j = n - 1; j > i; j--) {// j:  0,1,...,    i,...n-2,   n-1.(也可写作j<= n-2),该轮进行了n-2 - i + 1 = n-1-i次比较.
			max = n;//?
					//每一趟地最后一个元素由判断语句中的competitor[j+1]引入比较.
			if (competitor[j] > competitor[j - 1]) {

				swap(&competitor[j], &competitor[j - 1]);

			}
			

		}//该趟(对应行的排序结束)

		
	}

	return;
}
posted @ 2024-09-17 22:03  xuchaoxin1375  阅读(66)  评论(0)    收藏  举报  来源