C實(shí)例編程(用C語言編寫的一個(gè)日歷文件)

字號:

該程序在vc中調(diào)試運(yùn)行通過.
    #include
    #include
    #include
    #include
    typedef strUCt
    {
    unsigned char day;
    unsigned char month;
    unsigned short year;
    }T_MFW_DATE;
    typedef struct
    {
    T_MFW_DATE date; /*記錄的日期*/
    }t_cldrecord;
    typedef struct
    {
    T_MFW_DATE today_date; /*在程序中沒有作用*/
    T_MFW_DATE cursor_date;
    int days_map[6][7]; /*日期地圖*/
    }t_cldmain_data;
    t_cldmain_data *cldmain_data;
    void cldmain_get_days_map(void);
    void main(void)
    {
    int i,j;
    cldmain_data = (t_cldmain_data*)malloc(sizeof(t_cldmain_data));
    cldmain_data->cursor_date.day = 20;
    while(1)
    {
    char buf[20];
    char *p;
    memset(buf,0,20);
    printf("year month:");
    gets(buf);
    if(buf[0] == 'q')break;
    cldmain_data->cursor_date.year = strtod(buf,&p);
    p ++;
    cldmain_data->cursor_date.month = strtod(p,&p);
    printf("year %d month %d ",(cldmain_data->cursor_date.year),(cldmain_data->cursor_date.month));
    cldmain_get_days_map();
    printf(" mo tu w th fr sa su ");
    for(j = 0; j < 6; j ++)
    {
    printf(" ");
    for(i = 0; i < 7; i ++)
    {
    printf("%i ",cldmain_data->days_map[j][i]);
    }
    printf(" ");
    }
    }
    //getchar();
    }
    /*
    檢查日期是否合法
    合法返回1,考試.大提示否則返回0
    */
    int check_date(T_MFW_DATE date)
    {
    char month_days[] = ;
    /*大于2000年,小于2100年,月份合法*/
    if(date.year < 2000 date.year >= 2100 date.month < 1 date.month > 12)
    {
    return 0;
    }
    /*day合法*/
    if(date.day < 1)return 0;
    if(date.day > month_days[date.month - 1])return 0;
    if(date.month == 2)
    {
    if(date.year % 4 != 0)
    {
    if(date.day == 29)return 0;
    }
    }
    return 1;
    }
    /*
    功能:得到每個(gè)月第一天是星期幾
    星期 一 二 三 四 五 六 日
    返回值:1 2 3 4 5 6 7
    如果返回為0,則出錯(cuò)
    */
    int get_weekday_of_month(T_MFW_DATE cursor_date)
    {
    int day;
    /*參照1997年1月1日,參數(shù)cursor_date從2000年1月1日到2099年1月1日*/
    //char month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int this_year_days[] ={ 0, 31, 59, 90, 120, 151,181, 212, 243, 273, 304, 334};
    int cursor_year_days = this_year_days[cursor_date.month - 1] + (cursor_date.day = 1);
    int comp_days = (cursor_date.year - 1997)*365 + cursor_year_days;
    int i = (cursor_date.year - 1997)/4;
    comp_days = comp_days + i * 1;
    if(cursor_date.month > 2)
    {
    if( cursor_date.year % 4 == 0 )
    {
    comp_days += 1;
    }
    }
    if(cursor_date.day > 2098)return 0;
    day = comp_days % 7;
    /*1997年1月1日是星期三*/
    day = (day + 2) % 7;
    if(day == 0)day = 7;
    return day;
    }
    /*
    根據(jù)參數(shù)的值,得到該年該月有多少天.
    返回值:該月的天數(shù)
    */
    int count_days_of_month(T_MFW_DATE cursor_date)
    {
    char month_days[] = ;
    unsigned char day = cldmain_data->cursor_date.day;
    unsigned char month = cldmain_data->cursor_date.month;
    unsigned short year = cldmain_data->cursor_date.year;
    if(month != 2)
    {
    return month_days[month -1];
    }
    else
    {
    if(year%4 != 0)
    {
    return 28;
    }
    if(year%4 == 0)
    {
    if(year%100 == 0)
    {
    if(year %400 == 0)
    {
    return 29;
    }
    return 28;
    }
    return 29;
    }
    }
    }
    /*
    得到日期地圖,保存到全局結(jié)構(gòu)變量cldmain_data的成員數(shù)組變量days_map中.
    */
    void cldmain_get_days_map(void)
    {
    int i;
    int day;
    T_MFW_DATE cursor_date = cldmain_data->cursor_date;
    int *map_p = cldmain_data->days_map[0];
    int days_count;
    int weekday;
    for(i = 0; i < 6*7; i++)
    {
    map_p[i] = 0;
    }
    if(check_date(cldmain_data->cursor_date) == 0)return;
    days_count = count_days_of_month(cldmain_data->cursor_date);
    weekday = get_weekday_of_month(cldmain_data->cursor_date);
    day = 1;
    for(i = weekday-1; i < days_count + weekday - 1; i++)
    {
    map_p[i] = day;
    day ++;
    }
    }