在C中对double数组进行排序
我试图在C中对double类型的数组进行排序,但没有得到预期的输出。它似乎在对内存地址进行排序,而不是对实际值进行排序。我曾尝试将变量更改为(*grade[I]),但随后出现了“无效类型参数为一元*”的错误。这里是有问题的代码的狙击手在C中对double数组进行排序,c,arrays,sorting,pointers,C,Arrays,Sorting,Pointers,我试图在C中对double类型的数组进行排序,但没有得到预期的输出。它似乎在对内存地址进行排序,而不是对实际值进行排序。我曾尝试将变量更改为(*grade[I]),但随后出现了“无效类型参数为一元*”的错误。这里是有问题的代码的狙击手 void sortGrade(double grade[], int n){ int i, j, swapped; double temp; for (i = 0; i < n; ++i) { for (j = i + 1; j < n; ++
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
void排序等级(双等级[],整数n){
int i,j,交换;
双温;
对于(i=0;i
任何帮助都将不胜感激。
完全公开,这是为学校准备的,但作业已经提交,现在我只是想弄清楚如何真正让它工作。正如@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;
}
//双值比较函数
静态整数比较(常量无效*a,常量无效*b)
{
如果(*(双*)a>*(双*)b)返回1;
如果(*(双*)a<*(双*)b)返回-1;
否则返回0;
}
正如@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;
}
//双值比较函数
静态整数比较(常量无效*a,常量无效*b)
{
如果(*(双*)a>*(双*)b)返回1;
如果(*(双*)a<*(双*)b)返回-1;
否则返回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("%lf\n", grade[i]); //for double values
这应该起作用:
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("%lf\n", grade[i]); //for double values
处理
float
和double
时必须小心。它们不是100%精确的。当处理看似相同但较小的位数不同的数字时,排序算法将中断,因为浮点只是实数的近似值
如果要比较两个double
变量,请使用此选项
int-areDoubleEqual(双a,双b){
如果(fabs(a-b)在处理float
和double
时必须小心。它们不是100%精确的。当处理看起来相同但较小位不同的数字时,排序算法将中断,因为float只是实数的近似值
如果要比较两个double
变量,请使用此选项
int-areDoubleEqual(双a,双b){
if(晶圆厂(a-b)您的排序算法没有问题。错误是在打印时:使用%f
或%g
打印浮点数。如果您不告诉我们预期的输出是什么,很难说。显然,您应该在编译器中打开警告,这样就不需要M Oehms建议。修复后,它将被排序,但可能不是您的方式你期待它。如果你对内存地址进行排序,那么显然项目的顺序不会改变。数组元素总是按照内存地址进行排序。嗯,就是这样。现在一切都正常了。哇,我觉得自己像个白痴……谢谢你的帮助!不要在周末感觉自己像个白痴,但下次一定要激活警告.:)
您的排序算法没有问题。错误是在打印时:使用%f
或%g
打印浮点数。如果您不告诉我们预期的输出是什么,很难说。显然,您应该在编译器中打开警告,这样就不需要M Oehms建议。修复后,它将被排序,但可能不是这是你所期望的。如果你对内存地址进行排序,那么显然项目的顺序不会改变。数组元素总是按照内存地址进行排序。嗯,就是这样。现在一切都正常了。哇,我觉得自己像个白痴……谢谢你的帮助!不要在周末感觉自己像个白痴,但一定要激活警告nex时间。:)