2013-04-30 3 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 с, 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

ответ

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

+0

@undefinedbehaviour Ну, это сложный вопрос. Аппроксимация с постоянной 'O (1)' вычислительной сложностью будет состоять в том, чтобы просто всегда предполагать, что OP не хочет учиться и просто копировать-пасты, потому что это то, что делает 99,99% опрошенных в Stack Overflow. – 2013-04-30 14:19:00