Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
else if (diff > 0) return 1; else return 0;}Для максимальной переносимости мы использовали
difftime()time_treturn (int)difftime(e1->start_date, e2->start_date);должно сработать, поскольку значения
time_tifВот пример файла данных со списком пяти президентов США:
$ <b>cat presdata.txt</b>/* Фамилия, имя, номер президента, инаугурация */Bush George 43 980013600Clinton William 42 727552800Bush George 41 601322400Reagan Ronald 40 348861600Carter James 39 222631200В
ch06-sortemp.cstruct employee1 /* ch06-sortemp.c --- Демонстрирует qsort() с двумя функциями сравнения. */23 #include <stdio.h>4 #include <stdlib.h>5 #include <time.h>67 struct employee {8 char lastname[30];9 char firstname[30];10 long emp_id;11 time_t start_date;12 };1314 /* emp_name_id_compare --- сравнение по имени, затем no ID */1516 int emp_name_id_compare(const void *e1p, const void *e2p)17 { /* ...как показано ранее, опущено для экономии места... */39 }4041 /* emp_seniority_compare --- сравнение по старшинству */4243 int emp_seniority_compare(const void *e1p, const void *e2p)44 { /* ...как показано ранее, опущено для экономии места... */58 }5960 /* main --- демонстрация сортировки */6162 int main(void)63 {64 #define NPRES 1065 struct employee presidents[NPRES];66 int i, npres;67 char buf[BUFSIZ];6869 /* Очень простой код для чтения данных: */70 for (npres = 0; npres < NPRES && fgets(buf, BUFSIZ, stdin) != NULL;71 npres++) {72 sscanf(buf, "%s %s %ld %ldn",73 presidents[npres].lastname,74 presidents[npres].firstname,75 &presidents[npres].emp_id,76 &presidents[npres].start_date);77 }7879 /* npres теперь содержит число прочитанных строк. */8081 /* Сначала сортировка по имени */82 qsort(presidents, npres, sizeof(struct employee), emp_name_id_compare);8384 /* Вывести результат */85 printf("Sorted by name:n");86 for (i = 0; i < npres; i++)87 printf("t%s %st%dt%s",88 presidents[i].lastname,89 presidents[i].firstname,90 presidents[i].emp_id,91 ctime(&presidents[i].start_date));9293 /* Теперь сортировка по старшинству */94 qsort(presidents, npres, sizeof(struct employee), emp_seniority_compare);9596 /* И снова вывести */97 printf("Sorted by seniority:n");98 for (i = 0; i < npres; i++)99 printf("t%s %st%dt%s",100 presidents[i].lastname,101 presidents!i].firstname,102 presidents[i].emp_id,103 ctime(&presidents[i].start_date));104 }Строки 70–77 считывают данные. Обратите внимание, что любое использование
scanf()Строка 82 сортирует данные по имени и по ID сотрудника, а затем строки 84–91 выводят отсортированные данные. Сходным образом строка 94 пересортировывает данные, на этот раз по старшинству, а строки 97–103 выводят результаты. После компилирования и запуска программа выдает следующие результаты: