Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中对double数组进行排序_C_Arrays_Sorting_Pointers - Fatal编程技术网

在C中对double数组进行排序

在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; ++

我试图在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; ++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时间。
:)