题目描述:
某大赛有n个选手参赛,m个评委为参赛选手评判打分,最高10分,最低0分。统分规则为:每个选手得到的m个评分中去掉一个最高分,去掉一个最低分,然后平均为该选手的最后得分。确定好所有选手的最后得分后从高到低排出名次表,以此确定获奖名单。
设计思路:
首先申请一个二维数组记录所有评委给各位选手的分数,然后申请3个一维数组,其中含有记录总得分的sum[n]数组,计算排名的数组还有计算平均分的浮点数类型数组。最后只需要打印输出就可以了。
程序如下:
#include<stdio.h>
int main()
{
int n,m,i,j,min,max;
printf("input the number of the player:");
scanf("%d",&n);
printf("input the number of the judge:");
scanf("%d",&m);
int a[n][m],c[n],sum[n];
float b[n];
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
printf("第%d位评委给第%d位选手的分数是:",j+1,i+1);
scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++) //求每位选手的得分平均值,记录在b[i]中
{
sum[i]=0;
min=10;
max=0;
for(j=0;j<m;j++)
{
sum[i]+=a[i][j];
if(min>a[i][j])
min=a[i][j];
if(max<a[i][j])
max=a[i][j];
}
b[i]=(sum[i]-min-max)/(float)(m-2); //求平均值
c[i]=1;
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(b[j]<b[i])
c[j]++;
for(i=0;i<n;i++)
{
printf("第%d位选手平均分数为%.2f,名次是第%d。\n",i+1,b[i],c[i]);
}
return 0;
}
易出错点在于函数循环中最小值和最大值的赋初值问题,在计算每一位选手分数时,都要给min和max初值,否则有可能出现第一个人的最高分一直被后面人沿用这样的情况。
在计算平均值时就会出现错误。
最后运行的程序结果见图:
以及在VMware的Linux虚拟机上运行的结果: