h-b-z-d-j-s-m 发表于 2022-5-22 13:57:16

为什么没有得出正确结果

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

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

void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, j ;
double b, 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) ;
    }
    r = fun(b, 10) ;
    fprintf(wf, "%f\n", r) ;
}
fclose(fp) ;
fclose(wf) ;
}

jackz007 发表于 2022-5-22 14:49:22

本帖最后由 jackz007 于 2022-5-22 20:58 编辑

double fun(doublea[] , intn)
{
      int c , d , i                                                    ;
      double sum                                                       ;
      for(c = d = 0 , i = 1 ; i < n ; i ++) {
                if(a < a) c = i                                    ;
                else if(a > a) d = i                               ;
      }
      for(i = sum = 0 ; i < n ; i ++) if(i != c && i != d) sum += a ;
      return sum / (n - 2)                                             ;
}

傻眼貓咪 发表于 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;
      max = max > arr ? max : arr;
      min = min < arr ? min : arr;
    }
    sum -= max; // 考虑到 max 有可能是负数
    sum -= min; // 考虑到 min 有可能是负数
    return (double)sum / (n - 2);
}
页: [1]
查看完整版本: 为什么没有得出正确结果