gpt4 book ai didi

c - 对齐有错误

转载 作者:行者123 更新时间:2023-11-30 16:40:49 24 4
gpt4 key购买 nike

当我得到'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;
}

最佳答案

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
}

关于c - 对齐有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46505475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com