Сформировать очеред содержащую весенние даты, упорядоченные только по

Тема в разделе "Общие вопросы по С и С++", создана пользователем maryfly009, 14 июл 2010.

  1. maryfly009

    maryfly009 Гость

    Здравствуйте. Помогите пожалуйста дорешать задачу:
    Дан текстовый файл, содержащий даты в формате «день/месяц/год», причем под день месяц отводится по две позиции, а под год – четыре (например, «16/04/2001»). Сформировать очередь содержащую весенние даты, упорядоченные только по месяцу и числу.

    Задача почти решена:
    Код (C++):
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int Put(int, int, int);  
    int Get(int*, int*, int*);

    int main()
    {
    int day, month, year;
    char filename[50] = "data.txt";
    char str[50];
    FILE *f;

    if((f = fopen(filename, "r")) == NULL)
    {
    puts("Nevozmozhno otkrit fail!");
    return 0;
    }

    printf("Soderhimoe faila:\n");
    while(!feof(f))
    {
    if(fgets(str,100,f) == NULL) break;
    if(str[strlen(str)-1] == '\n') str[strlen(str)-1] = 0;
    printf("%s\n", str);

    sscanf(str, "%d/%d/%d", &day, &month, &year);

    if(month > 2 && month < 6)
    {
    if(Put(day, month, year))
    {  
    //Помещение в очередь
    //и проверка результата
    puts("Nehvataet pamyati!");
    break;
    }
    }
    }
    fclose(f);

    printf("\nRezultat:\n");
    //Цикл пока в очереди есть значения
    while(!Get(&day, &month, &year))
    (day < 10 && month < 10) ? printf("0%d/0%d/%d\n", day, month, year) : (day < 10 && month > 9) ? printf("0%d/%d/%d\n", day, month, year) : printf("%d/0%d/%d\n", day, month, year);

    return 0;
    }

    /* ----- Описание структуры и указателей на очередь ---- */
    typedef struct _Element{
    int day;
    int month;
    int year;
    struct _Element *next;
    } Element;
    Element *head = NULL, *tail = NULL;


    /* --------- Функция помещения значения в очередь --------- */
    int Put(int day, int month, int year)
    {
    //Выделение памяти под новый элемент
    Element *tmp = (Element *)malloc(sizeof(Element));
    if(!tmp) return 1; //Если память не выделилась, то выход
    //Инициализация ссылки на следующий элемент в очереди
    tmp->next = NULL;                //нулевым значением

    tmp->day = day; //Запись значения в новый элемент
    tmp->month = month; //Запись значения в новый элемент
    tmp->year = year; //Запись значения в новый элемент

    //Связывание последнего элемента в очереди с новым
    if(tail) tail->next = tmp;           //элементом
    tail = tmp; //Установка указателя на конец очереди
    //Если это первый элемент, то установка указателя
    if(!head) head = tmp;        //на начало очереди
    return 0; //Успешное завершение
    }

    /* --------- Функция получения значения из очереди --------*/
    int Get(int* day, int* month, int* year)
    {
    if(!head) return 1; //Если очередь пуста, то выход

    Element *tmp = head; //Установка локального указателя

    *day = tmp->day;//Запись значения в параметр
    *month = tmp->month;//Запись значения в параметр
    *year = tmp->year;//Запись значения в параметр

    head = head->next;  //Установка нового начала очереди
    free(tmp);
    //Если это последний элемент, то инициализация указателя
    if(!head) tail=NULL; //на конец очереди нулевым значением

    return 0;  //Успешное завершение
    }
    Из условия не могу понять, вот этот фрагмент Сформировать очеред содержащую весенние даты, упорядоченные только по месяцу и числу.
    Насколько я знаю над очередью можно выполнять три операции: добавление элементов, удаление элемент и очищать её.
    А как реализовать упорядочивание элементов очереди по месяцу и числу?

    спасибо за ответы!
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Во-первых, тебе надо еще проверить даты на попадание в весенний период, и пропускать неверные значения. А получить упорядоченный список можно 2мя способами - либо отсортировать после наполнения, либо вставлять не в конец, а сразу с учетом порядка.
     
Загрузка...

Поделиться этой страницей