Сортировка массива структур - 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;
}

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

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

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

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


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

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

8   голосов , оценка 4 из 5
Похожие ответы