Отсортировать структуры по одному из полей - 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;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Объявляется структура
tovariс полями name, cena, year, kol - Создается функция сравнения Compare, которая будет использоваться в функции сортировки qsort
- В функции main создается массив структур tovari, инициализированный нулевыми значениями
- Открывается файл
rez.txtв режиме записи - В цикле запрашиваются значения полей структуры tovari и сохраняются в соответствующих переменных
- Вызывается функция qsort для сортировки массива tovari по полю year с использованием функции сравнения Compare
- В цикле выводятся отсортированные значения полей структуры tovari в файл
rez.txt - Файл
rez.txtзакрывается - Возвращается 0, что означает успешное выполнение программы