匿名使用者
匿名使用者 發問時間: 電腦與網際網路程式設計 · 1 0 年前

輸入某年某月某日,在輸入某年某月某日,印出結果為兩個數日期

求 輸入某年某月某日,在輸入某年某月某日,印出結果為兩個數日期的相差天數。

EX:輸入(起始日期):2006/12/31

輸入(最後日期):2007/01/01

印出結果:2007/01/01是第1天

輸入(起始日期):2006/12/31

輸入(最後日期):2007/01/05

印出結果:2007/01/05是第5天 (請用C語言寫)

2 個解答

評分
  • 1 0 年前
    最佳解答

    #include <stdio.h>

    /*判別是否為閏年*/

    #define IS_LEAP_YEAR(Y) ((((Y)%400)==0)||((((Y)%100)!=0)&&((Y)%4==0)))

    /*平年每個月的天數*/

    char months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

    /*從西元 1 年 1 月 1日起算至目標日期,經過了幾天*/

    /*(回傳 -1 表示所傳入的字串不是有效日期)*/

    int date_days_from_1_1_1(char* dte)

    {

    int state=1;/*從年份開始解析*/

    int ret=0,v=0,y,m,d;

    /*開始解析字串*/

    while(1)

    {

    switch(*dte)

    {

    /*處理分隔符號*/

    case '-':case '/':case ' ':case '.':case '\0':

    {

    /*碰到分隔符號,前面字元所累積的數字即為所需要的資訊*/

    switch(state)

    {

    /*解析出年份*/

    case 1: y=v; break;

    /*解析出月份,並且要排除1~12以外的數值*/

    case 2: if((v>=1)&&(v<=12)) m=v; else return -1; break;

    /*解析出日數,並且排除1~當月日數以外的數值*/

    case 3:

    {

    /*當年二月的日數是否需要修正*/

    months[2]=IS_LEAP_YEAR(y)?29:28;

    if((v>=1)&&(v<=months[m])) d=v; else return -1;

    break;

    }

    /*超過三個分隔,判定不是日期格式*/

    default: return -1;

    }

    /*如果以三個部份已解析完畢,字串還未達結尾,判定不是日期格式*/

    if((!*dte)&&(state!=3)) return -1;

    /*數值累積 v 歸零,下一個部份開始*/

    v=0;state++; break;

    }

    /*分隔符號以外的字元視為日期上的數字*/

    default:

    {

    /*數字部份是否落在0~9,否則判斷不適日期格式*/

    if((*dte>='0')&&(*dte<='9')) v=v*10+*dte-'0'; else return -1;

    }

    }

    /*順利到達字串尾端,跳出解析的迴圈*/

    if(!*(dte++)) break;

    }

    /*從西元1年到目標年份之前經過了幾年*/

    for(v=1;v<y;v++)

    {

    /*閏年是366天,平年是365天*/

    if(IS_LEAP_YEAR(v)) ret+=366; else ret+=365;

    }

    /*從目標年份的1月起算到目標月份前,經過了幾個月*/

    for(v=1;v<m;v++)

    {

    /*如果目標月份是2月,要判定目標年份是否為閏年*/

    if(v==2) months[2]=IS_LEAP_YEAR(y)?29:28;

    /*逐一加上月份日數*/

    ret+=months[v];

    }

    /*累計目標月份的日數(當日不計)*/

    ret+=(d-1);

    /*回傳從西元1年1月1日到目標日期經過了幾天當做日數戳記*/

    return ret;

    }

    int main(int argc, char* argv[])

    {

    /*準備足夠存放的兩個日期字串的儲存空間*/

    char date1[]="xxxx-xx-xx";

    char date2[]="xxxx-xx-xx";

    /*兩個日期的日數戳記*/

    int days1,days2;

    /*提示輸入第一個日期*/

    printf("輸入(起始日期):"); scanf("%s",date1);

    /*求算第一個日期的日數戳記(有效才繼續)*/

    if((days1=date_days_from_1_1_1(date1))!=-1)

    {

    /*提示輸入第二個日期*/

    printf("輸入(最後日期):"); scanf("%s",date2);

    /*求算第二個日期的日數戳記(有效才繼續)*/

    if((days2=date_days_from_1_1_1(date2))!=-1)

    {

    /*兩個日期戳記差即為兩個日期差距的日數*/

    printf("從 %s 到 %s 差距 %d 天\n",date1,date2,(days2-days1));

    }

    else

    {

    /*顯示錯誤訊息*/

    printf("無效的日期:%s\n",date2);

    }

    }

    else

    {

    /*顯示錯誤訊息*/

    printf("無效的日期:%s\n",date1);

    }

    return 0;

    }

    2007-06-22 17:40:24 補充:

    淡藍色以標準 C 語言(ANSI C)方式撰寫,包含日期字串解析,並且追溯自西元 1 年 1 月 1 日,提供您參考。^_^

    參考資料: 無, 無
  • Ather
    Lv 5
    1 0 年前

    這個那麼簡單...

    自己寫就好了啊....

    關鍵只有在日期轉換成數字罷了

還有問題?馬上發問,尋求解答。