我正在尝试在C中对double类型的数组进行排序,但我没有得到预期的输出。它似乎是对内存地址进行排序而不是实际值。我已经尝试将vairables更改为(* grade [i]),但后来我得到了“unary *的无效类型参数”错误。这是有问题的代码片段。
void sortGrade(double grade[], int n){
int i, j, swapped;
double temp;
for (i = 0; i < n; ++i)
{
for (j = i + 1; j < n; ++j)
{
if (grade[i] < grade[j])
{
temp = grade[i];
grade[i] = grade[j];
grade[j] = temp;
}//end if
}//end inner for
}//end outer for
printf("After sort:\nGrade\n");
for (i = 0; i < n; ++i)
{
printf("%d\n", grade[i]);
}//end for
}//end sortGrade
非常感谢任何帮助。 完全披露,这是针对学校的,但作业已经提交,现在我只想弄清楚如何让它真正发挥作用。
答案 0 :(得分:1)
正如@M Oehm已经提到的那样,在打印双值时,您必须使用%f
而不是%g
。因此,
printf("%f\n", grade[i]);
而不是
printf("%d\n", grade[i]);
我认为目标是手工编写排序算法。如果没有,您可能需要查看stdlib提供的qsort。此功能执行快速排序算法。
// qsort(array pointer, number of elements, size of one element, compare function);
qsort(grade, n, sizeof(double), compare);
为了比较元素,你还需要一个比较函数。
// the compare function for double values
static int compare (const void * a, const void * b)
{
if (*(double*)a > *(double*)b) return 1;
else if (*(double*)a < *(double*)b) return -1;
else return 0;
}
答案 1 :(得分:1)
处理float
和double
时必须小心。它们不是100%精确的。在处理看似相同但位数较小的数字时,排序算法会中断,因为浮点数只是实数的近似值。
如果要比较两个double
变量,请使用它。
int areDoubleEqual(double a, double b) {
if (fabs(a - b) <= 1000 * DBL_EPSILON * fabs(a + b)) {
/*A and B are equal*/
return 1;
}
return 0;
}
如果要实现排序,我建议使用qsort。这是一个简单的例子
#include <stdio.h>
#include <float.h>
#include <math.h>
int areDoubleEqual(double a, double b) {
if (fabs(a - b) <= 1000 * DBL_EPSILON * fabs(a + b)) {
/*A and B are equal*/
return 1;
}
return 0;
}
/*This will sort in descending order. If you want ascending order, interchange 1 and -1*/
int compareDoubles(const void *a, const void *b) {
double doubleA = *(double *) a;
double doubleB = *(double *) b;
if(areDoubleEqual(doubleA, doubleB)) {
/*When A and B are equal, quick sort expects 0.
For further details check documentation*/
return 0;
}
/*A is bigger*/
if((doubleA - doubleB) >
((fabs(doubleA) < fabs(doubleB) ? fabs(doubleB) :
fabs(doubleA)) * DBL_EPSILON * 1000)) {
return -1;
}
/*B is bigger*/
return 1;
}
int main(void) {
double doubles[5] = {4.3, 2.1, 10.564, 350332.323, 0.3};
qsort(doubles, 5, sizeof(double), compareDoubles);
for(int i = 0; i < 5; i++) {
printf("%f ", doubles[i]);
}
printf("\n");
return 0;
}
答案 2 :(得分:0)
这应该有效:
int i, j, swapped;
double temp;
for (i = 0; i < n; ++i)
{
for (j = i + 1; j < n; ++j)
{
if (grade[i] < grade[j])
{
temp = grade[i];
grade[i] = grade[j];
grade[j] = temp;
}//end if
}//end inner for
}//end outer for
printf("After sort:\nGrade\n");
for (i = 0; i < n; ++i)
{
printf("%f\n", grade[i]);
}//end for
}//end sortGrade
该算法有效。唯一的错误是printf:
printf("%f\n", grade[i]); //for double values
或更好
printf("%lf\n", grade[i]); //for double values