【问题标题】:Sorting the output of a function to display from High to Low对函数的输出进行排序以从高到低显示
【发布时间】:2013-04-30 05:45:49
【问题描述】:

我有一个结构体,定义如下:

typedef struct structure
{
char names[20];
int scores[4];
float average;
char letter;
} stuff;

并从该结构中创建了这个数组:

stuff everything[13];

后来,调用了一个函数:

display(everything);

在屏幕上显示一个基本图表,按顺序显示 13 个名称、13 个 test1s、13 个 test2s、13 个 test3s、13 个 test4s、13 个平均数和 13 个字母等级。作为参考,函数如下所示:

void display(stuff *everything)
{
int q = 0;

printf("\n\n Name \t\t E1 \t E2 \t E3 \t E4 \t Avg \t Grade");
for(q=0; q<13; q++)
{
printf("\n %s \t %d \t %d \t %d \t %d \t %.2f \t %c", 
everything[q].names,
everything[q].scores[0],
everything[q].scores[1],
everything[q].scores[2], 
everything[q].scores[3],
everything[q].average,
everything[q].letter);
}
return;
}

我想取平均值并将它们相互比较,这样当它显示到屏幕上时,第一个结果是最高的平均值,然后从那里下降。我很确定我会使用 'qsort()' 但我在理解它的语法时遇到了极大的困难。非常感谢您对 qsort 的一些帮助以及如何在此特定情况下使用它。

【问题讨论】:

  • 并非一切都与语法有关。还有语义。你试过什么?你知道函数指针吗?你在看哪本书?

标签: c arrays function typedef qsort


【解决方案1】:

man 3 qsort()。如果您阅读此内容,您将能够使用它。您唯一需要的是一个适当的比较器函数,它返回作为参数给出的两个元素的顺序:

int comp_avg(const void *p1, const void *p2)
{
    const stuff *s1 = p1, *s2 = p2;
    return (s1->average > s2->average) - (s1->average < s2->average);
}

然后你可以轻松地对数组进行排序:

qsort(
    everything,
    sizeof(everything) / sizeof(everything[0]),
    sizeof(everything[0]),
    comp_avg
);

【讨论】:

  • @Xerinos:确保您理解答案。不要复制粘贴。
  • 从他/她过去问的问题来看,你问的有点太多了……如果他/她想了解什么,他/她会知道从 C 圣经回答这个问题。作为哲学思考题:在判断某人是否想学习时,我应该寻找什么?
  • @undefinedbehaviour 嗯,这是一个难题。具有恒定O(1) 计算复杂度的近似值是简单地假设“OP 不想学习而只是复制粘贴”,因为这是 Stack Overflow 上 99.99% 的提问者所做的。
  • 我敢肯定,如果您进一步考虑,可以描述您使用的启发式方法。我很想听听你的想法:)
  • @undefinedbehaviour 好吧,在 SO 上保持活跃半年,你就会明白我的意思了! ;-)
猜你喜欢
  • 1970-01-01
  • 2014-04-07
  • 2020-09-04
  • 2011-12-08
  • 1970-01-01
  • 2023-03-28
  • 2018-01-30
  • 1970-01-01
  • 2021-02-17
相关资源
最近更新 更多