鱼C论坛

 找回密码
 立即注册
查看: 1340|回复: 2

为什么没有得出正确结果

[复制链接]
发表于 2022-5-22 13:57:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目时去掉一个最高分,一个最低分,求平均值
为什么我的程序运行后平均值是错的
fun 函数为自己写的,其他是题目给的
#include  <stdio.h>
void NONO();
double fun(double  a[ ] , int  n)
{
        int i,c=0,b=0,j;
        double max,min,sum=0.0,aver=0.0;
        max=min=a[0];
        for(i=1;i<n;i++)
        {
                if(a[i]>max)
                {
                        max=a[i];
                    c=i;
                }
                if(a[i]<min)
                {
                        min=a[i];
                        b=i;
                }
        }
        for(j=0;j<n;j++)
        {
                if(j!=c||j!=b)
                {
                        sum+=a[j];
                }
        }
        return sum/(n-2);
}

void main()
{  double  b[10],  r;    int  i;
    printf("输入10个分数放入b数组中 :  ");
    for (i=0; i<10; i++)   scanf("%lf",&b[i]);
    printf("输入的10个分数是 :  ");
    for (i=0; i<10; i++)   printf("%4.1lf ",b[i]);    printf("\n");
    r = fun(b, 10);
    printf("去掉最高分和最低分后的平均分 :  %f\n", r );
    NONO();
}

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
  FILE *fp, *wf ;
  int i, j ;
  double b[10], r ;

  fp = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    for(j = 0 ; j < 10 ; j++) {
      fscanf(fp, "%lf ", &b[j]) ;
    }
    r = fun(b, 10) ;
    fprintf(wf, "%f\n", r) ;
  }
  fclose(fp) ;
  fclose(wf) ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-22 14:49:22 | 显示全部楼层
本帖最后由 jackz007 于 2022-5-22 20:58 编辑
double fun(double  a[] , int  n)
{
        int c , d , i                                                    ;
        double sum                                                       ;
        for(c = d = 0 , i = 1 ; i < n ; i ++) {
                if(a[i] < a[c]) c = i                                    ;
                else if(a[i] > a[d]) d = i                               ;
        }
        for(i = sum = 0 ; i < n ; i ++) if(i != c && i != d) sum += a[i] ;
        return sum / (n - 2)                                             ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-22 16:15:59 | 显示全部楼层
本帖最后由 傻眼貓咪 于 2022-5-22 16:17 编辑

我的思路:
其实不用太多 for 循环,一个 for 就够了,时间复杂度:O(n)。
循环同时,sum 加总数组里的全部元素,以及找出最大和最小元素(每次循环,都做比较大小),循环完成后,将 sum 减去 max 和 min 便可,最后 sum / (n - 2)
double average(int arr[], size_t n) {
    if (n < 3) {
        return 0;
    }
    int max = -2147483648, min = 2147483647, sum = 0;
    for (int i = 0; i < n; ++i) {
        sum += arr[i];
        max = max > arr[i] ? max : arr[i];
        min = min < arr[i] ? min : arr[i];
    }
    sum -= max; // 考虑到 max 有可能是负数
    sum -= min; // 考虑到 min 有可能是负数
    return (double)sum / (n - 2);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 14:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表