有m个选手n个评委,每个评委给所有选手打分。最后得分的计算规则为去掉一个最高分,去掉一个最低分后取平均分为最后得分。要求按得分从高到低排出名次,公布获奖名单。本题要求用行指针实现。1≤m,n≤10。请务必用冒泡排序。
输入格式:
输入共m+1行,第一行是m和n两个整数,其他行是m×n个整数。
输出格式:
输出一行,表示选手编号的一种排列(用%3d格式),这种排列代表得分从高到低的选手顺序。
输入样例:
8 5
7 8 9 7 8
8 9 7 9 8
8 9 8 8 7
8 9 9 9 8
7 6 8 9 7
6 7 8 9 9
6 7 8 7 8
7 8 7 6 7
输出样例:
4 2 3 6 1 5 7 8
问题分析:
二维数组的每一行代表了一位选手的成绩,在函数传入时每次传入一行,对其进行排序然后从第二位加到倒数第二位,因为平均数可能为小数所以要用float类型的数组保存起来,在排序时使用冒泡排序时应注意内层循环的初始条件应为int j=i+1;在每一位选手的平均分数都求出后应该进行名次排名,定义一个数组ming来保存每一名的选手是第几位选手。
应使用双层循环,外层循环来记录第几名是第几位选手,内层循环来寻找分数在现存选手中最高的那一位选手的下标(注:因为分数b元素的下标与其次序不相同,在输出名次时应将ming记录的下标加一得到次序输出),结束内层循环后说明现在这些选手中分数最高的选手的次序已经找出,这位选手不需要参加下一轮比较将b【ming【i】】 赋值为0,表示下一轮比较时这一位选手不会影响比较结果。
然后ming【i】的下标i表是的是名次,ming【i】中记录的是这一名词的选手是第几位选手
代码实现:
#include<stdio.h>
float paixvqiujunzhi(int a[],int n){
for(int i=0;i<n-1;i++){
for(int j=i;j<n;j++){
if(a[i]<a[j]){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
float sum=0;
for(int i=1;i<n-1;i++){
sum+=a[i];
}
return sum/(n-2);
}
int main(){
int m,n,a[10][10],ming[10];
float b[10];
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<m;i++){
b[i]=paixvqiujunzhi(a[i],n);
}
for(int i=0;i<m;i++){
ming[i]=0;
for(int j=0;j<m;j++){
if(b[ming[i]]<b[j]){
ming[i]=j;
}
}
b[ming[i]]=0;
}
for(int i=0;i<m;i++){
printf("%3d",ming[i]+1);
}
return 0;
}
提交结果: