Сортировка рейсов по датам вылета - PullRequest
0 голосов
/ 10 декабря 2018

Ниже приведены следующие полеты:

AA43 DFW DTW 2016-01-06 11:00
AA43 DFW DTW 2016-01-17 11:00
AA44 SEA JFK 2015-02-05 7:45
AA197 ORD BOS 2012-03-12 11:50 
AA1 JFK LAX 2016-07-02 9:00
OO7435 DTW PLN 2016-11-22 21:55
F9612 DEN MIA 2014-12-19 22:15
DL801 GEG MSP 2016-08-31 9:00
DL1087 ATL DAB 2016-04-10 12:05
DL828 IAH SLC 2012-06-02 7:45

Теперь представьте, все ли полеты были в текстовом файле.как бы вы отсортировали их по датам отъезда?Когда я имею в виду «дату вылета», я имею в виду сортировку их по «гггг-мм-дд чч: мин».

Когда я пытался отсортировать ее, он просто сортировал бы все рейсы вместо того, чтобы просто отправлятьдаты.Если бы не было рейсов авиакомпании, а только даты вылета, это было бы прекрасно.

Вот как это будет выглядеть в коде для того, что я говорил ранее.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
    FILE *fp1;
    FILE *fp2;
    int i, j;
    int line = 0;
    char temp[128], outputFile[15], airLine[256];
    char **strData = NULL;

    printf("Enter input file name:");
    scanf("%s", airLine);

    fp1 = fopen(airLine,"r");
    if (!fp1)
    {
       return 1;
    }

    sprintf(outputFile, "sun");
    fp2 = fopen(outputFile, "w");

    while(fgets(temp, 128, fp1))
    {
        if(strchr(temp, '\n'))
        {
            temp[strlen(temp-1)] = '\0';
            strData = (char**)realloc(strData, sizeof(char**)*(line+1));
            strData[line] = (char*)calloc(128, sizeof(char));
            strcpy(strData[line], temp);
            line++;
        }
    }
    for(i= 0; i < (line - 1); ++i)
    {
        for(j = 0; j < ( line - i - 1); ++j)
        {
            if(strcmp(strData[j], strData[j+1]) > 0)
            {
                strcpy(temp, strData[j]);
                strcpy(strData[j], strData[j+1]);
                strcpy(strData[j+1], temp);
            }
        }
    }
    for(i = 0; i < line; i++)
    {
        fprintf(fp2,"%s\n",strData[i]);
    }
    for(i = 0; i < line; i++)
    {
        free(strData[i]);
    }
    free(strData);
    fclose(fp1);
    fclose(fp2);
    return 0;
} 

Как бы вы могли отсортировать рейсы, перечисленные выше, по датам вылета

1 Ответ

0 голосов
/ 10 декабря 2018

Это потребует некоторых усилий.

  1. Определение структуры данных полета

    struct flight {
      char flight_no[10];
      char takeoff[4];
      char landing[4];
      // you can convert string to tm using
      // strptime (take a look at time.h)
      struct tm *date_and_time;
    };
    
  2. Создание таблицы элементов с сохранением указателей наструктура

  3. Создать функцию, которая может сравнивать элементы по дате (см. man qsort)

    int (*compar)(const void *, const void *)
    

    Функция, которая выполняет сравнение, принимает два аргумента (указано void *).Все, что нам нужно сделать (внутри него), это привести void * к указателю типа, с которым мы имеем дело, и сравнить значения.

    int
    compare_doubles (const void *a, const void *b)
    {
      const double *da = (const double *) a;
      const double *db = (const double *) b;
    
      if(*da > *db) {
        return 1;
      } else if(*da < *db) {
        return -1;
      } else {
        return 0;
      }
    }
    

    source: http://www.gnu.org/software/libc/manual/html_node/Comparison-Functions.html

    Примечаниеэта часть документов

    Ваша функция сравнения должна возвращать значение, как это делает strcmp: отрицательный, если первый аргумент «меньше» второго, нулевой, если они «равны», и положительный, еслиПервый аргумент «больше».

  4. Сортировка элементов с использованием qsort

    man qsort
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...