对齐时出错

时间:2017-09-30 17:50:37

标签: c

当我得到N个真实数据时,计算除最大数据和最小数据之外的剩余数据的平均值。'我写了以下代码。我使用快速对齐创建它,但它没有正确对齐,导致错误。问题出在哪儿? (在代码中,N是用m编写的,这是检查对齐是否良好的代码:

[for (i = 0; i < m; i++) { printf("%lf ", arr[i]); }]

这是我的完整计划:

#include <stdio.h>
#include <stdlib.h>

int bans(const void *a, const void *b) {
    return (*(double *)a - *(double *)b);
}

int main() 
{ 
    int m, i;
    double a = 0;
    double* arr;
    scanf("%d", &m);
    arr = (double*) malloc(sizeof(int) * m);
    for (i = 0; i < m; i++) {
        scanf("%lf", &arr[i]);
    }
    qsort(arr, m, sizeof(arr[0]), bans);
    for (i = 0; i < m; i++) {
      printf("%lf ", arr[i]);
    }
    printf("\n"); 
    for (i = 1; i < m - 1; i++) {
      a += arr[i];
    } 
    printf("%.4lf", a / (m - 2));
    free(arr);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

OP没有为sizeof(int)分配double* arr;的适当大小的内存。 @Weather Vane

最好确定基于取消引用的大小的大小而不是类型。 @Jabberwock。编码,审查和维护更容易。

double* arr;
...
// arr = (double*) malloc(sizeof(int) * m);
arr = malloc(sizeof *arr * m);

此外,无需转换返回值。

比较功能也可能溢出。为了避免这种情况:

int bans(const void *a, const void *b) {
  // return (*(double *)a - *(double *)b);
  return (*(double *)a > *(double *)b) - (*(double *)a < *(double *)b);
}

在迂腐音符中,FP值可能包括NaN。排序时,建议始终将NaN放在排序列表的末尾。然后,稍后处理可以容易地缩短列表,因为当NaN存在时,列表是经常被丢弃的。该选择案例所需的代码。

int bans(const void *a, const void *b) {
  double *ad = *((const double *)a);
  double *bd = *((const double *)a);
  if (ad > bd) return 1;
  if (ad < bd) return -1;
  if (ad == bd) return 0;

  at least 1 of ad,ab is a NaN
  return 1; // adjust per coding goals
}

答案 1 :(得分:0)

一种方法:

#include <stdio.h>
#include <stdlib.h>

int bans(const void *a, const void *b)
  {
  return(*(double *)a - *(double *)b);
  }

int main()
  {
  int m, i;
  double a = 0;
  double *arr;

  printf("Number of elements: ");
  scanf("%d", &m);
  /* Casting the "void *" returned from malloc() is not needed. */
  /* Changed sizeof(int) to sizeof(double) */
  arr = malloc(sizeof(double) * m);
  for(i = 0; i < m; i++)
     {
     printf("Enter element %d of %d: ", i+1, m);   
     scanf("%lf", &arr[i]);
     }

  /* Sort the entries from highest to lowest */
  qsort(arr, m, sizeof(arr[0]), bans);

  for(i = 1; i < (m-1); i++)
     {
     a += arr[i];
     }

  printf("Average, minus largest and smallest: %.4lf\n", a / (m - 2));

  free(arr);
  return 0;
  }

执行示例:

Number of elements: 5
Enter element 1 of 5: 4.2
Enter element 2 of 5: 9.1
Enter element 3 of 5: 2.3
Enter element 4 of 5: 9.9
Enter element 5 of 5: 0.2
Average, minus largest and smallest: 5.2000