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

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

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

Есть программа, пользователь вводит 4 поля данных, для пяти разных товаров и они записываются в файл. Как можно отсортировать данные,например, по году выпуска ?
#include "stdafx.h" 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void main()
{
    struct tovari
    {
        char name[10];
        char cena[10];
        char year[10];
        char kol[10];
    };
    struct tovari tovari[6];
    int i;
    char tmp;
 
    FILE *output;
    output=fopen("rez.txt","w");
 
    for (i=1;i<=5;i++)
    {
        printf("Nazvanie %d tovara\n",i);
        scanf("\n%s",tovari[i].name);
        printf("Cena\n");
        scanf("\n%s",tovari[i].cena);
        printf("God\n");
        scanf("\n%s",tovari[i].year);
        printf("Kolichestvo\n");
        scanf("\n%s",tovari[i].kol);
 
    }
     
        for (i=1;i<=5;i++)
        {   
        fprintf(output,"%d-Tovar:\n",i);
        fprintf(output,"%s\n",tovari[i].name);
        fprintf(output,"%s\n",tovari[i].cena);
        fprintf(output,"%s\n",tovari[i].year);
        fprintf(output,"%s\n",tovari[i].kol);
    }
}

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

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
struct tovari
{
    char name[10];
    char cena[10];
    char year[10];
    char kol[10];
};
 
int Compare(const void* first, const void* second)
{
    return strcmp(((struct tovari*)first)->year, ((struct tovari*)second)->year);
}
 
int main()
{
    struct tovari tovari[5];
    int i;
 
    FILE* output;
    output = fopen("rez.txt", "w");
 
    for (i = 0; i < 5; i++)
    {
        printf("Nazvanie %d tovara\n", i + 1);
        scanf("\n%s", tovari[i].name);
        printf("Cena\n");
        scanf("\n%s", tovari[i].cena);
        printf("God\n");
        scanf("\n%s", tovari[i].year);
        printf("Kolichestvo\n");
        scanf("\n%s", tovari[i].kol);
 
    }
 
    qsort(tovari, 5, sizeof(struct tovari), Compare);
 
    for (i = 0; i < 5; i++)
    {
        fprintf(output, "%d-Tovar:\n", i + 1);
        fprintf(output, "%s\n", tovari[i].name);
        fprintf(output, "%s\n", tovari[i].cena);
        fprintf(output, "%s\n", tovari[i].year);
        fprintf(output, "%s\n", tovari[i].kol);
    }
 
    fclose(output);
 
    return 0;
}

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

  1. Включаются необходимые заголовочные файлы
  2. Объявляется структура tovari с полями name, cena, year, kol
  3. Создается функция сравнения Compare, которая будет использоваться в функции сортировки qsort
  4. В функции main создается массив структур tovari, инициализированный нулевыми значениями
  5. Открывается файл rez.txt в режиме записи
  6. В цикле запрашиваются значения полей структуры tovari и сохраняются в соответствующих переменных
  7. Вызывается функция qsort для сортировки массива tovari по полю year с использованием функции сравнения Compare
  8. В цикле выводятся отсортированные значения полей структуры tovari в файл rez.txt
  9. Файл rez.txt закрывается
  10. Возвращается 0, что означает успешное выполнение программы

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


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

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

12   голосов , оценка 3.917 из 5
Похожие ответы