Отсортировать структуры по одному из полей - 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.