Отсортировать структуры по одному из полей - C (СИ) (78088)
Формулировка задачи:
есть программа, пользователь вводит 3 поля данных, и они записываются в файл.
как можно отсортировать данные по одному из полей ?
Листинг программы
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- struct info {
- char auth[50];
- char title[50];
- int year; } book_i;
- int main(void) {
- int num, i;
- FILE *books;
- books=fopen("books.txt", "wb");
- printf("Enter number of elemets #");
- scanf("%i", &num);
- fflush(stdin);
- /*Entering and writing data to a file*/
- for(i=0; i<num; i++) {
- printf("enter author #");
- gets(book_i.auth);
- printf("enter title #");
- gets(book_i.title);
- printf("enter year #");
- scanf("%i", &book_i.year);
- fflush(stdin);
- fprintf(books, "%s;%s;%i\n", book_i.auth,book_i.title, book_i.year);
- }
- fclose(books);
- return(0);
- }
Решение задачи: «Отсортировать структуры по одному из полей»
textual
Листинг программы
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- typedef struct {
- char auth[50];
- char title[50];
- int year;
- } info;
- int auth_cmp(const void* a, const void* b)
- {
- info* c = (info*)a;
- info* d = (info*)b;
- return strcmp(c->auth, d->auth);
- }
- int title_cmp(const void* a, const void* b)
- {
- info* c = (info*)a;
- info* d = (info*)b;
- return strcmp(c->title, d->title);
- }
- int year_cmp(const void* a, const void* b)
- {
- info* c = (info*)a;
- info* d = (info*)b;
- return (c->year - d->year);
- }
- int main(void)
- {
- int num, i;
- FILE* file;
- info* book_i;
- printf("Enter number of elemets #");
- scanf("%i", &num);
- fflush(stdin);
- if ((book_i = (info*)malloc(num * sizeof(info))) == NULL)
- exit(EXIT_FAILURE);
- /*Entering and writing data to a file*/
- for(i = 0; i < num; ++i)
- {
- printf("enter author #");
- fgets(book_i[i].auth, 50, stdin);
- printf("enter title #");
- fgets(book_i[i].title, 50, stdin);
- printf("enter year #");
- scanf("%i", &book_i[i].year);
- fflush(stdin);
- }
- qsort(book_i, num, sizeof(info), auth_cmp); //по авторам
- qsort(book_i, num, sizeof(info), title_cmp); //по названиям
- qsort(book_i, num, sizeof(info), year_cmp); //по годам
- if ((file = fopen("books.txt", "wt")) == NULL)
- exit(EXIT_FAILURE);
- for (i = 0; i < num; ++i)
- fprintf(file "%s;%s;%i\n", book_i[i].auth, book_i[i].title, book_i[i].year);
- fclose(file);
- free(book_i);
- exit(EXIT_SUCCESS);
- }
Объяснение кода листинга программы
- В начале кода определяются структура
info
и три функции сравненияauth_cmp
,title_cmp
иyear_cmp
. - Функция
auth_cmp
сравнивает поляauth
структур. - Функция
title_cmp
сравнивает поляtitle
структур. - Функция
year_cmp
сравнивает поляyear
структур. - В функции
main
считывается количество элементов, которые необходимо отсортировать. - Выделяется память под массив структур
info
с помощью функцииmalloc
. - В цикле считываются данные о книгах (автор, название, год) и записываются в файл
books.txt
. - Используя функцию
qsort
и переданные функции сравнения, происходит сортировка массива структур по полямauth
,title
иyear
. - Открывается файл
books.txt
для записи данных. - В цикле данные о каждой книге записываются в файл
books.txt
. - Функция
fclose
закрывает файлbooks.txt
. - Выделяемая память освобождается с помощью функции
free
. - Программа завершается с кодом
EXIT_SUCCESS
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д