Сортировка массива структур - 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, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д