首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

C语言用qsort给日期排序

2013-03-01 
求教:C语言用qsort给日期排序struct date{char m[20]//january 等等int d//日 1 2 3 4 5 6.。。。。。int y/

求教:C语言用qsort给日期排序
struct date
{
char m[20];//january 等等
int d;//日 1 2 3 4 5 6.。。。。。
int y;//年 90-99 00-12
}
给一个日期的struct,然后输入n行日期,用qsort排序,最后输出排序后的日期。
求指导。 c 语言 struct qsort
[解决办法]


/**
 * @file    datesort.c
 * @brief   
 */

struct date
{
    char m[20]; /**< January 等等 */
    int  d;     /**< 日 1 2 3 4 5 6.。。。。。 */
    int  y;     /**< 年 90-99 00-12 */
};

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

int cmp_month(const char *m1, const char *m2)
{
    int i, n, n1, n2;
    static const char *months[] = {
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December",
    };

    n = sizeof(months) / sizeof(months[0]);
    n1 = n2 = -1;
    for (i = 0; i < n; ++i) {
        if (n1 < 0 && strcmp(m1, months[i]) == 0)
            n1 = i;
        if (n2 < 0 && strcmp(m2, months[i]) == 0)
            n2 = i;
        if (n1 >= 0 && n2 >= 0)
            break;
    }

    return n1 - n2;
}

int cmp_date(const void *v1, const void *v2)
{
    int ret;
    const struct date *d1, *d2;

    d1 = (const struct date *)v1;
    d2 = (const struct date *)v2;

    if ((ret = (d1->y != d2->y)) != 0) {
        if (d1->y >= 70 && d2->y >= 70)
            return ret;


        if (d1->y >= 70 && d2->y <  70)
            return -1;
        if (d1->y <  70 && d2->y <  70)
            return ret;
        if (d1->y <  70 && d2->y >= 70)
            return +1;
    }
    
    if ((ret = cmp_month(d1->m, d2->m)) != 0)
        return ret;

    return d1->d - d2->d;
}

int main(int argc, char *argv[])
{
    int i, n;

    struct date date[] = {
        {"March", 1, 1},
        {"January", 1, 1},
        {"January", 1, 99},
        {"January", 1, 70},
    };

    n = sizeof(date) / sizeof(date[0]);
    qsort(date, n, sizeof(struct date), &cmp_date);

    for (i = 0; i < n; ++i)
        printf("%s %d %d\n", date[i].m, date[i].d, date[i].y);

    return 0;
}

热点排行