鱼C论坛

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

为什么没有得出正确结果

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

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

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

x
题目时去掉一个最高分,一个最低分,求平均值
为什么我的程序运行后平均值是错的
fun 函数为自己写的,其他是题目给的
  1. #include  <stdio.h>
  2. void NONO();
  3. double fun(double  a[ ] , int  n)
  4. {
  5.         int i,c=0,b=0,j;
  6.         double max,min,sum=0.0,aver=0.0;
  7.         max=min=a[0];
  8.         for(i=1;i<n;i++)
  9.         {
  10.                 if(a[i]>max)
  11.                 {
  12.                         max=a[i];
  13.                     c=i;
  14.                 }
  15.                 if(a[i]<min)
  16.                 {
  17.                         min=a[i];
  18.                         b=i;
  19.                 }
  20.         }
  21.         for(j=0;j<n;j++)
  22.         {
  23.                 if(j!=c||j!=b)
  24.                 {
  25.                         sum+=a[j];
  26.                 }
  27.         }
  28.         return sum/(n-2);
  29. }

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

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

  45.   fp = fopen("in.dat","r") ;
  46.   wf = fopen("out.dat","w") ;
  47.   for(i = 0 ; i < 10 ; i++) {
  48.     for(j = 0 ; j < 10 ; j++) {
  49.       fscanf(fp, "%lf ", &b[j]) ;
  50.     }
  51.     r = fun(b, 10) ;
  52.     fprintf(wf, "%f\n", r) ;
  53.   }
  54.   fclose(fp) ;
  55.   fclose(wf) ;
  56. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-22 14:49:22 | 显示全部楼层
本帖最后由 jackz007 于 2022-5-22 20:58 编辑
  1. double fun(double  a[] , int  n)
  2. {
  3.         int c , d , i                                                    ;
  4.         double sum                                                       ;
  5.         for(c = d = 0 , i = 1 ; i < n ; i ++) {
  6.                 if(a[i] < a[c]) c = i                                    ;
  7.                 else if(a[i] > a[d]) d = i                               ;
  8.         }
  9.         for(i = sum = 0 ; i < n ; i ++) if(i != c && i != d) sum += a[i] ;
  10.         return sum / (n - 2)                                             ;
  11. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我的思路:
其实不用太多 for 循环,一个 for 就够了,时间复杂度:O(n)。
循环同时,sum 加总数组里的全部元素,以及找出最大和最小元素(每次循环,都做比较大小),循环完成后,将 sum 减去 max 和 min 便可,最后 sum / (n - 2)
  1. double average(int arr[], size_t n) {
  2.     if (n < 3) {
  3.         return 0;
  4.     }
  5.     int max = -2147483648, min = 2147483647, sum = 0;
  6.     for (int i = 0; i < n; ++i) {
  7.         sum += arr[i];
  8.         max = max > arr[i] ? max : arr[i];
  9.         min = min < arr[i] ? min : arr[i];
  10.     }
  11.     sum -= max; // 考虑到 max 有可能是负数
  12.     sum -= min; // 考虑到 min 有可能是负数
  13.     return (double)sum / (n - 2);
  14. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 11:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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