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

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

  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
Похожие ответы