【问题标题】:Sorting an array of floats with qsort in C在 C 中使用 qsort 对浮点数数组进行排序
【发布时间】:2015-12-11 11:19:37
【问题描述】:

最近我一直在尝试制作一个程序,该程序需要我对存储字符串和给定字符串的平均 ASCII 值的结构数组进行排序。我一直在尝试使用 stdlib qsort 对其进行排序,但是对于编码来说相对较新,我只有一些成功,因为当遇到 2 个字符串的相等平均值时,我必须按字母顺序对它们进行排序,否则它们必须从从高到低。

我的 qsort 标题中的比较函数如下所示:

int struct_compare(const void *a, const void *b)
{
    const struct *pa;
    const struct *pb;
    pa = a;
    pb = b;
    if ( fabs(pa->average - pb->average) <= 0.000001 )
        return (strcmp(pb->text,pa->text));
    else
        return (pb->average - pa->average);
}

排序后的数组如下所示:

85.166667
85.333333 
86.000000 
83.166667 
80.333333 
79.833333 
76.000000 
72.000000 
69.571429 
64.500000

【问题讨论】:

  • 不清楚预期的结果是什么,也许您还想发布在最后一行给出输出的输入
  • 请贴出actual比较函数(上面的代码连编译都没有)。
  • const struct * 不是有效类型。
  • 如果平均值的差异小于 epsilon,为什么要改用 strcmpstrcmp 不比较数字!
  • @IanAbbott 对,这就是他传递字符串而不是数字的原因。

标签: c floating-point comparison qsort


【解决方案1】:

把最后的return改成:

return pb->average > pa->average ? 1 : -1;

问题在于它将浮点值转换为整数值,因此如果差值小于 1,则有时会返回零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 2019-05-23
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2014-05-21
    • 1970-01-01
    相关资源
    最近更新 更多