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