Сортировка массива структур - C (СИ) (71417)

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

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

Нужно ввести данные, и отсортированные по пункту назначения данные записать в файл. Проблема в сортировке, мой ее вариант, есть закомментированный в коде.
Листинг программы
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <string.h>
  5. typedef struct /*Структура поезда*/
  6. {
  7. char place[15];
  8. char num[15];
  9. char depTime[15];
  10. }train;
  11. int main()
  12. {
  13. int i, a = 0, b = 0;/*Счетчики*/
  14. train trains[5];/*Массивы структур*/
  15. train trains1[5];
  16. train swap;
  17. FILE *tPtr;
  18. FILE *t1Ptr;
  19. SetConsoleCP(1251);
  20. SetConsoleOutputCP(1251);
  21. tPtr = fopen("trains.dat", "w");/*Открытие файла для записи*/
  22. if (tPtr == NULL)/*Ошибка открытия*/
  23. printf("open failed on input file\n");
  24. else/*Успешное открытие, ввод занных о пяти поездах*/
  25. {
  26. printf("Введіть дані про 5 потягів\n\n");
  27. for (i = 0; i < 5; i++)
  28. {
  29. printf("Пункт призначення потягу: ");
  30. scanf("%s", trains[i].place);
  31. printf("Введіть номер потягу: ");
  32. scanf("%s", trains[i].num);
  33. printf("Введіть час відправлення(в годинах): ");
  34. scanf("%s", trains[i].depTime); /*Где-то тут должна быть сортировка*/
  35. fprintf(tPtr, "%s %s %s\n", trains[i].place, trains[i].num, trains[i].depTime);
  36. }
  37. fclose(tPtr);
  38. }
  39. /*for (a = 0; i < 5; a++)//Неработающая сортировка данных по пункту назначения, по алфавиту
  40. for (b = a + 1; b < 5; b++)
  41. if (strcmp(trains[a].place, trains[b].place)>0)
  42. {
  43. swap = trains[a];
  44. trains[a] = trains[b];
  45. trains[b] = swap;
  46. }*/
  47. puts("");
  48. t1Ptr = fopen("trains.dat", "r");/*Открытие файла для чтение*/
  49. if (t1Ptr == NULL)/*Ошибка открытия*/
  50. perror("file cannot be open\n");
  51. else/*Считывание данных и вывод их на экран*/
  52. {
  53. for (i = 0; !feof(t1Ptr); i++)
  54. {
  55. fscanf(t1Ptr, "%s %s %s\n", trains1[i].place, trains1[i].num, trains1[i].depTime);
  56. printf("Place: %s\tNum= %s\tdepTime= %s\n", trains1[i].place, trains1[i].num, trains1[i].depTime);
  57. }
  58. fclose(t1Ptr);
  59. }
  60. puts("");
  61. system("pause");
  62. return 0;
  63. }

Решение задачи: «Сортировка массива структур»

textual
Листинг программы
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <windows.h>
  5. #include <string.h>
  6.  
  7. typedef struct /*Структура поезда*/
  8. {
  9.     char place[15];
  10.     char num[15];
  11.     char depTime[15];
  12. }train;
  13.  
  14. int place_cmp(const void * a, const void *b)
  15. {
  16.     return strcmp(((train*)a)->place, ((train*)b)->place);
  17. }
  18.  
  19. int main()
  20. {
  21.     int i, a = 0, b = 0;/*Счетчики*/
  22.     train trains[5];/*Массивы структур*/
  23.     train trains1[5];
  24. //  train swap;
  25.     FILE *tPtr;
  26.     FILE *t1Ptr;
  27.  
  28.     SetConsoleCP(1251);
  29.     SetConsoleOutputCP(1251);
  30.  
  31.     tPtr = fopen("trains.dat", "w");/*Открытие файла для записи*/
  32.  
  33.     if (tPtr == NULL)/*Ошибка открытия*/
  34.         printf("open failed on input file\n");
  35.     else/*Успешное открытие, ввод занных о пяти поездах*/
  36.     {
  37.         printf("Введіть дані про 5 потягів\n\n");
  38.         for (i = 0; i < 5; i++)
  39.         {
  40.             printf("Пункт призначення потягу: ");
  41.             scanf("%s", trains[i].place);
  42.             printf("Введіть номер потягу: ");
  43.             scanf("%s", trains[i].num);
  44.             printf("Введіть час відправлення(в годинах): ");
  45.             scanf("%s", trains[i].depTime);                             /*Где-то тут должна быть сортировка*/
  46.             //fprintf(tPtr, "%s %s %s\n", trains[i].place, trains[i].num, trains[i].depTime);
  47.         }
  48.     }
  49.  
  50.     qsort(trains, 5, sizeof(train), place_cmp);
  51.     printf("\nОтсортированные по месту:\n");
  52.     for (i = 0; i < 5; ++i)
  53.         printf("Place: %s\tNum= %s\tdepTime= %s\n", trains[i].place, trains[i].num, trains[i].depTime);
  54.     //запись в файл
  55.     for (i = 0; i < 5; i++)
  56.         fprintf(tPtr, "%s %s %s\n", trains[i].place, trains[i].num, trains[i].depTime);
  57.     fclose(tPtr);
  58.  
  59.     puts("");
  60.  
  61.     t1Ptr = fopen("trains.dat", "r");/*Открытие файла для чтение*/
  62.     if (t1Ptr == NULL)/*Ошибка открытия*/
  63.         perror("file cannot be open\n");
  64.     else/*Считывание данных и вывод их на экран*/
  65.     {
  66.         printf("Данные в файле:\n");
  67.         for (i = 0; !feof(t1Ptr); i++)
  68.         {
  69.             fscanf(t1Ptr, "%s %s %s\n", trains1[i].place, trains1[i].num, trains1[i].depTime);
  70.             printf("Place: %s\tNum= %s\tdepTime= %s\n", trains1[i].place, trains1[i].num, trains1[i].depTime);
  71.         }
  72.         fclose(t1Ptr);
  73.     }
  74.  
  75.     puts("");
  76.     system("pause");
  77.     return 0;
  78. }

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

Код выполняет следующие действия:

  1. Указывает, что нужно отсортировать массив структур. В данном случае, сортировка происходит по полю place структуры train.
  2. Запрашивает и сохраняет в массиве структур данные о пяти поездах. Для каждого поезда пользователь должен ввести место назначения, номер поезда и время отправления.
  3. Сортирует массив структур по указанному полю. В данном случае, сортировка происходит по полю place.
  4. Выводит отсортированный массив структур на экран.
  5. Записывает отсортированный массив структур в файл `trains.dat.
  6. Открывает файл trains.dat для чтения.
  7. Считывает данные из файла и выводит их на экран.
  8. Закрывает файл.
  9. Выводит на экран приглашение для пользователя нажать любую клавишу.
  10. Возвращает 0, что означает успешное выполнение программы.

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


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

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

8   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы