2015-01-27 4 views
-1

Мне нужно сделать календар (как список дел), и мне нужно отсортировать месяцы в нем.сортировка месяца с использованием структур в C

у меня есть:-структура

typedef struct 
{ 
    char name[3]; 
    int month_num; 
    int day_num; 
    int day_size; // amount of days that are field in with tasks. 
    char task[40]; 

}month; // each month contains a name, its num in the calendar and days. 

для того, чтобы отсортировать месяцев, так что это будет проще, я решил сортирую их тиром чисел. я имею в виду, что я называю Jan номером 1, Feb как число 2 и т. д., но поскольку у меня есть структура, которую я потерял в пути со всеми именами и всеми элементами.

я сведущий дать всем месяцам тира номер: (это немного долго, так что я буду показывать несколько первый)

if (strcmp(mName, "jan") == 0) 
{ 
    mon[monthcounter].month_num = 1; 
} 
else if (strcmp(mName, "feb") == 0) 
{ 
    mon[monthcounter].month_num = 2; 
} 
else if (strcmp(mName, "mar") == 0) 
{ 
    mon[monthcounter].month_num = 3; 
} 
else if (strcmp(mName, "apr") == 0) 
{ 
    mon[monthcounter].month_num = 4; 
} 
else 
{ 
    printf("Invalid month\n"); 
} 
//etc. 

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

Я действительно буду благодарен за помощь!

+0

Рассмотрите возможность написания хеш-таблицы. Это хорошая учебная задача, и она легко справится с этой задачей. –

+0

В чем именно ваш вопрос lili? – gsamaras

+1

Использование 'qsort()' вы только для того, чтобы написать функцию сравнения (а не функцию свопинга) – pmg

ответ

0

Вы абсолютно правы - это простая функция обмена. Самый простой способ решить вашу проблему - использовать эту функцию, чтобы получить целочисленные значения месяцев, отсортировать их, а затем использовать новую функцию для их преобразования.

Предполагая, что вы убедитесь, что month_num находится между 0 и 11:

static const char *months[] = { "jan", "feb", ... }; 
return months[month_num]; 
+1

'static const char * months [] = {" jan "," feb ", ...};' затем подтвердите номер месяца 'n' как in-range (0..11) и просто' return months [n ]; 'никакого смысла в том, чтобы засорять код с 12 if-clauses, где * one * будет делать. – WhozCraig

+0

Конечно, правда. Я пытался провести параллель, хотя, с задним числом, это, вероятно, не самый лучший подход. – Tom

-1

Стандартный способ для этого было бы использовать функцию библиотеки C

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*)) 

Я думаю, что вы должны быть в состоянии напишите код, используя это. Вам нужно написать функцию компаратора, которая «сравнивает» два, что вы сравниваете. В вашем случае вы сравниваете месячные структуры на основе month_num. Таким образом, функция компаратора в псевдокоде

int compar (a, b) 
{ 

    if(a.month_num > b.month_num) 
     return 0 or 1; don't remember which one. 
    // write rest of the conditions. 
}