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