2013-04-30 68 views
-1

我有一個結構,其定義爲這樣:排序函數的輸出,以從高顯示至低價

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個TEST4基本圖表s,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和如何使用它在這個特殊的情況下將不勝感激。

+1

並非一切都有關語法。還有語義。你有什麼嘗試?你知道函數指針嗎?你在讀哪本書? – Sebivor 2013-04-30 05:55:00

回答

3

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 
); 
+0

@ Xerinos:確保你**理解**答案。不要複製粘貼。 – 2013-04-30 06:07:49

+0

從他/她過去問過的問題的角度來看,你有點太多了......如果他/她想了解任何事情,他/她會從C中知道這個問題的答案聖經。作爲哲學思想的食物:當判斷某人是否想學*時我應該尋找什麼? – Sebivor 2013-04-30 14:14:50

+0

@undefinedbehaviour嗯,這是一個很難回答的問題。一個具有不變'O(1)'計算複雜度的近似值將總是假設「OP不想學習並且僅僅複製粘貼」,因爲這就是Stack Overflow中99.99%的問題。 – 2013-04-30 14:19:00