Отсортировать структуры по одному из полей - C (СИ) (78088)

Узнай цену своей работы

Формулировка задачи:

есть программа, пользователь вводит 3 поля данных, и они записываются в файл. как можно отсортировать данные по одному из полей ?
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. struct info {
  5. char auth[50];
  6. char title[50];
  7. int year; } book_i;
  8.  
  9. int main(void) {
  10.  
  11. int num, i;
  12. FILE *books;
  13.  
  14. books=fopen("books.txt", "wb");
  15.  
  16. printf("Enter number of elemets #");
  17. scanf("%i", &num);
  18. fflush(stdin);
  19. /*Entering and writing data to a file*/
  20. for(i=0; i<num; i++) {
  21. printf("enter author #");
  22. gets(book_i.auth);
  23.  
  24. printf("enter title #");
  25. gets(book_i.title);
  26. printf("enter year #");
  27. scanf("%i", &book_i.year);
  28. fflush(stdin);
  29. fprintf(books, "%s;%s;%i\n", book_i.auth,book_i.title, book_i.year);
  30. }
  31.  
  32. fclose(books);
  33. return(0);
  34. }

Решение задачи: «Отсортировать структуры по одному из полей»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. typedef struct  {
  6.     char auth[50];
  7.     char title[50];
  8.     int year;
  9. } info;    
  10.  
  11. int auth_cmp(const void* a, const void* b)
  12. {
  13.     info* c = (info*)a;
  14.     info* d = (info*)b;
  15.     return strcmp(c->auth, d->auth);
  16. }
  17.  
  18. int title_cmp(const void* a, const void* b)
  19. {
  20.     info* c = (info*)a;
  21.     info* d = (info*)b;
  22.     return strcmp(c->title, d->title);
  23. }
  24.  
  25. int year_cmp(const void* a, const void* b)
  26. {
  27.     info* c = (info*)a;
  28.     info* d = (info*)b;
  29.     return (c->year - d->year);
  30. }
  31.  
  32. int main(void)  
  33. {
  34.     int num, i;
  35.     FILE* file;
  36.     info* book_i;
  37.    
  38.     printf("Enter number of elemets #");
  39.     scanf("%i", &num);
  40.     fflush(stdin);
  41.  
  42.     if ((book_i = (info*)malloc(num * sizeof(info))) == NULL)
  43.         exit(EXIT_FAILURE);
  44.  
  45.         /*Entering and writing data to a file*/
  46.     for(i = 0; i < num; ++i)
  47.     {
  48.         printf("enter author #");
  49.         fgets(book_i[i].auth, 50, stdin);
  50.        
  51.  
  52.         printf("enter title #");
  53.         fgets(book_i[i].title, 50, stdin);
  54.  
  55.         printf("enter year #");
  56.         scanf("%i", &book_i[i].year);
  57.         fflush(stdin);
  58.     }
  59.  
  60.     qsort(book_i, num, sizeof(info), auth_cmp); //по авторам
  61.     qsort(book_i, num, sizeof(info), title_cmp); //по названиям
  62.     qsort(book_i, num, sizeof(info), year_cmp); //по годам
  63.  
  64.     if ((file = fopen("books.txt", "wt")) == NULL)
  65.         exit(EXIT_FAILURE);
  66.  
  67.     for (i = 0; i < num; ++i)
  68.         fprintf(file "%s;%s;%i\n", book_i[i].auth, book_i[i].title, book_i[i].year);  
  69.  
  70.     fclose(file);
  71.     free(book_i);
  72.     exit(EXIT_SUCCESS);
  73. }

Объяснение кода листинга программы

  1. В начале кода определяются структура info и три функции сравнения auth_cmp, title_cmp и year_cmp.
  2. Функция auth_cmp сравнивает поля auth структур.
  3. Функция title_cmp сравнивает поля title структур.
  4. Функция year_cmp сравнивает поля year структур.
  5. В функции main считывается количество элементов, которые необходимо отсортировать.
  6. Выделяется память под массив структур info с помощью функции malloc.
  7. В цикле считываются данные о книгах (автор, название, год) и записываются в файл books.txt.
  8. Используя функцию qsort и переданные функции сравнения, происходит сортировка массива структур по полям auth, title и year.
  9. Открывается файл books.txt для записи данных.
  10. В цикле данные о каждой книге записываются в файл books.txt.
  11. Функция fclose закрывает файл books.txt.
  12. Выделяемая память освобождается с помощью функции free.
  13. Программа завершается с кодом EXIT_SUCCESS.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы