Сортировка массива структур - C (СИ) (71417)
Формулировка задачи:
Нужно ввести данные, и отсортированные по пункту назначения данные записать в файл. Проблема в сортировке, мой ее вариант, есть закомментированный в коде.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <string.h>
typedef struct /*Структура поезда*/
{
char place[15];
char num[15];
char depTime[15];
}train;
int main()
{
int i, a = 0, b = 0;/*Счетчики*/
train trains[5];/*Массивы структур*/
train trains1[5];
train swap;
FILE *tPtr;
FILE *t1Ptr;
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
tPtr = fopen("trains.dat", "w");/*Открытие файла для записи*/
if (tPtr == NULL)/*Ошибка открытия*/
printf("open failed on input file\n");
else/*Успешное открытие, ввод занных о пяти поездах*/
{
printf("Введіть дані про 5 потягів\n\n");
for (i = 0; i < 5; i++)
{
printf("Пункт призначення потягу: ");
scanf("%s", trains[i].place);
printf("Введіть номер потягу: ");
scanf("%s", trains[i].num);
printf("Введіть час відправлення(в годинах): ");
scanf("%s", trains[i].depTime); /*Где-то тут должна быть сортировка*/
fprintf(tPtr, "%s %s %s\n", trains[i].place, trains[i].num, trains[i].depTime);
}
fclose(tPtr);
}
/*for (a = 0; i < 5; a++)//Неработающая сортировка данных по пункту назначения, по алфавиту
for (b = a + 1; b < 5; b++)
if (strcmp(trains[a].place, trains[b].place)>0)
{
swap = trains[a];
trains[a] = trains[b];
trains[b] = swap;
}*/
puts("");
t1Ptr = fopen("trains.dat", "r");/*Открытие файла для чтение*/
if (t1Ptr == NULL)/*Ошибка открытия*/
perror("file cannot be open\n");
else/*Считывание данных и вывод их на экран*/
{
for (i = 0; !feof(t1Ptr); i++)
{
fscanf(t1Ptr, "%s %s %s\n", trains1[i].place, trains1[i].num, trains1[i].depTime);
printf("Place: %s\tNum= %s\tdepTime= %s\n", trains1[i].place, trains1[i].num, trains1[i].depTime);
}
fclose(t1Ptr);
}
puts("");
system("pause");
return 0;
}Решение задачи: «Сортировка массива структур»
textual
Листинг программы
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>
#include <string.h>
typedef struct /*Структура поезда*/
{
char place[15];
char num[15];
char depTime[15];
}train;
int place_cmp(const void * a, const void *b)
{
return strcmp(((train*)a)->place, ((train*)b)->place);
}
int main()
{
int i, a = 0, b = 0;/*Счетчики*/
train trains[5];/*Массивы структур*/
train trains1[5];
// train swap;
FILE *tPtr;
FILE *t1Ptr;
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
tPtr = fopen("trains.dat", "w");/*Открытие файла для записи*/
if (tPtr == NULL)/*Ошибка открытия*/
printf("open failed on input file\n");
else/*Успешное открытие, ввод занных о пяти поездах*/
{
printf("Введіть дані про 5 потягів\n\n");
for (i = 0; i < 5; i++)
{
printf("Пункт призначення потягу: ");
scanf("%s", trains[i].place);
printf("Введіть номер потягу: ");
scanf("%s", trains[i].num);
printf("Введіть час відправлення(в годинах): ");
scanf("%s", trains[i].depTime); /*Где-то тут должна быть сортировка*/
//fprintf(tPtr, "%s %s %s\n", trains[i].place, trains[i].num, trains[i].depTime);
}
}
qsort(trains, 5, sizeof(train), place_cmp);
printf("\nОтсортированные по месту:\n");
for (i = 0; i < 5; ++i)
printf("Place: %s\tNum= %s\tdepTime= %s\n", trains[i].place, trains[i].num, trains[i].depTime);
//запись в файл
for (i = 0; i < 5; i++)
fprintf(tPtr, "%s %s %s\n", trains[i].place, trains[i].num, trains[i].depTime);
fclose(tPtr);
puts("");
t1Ptr = fopen("trains.dat", "r");/*Открытие файла для чтение*/
if (t1Ptr == NULL)/*Ошибка открытия*/
perror("file cannot be open\n");
else/*Считывание данных и вывод их на экран*/
{
printf("Данные в файле:\n");
for (i = 0; !feof(t1Ptr); i++)
{
fscanf(t1Ptr, "%s %s %s\n", trains1[i].place, trains1[i].num, trains1[i].depTime);
printf("Place: %s\tNum= %s\tdepTime= %s\n", trains1[i].place, trains1[i].num, trains1[i].depTime);
}
fclose(t1Ptr);
}
puts("");
system("pause");
return 0;
}
Объяснение кода листинга программы
Код выполняет следующие действия:
- Указывает, что нужно отсортировать массив структур. В данном случае, сортировка происходит по полю
placeструктурыtrain. - Запрашивает и сохраняет в массиве структур данные о пяти поездах. Для каждого поезда пользователь должен ввести место назначения, номер поезда и время отправления.
- Сортирует массив структур по указанному полю. В данном случае, сортировка происходит по полю
place. - Выводит отсортированный массив структур на экран.
- Записывает отсортированный массив структур в файл `trains.dat.
- Открывает файл
trains.datдля чтения. - Считывает данные из файла и выводит их на экран.
- Закрывает файл.
- Выводит на экран приглашение для пользователя нажать любую клавишу.
- Возвращает 0, что означает успешное выполнение программы.