Отсортировать структуры по одному из полей - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д