C语言,去掉一个最高分和一个最低分,求平均分的问题

# include <stdio.h>

int main ()

{
int a[5],i;

for(i=0;i<5;i++)
{
printf("请%d号评委输入您所打的分数:\n",i+1);
scanf("%d",&a[i]);
}
printf("该选手的得分为:%d %d %d %d %d\n",a[0],a[1],a[2],a[3],a[4]);

int max=a[0],min=a[0];

for(i=0;i<5;i++)
{
if(a[i]>max)
max = a[i];
if(a[i]<min)
min = a[i];

}

printf("该选手的最高分为%d\n",max);
printf("该选手的最低分为%d\n",min);

int sum=0 , pj;

for(i=0;i<5;i++)
sum=sum+a[i];
pj=(sum-max-min)/3;

printf("去掉一个最高分:%d,一个最低分:%d,该选手的平均分为%d\n",max,min,pj);

return 0 ;
}

求帮忙优化,最好能告诉我为什么可以这样优化,先谢谢啦~

这段代码基本不需要优化,如果要优化的话,那就是把求和和计算最大最小值放在输入的同时进行,优化后代码如下:

# include <stdio.h>
int main ()
{
int a[5],i,sum=0;
double pj;
    int max,min;
for(i=0;i<5;i++)
{
printf("请%d号评委输入您所打的分数:\n",i+1);
scanf("%d",&a[i]);
sum += a[i];
if (i == 0){
            max = min = a[i];
}
else {
            if(a[i]>max)
                max = a[i];
            if(a[i]<min)
                min = a[i];
}
}
printf("该选手的得分为:");
for(i=0;i<5;i++)
{
printf("%d ",a[i]);
}
printf("\n该选手的最高分为%d\n",max);
printf("该选手的最低分为%d\n",min);
pj=(sum-max-min)/3.0;
printf("去掉一个最高分:%d,一个最低分:%d,该选手的平均分为%f\n",max,min,pj);
    return 0 ;
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-07-27
1.满足第一个肯定不会满足第二个 ,另外如果真要优化,你在这个循环就可以把总分算出来了,后面那个算总分的for循环就没用啦。
if(a[i]>max)
{
max = a[i];
}
else if(a[i]<min)
{
min = a[i];
}
2.评委数5后后面求平均分的3最好搞个变量,要更改平位数就该一个地方,简单而且不会改不全。
第2个回答  2013-11-07
#include<stdio.h>
int main()
{
int t,n,i,k,a,max,min;
float s;
scanf("%d",&t);

for(a=1;a<=t;a++)
{
max=0; s=0;
min=100;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&k);
if(k>=max) max=k;
if(k<=min) min=k;
s=s+k;
}
s=s-max-min;
n=n-2;
s=s/n;
printf("%.2f\n",s);
}
return 0;
}

 //把s和n写在for循环里

第3个回答  2015-07-27
没什么可优化的,就是O(n)的算法复杂度。
相似回答