题目描述
某大奖赛有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]//初始化为0min = 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);}//循环:loopvoid 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;}