求教一个C语言程序,为万年历,要求输入一年分可以显示所有月份和日分,输入某年某月显示那月所有天,输

求教一个C语言程序,为万年历,要求输入一年分可以显示所有月份和日分,输入某年某月显示那月所有天,输入具体那一天显示为星期几,菜单程序,求教,非常感谢。

第1个回答  2014-05-29
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int mon_days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
char* week_days[7] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };

time_t str_to_time( char *slTime );

int str_isdigit( char *s )
{
    int i;
    for( i=0; s[i]; i++ )
        if ( !(s[i]>='0'&&s[i]<='9') )
            return 0;
    return 1;
}

int is_leep_year( int year )
{
    if ( year%400 == 0 || ( year%4 == 0 && year%100 != 0 ) ) 
    {
        return 1;
    }
    return 0;
}
/**
 * date: yyyymmdd
 * Sunday = 0, Monday=1, etc;
 **/
int get_wday( char *date ) 
{
    char slTime[30] = {0};
    sprintf( slTime, "%s000101", date );
    time_t tm = str_to_time( slTime );
    struct tm *p = localtime( &tm );
    return p->tm_wday;
}

int print_month( int year, int month )
{
    char s_date[30] = {0};
    sprintf( s_date, "%04d%02d01", year, month );
    int wday = get_wday( s_date );
    int i;
    printf( "%04d年%02d月\n日  一  二  三  四  五  六\n", year, month );
    for( i=0; i<wday; i++ )
        printf( "%2s  ", " " );
    if ( month==2 && is_leep_year( year ) )
        mon_days[1] = 29;
    for( i=0; i<mon_days[month-1]; i++,wday++ )
    {
        printf( "%2d  ", i+1 );
        if ( wday == 6 )
        {
            printf( "\n" );
            wday = -1;
        }
    }
    printf( "\n" );
}
/*** _mktime( yyyymmddHHMMSS ) **/
time_t str_to_time( char *slTime )
{
    struct tm tm_t;
    char year[5];
    char mon[3];
    char day[3];
    char hour[3];
    char min[3];
    char sec[3];

    if ( strlen(slTime) != 14 || ! str_isdigit( slTime ) )
    {
        fprintf( stderr, "Usage: _mktime( yyyymmddHHMMSS )\n" );
        return -1;
    }

    memset( year, 0x00, sizeof(year) );
    memset( mon, 0x00, sizeof(mon) );
    memset( day, 0x00, sizeof(day) );
    memset( hour, 0x00, sizeof(hour) );
    memset( min, 0x00, sizeof(min) );
    memset( sec, 0x00, sizeof(sec) );

    memcpy( year, slTime, 4 );
    memcpy( mon, slTime+4, 2 );
    memcpy( day, slTime+6, 2 );
    memcpy( hour, slTime+8, 2 );
    memcpy( min, slTime+10, 2 );
    memcpy( sec, slTime+12, 2 );

    tm_t.tm_year = atoi(year) - 1900;
    tm_t.tm_mon = atoi(mon) - 1;
    tm_t.tm_mday = atoi(day);
    tm_t.tm_hour = atoi(hour);
    tm_t.tm_min = atoi(min);
    tm_t.tm_sec = atoi(sec);
    tm_t.tm_wday = 0;
    tm_t.tm_yday = 0;
    tm_t.tm_isdst = 0;

    return mktime( &tm_t );
}

int trim( char *s )
{
    int i, l, r, len;
    for(len=0; s[len]; len++);
    for(l=0; (s[l]==' ' || s[l]=='\t' || s[l]=='\n' || s[l] == '\r' ); l++);
    if(l==len)
    {
        s[0]='\0';
        return(0);
    }
    for(r=len-1; (s[r]==' ' || s[r]=='\t' || s[r]=='\n' || s[r] == '\r' ); r--);
    for(i=l; i<=r; i++) s[i-l]=s[i];
    s[r-l+1]='\0';
    return(0);
}

void stdin_proc( char *s )
{
    int len = strlen( s );
    if ( !str_isdigit( s ) )
    {
        printf( "%s 无效\n", s );
        return;
    }
    if ( len == 4 )
    {
        int i, year = atoi( s );
        for( i=1; i<=12; i++ )
            print_month( year, i );
    }
    else if ( len == 6 )
    {
        int year = (int)( atoi(s) / 100 );
        int mon = atoi(s) - year*100;
        print_month( year, mon );
    }
    else if ( len == 8 )
    {
        int wday = get_wday( s );
        printf( "%s 是 %s\n", s, week_days[wday] );
    }
    else
        printf( "%s 无效\n", s );

}

int main( int argc, char **argv )
{
    char str[30] = {0};
    while( 1 )
    {
        printf( "输入(YYYY/YYYYMM/YYYYMMDD)(年大于等于1971):" );
        memset( str, 0, sizeof(str) );
        fgets( str, 10, stdin );
        fflush( stdin );
        trim( str );
        if( str[0] == 'q' || str[0] == 'Q' )
            break;
        stdin_proc( str );
    }
}

相似回答