作者 主題: [Help]check日期 ?  (閱讀 5321 次)

0 會員 與 1 訪客 正在閱讀本文。

unitcell

  • 活潑的大學生
  • ***
  • 文章數: 411
    • 檢視個人資料
[Help]check日期 ?
« 於: 2002-11-20 14:57 »
Hi all,

用C language如檢查使用者輸入的
西元出生年月日是正確數值範圍內.
如出生月份輸入15, 即告知輸入錯誤.

或哪邊有寫好現成的可抓.

Thanx.

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
Re: [Help]check日期 ?
« 回覆 #1 於: 2002-11-20 15:09 »
引述: "unitcell"
Hi all,

用C language如檢查使用者輸入的
西元出生年月日是正確數值範圍內.
如出生月份輸入15, 即告知輸入錯誤.

或哪邊有寫好現成的可抓.

Thanx.


這只是檢查一段數值範圍的小程式嘛!用 if 來判斷就好了


int input_month;


if ( input_month < 0 || input_month > 12 ) {
   printf( "%s\n", "月份輸入錯誤" );
} else {
   printf( "%s\n", "正確" );
}

unitcell

  • 活潑的大學生
  • ***
  • 文章數: 411
    • 檢視個人資料
Re: [Help]check日期 ?
« 回覆 #2 於: 2002-11-20 16:35 »
引述: "螢火飛"
引述: "unitcell"
Hi all,

用C language如檢查使用者輸入的
西元出生年月日是正確數值範圍內.
如出生月份輸入15, 即告知輸入錯誤.

或哪邊有寫好現成的可抓.

Thanx.


這只是檢查一段數值範圍的小程式嘛!用 if 來判斷就好了


int input_month;


if ( input_month < 0 || input_month > 12 ) {
   printf( "%s\n", "月份輸入錯誤" );
} else {
   printf( "%s\n", "正確" );
}


Oh! 小弟當然知道上面的程式.
主要問題是如何確認何年該約有幾日?
如2002年11月, 若輸入31日就錯了!
1971年3月是28天,
1972年3月是29天,等等.

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
[Help]check日期 ?
« 回覆 #3 於: 2002-11-20 17:36 »
既然如此!你應該要先知道閏年如何計算(可不是被 4 整除那樣簡單喔)。

閏年的規則是:4 年一閏,100 不閏,但 400 又閏。
依據這個規則,下列程式可以檢查日期是否合法,只要傳遞三個參數,分別是西元年、月、日,如果傳回 true 的話,代表日期合法,否則就是不合法:
──────────────────────────────

int Check_Date( int Year, int Month, int Day )
{

        int mod_4 = Year % 4; /* 取除以 4 的餘數 */
        int mod_100 = Year % 100; /* 取除以 100 的餘數 */
        int mod_400 = Year % 400; /* 取除以 400 的餘數 */
        /* 每個月的天數 */
        int month_table[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        /* 先檢查月份 */
        if ( Month < 0 || Month > 12 ) return 0; /* 不合法的月份 */

        /* 檢查該年是否為閏年 ? */
        /* 能被 100 整除,就一定能被 4 整除,只要檢查能否被 400 整除即可 */
        if ( mod_100 == 0 && mod_400 == 0 ) {
           month_table[ 1 ] = 29; /* 指定 2 月為 29 天 */
        /* 無法被 100 整除,但能被 4 整除,那一定是閏年 */
        } else {
           if ( mod_4 == 0 )
              month_table[ 1 ] = 29;  /* 指定 2 月為 29 天 */
        }

        /* 算完閏年後,就可以檢查日期的合法性 */
        /* 如果日大於 0 以及小於等於該月的天數,就是合法日期 */
        /* 傳回 TRUE */
        if ( Day > 0 && Day <= month_table[ Month - 1 ] ) {
           return 1;
        }

        return 0; /* 否則就是 FALSE */

}

────────────────────────────
這樣了解嗎?

lkkl

  • 活潑的大學生
  • ***
  • 文章數: 431
    • 檢視個人資料
    • 我的線上小窩
[Help]check日期 ?
« 回覆 #4 於: 2002-11-20 17:45 »
是潤2月吧!!
可被4整除的該年2月29否則28,其餘都固定,天數
2000可被4整除該年2月29天
2002不可被4整除該年2月28天
也可只有末2位判斷,因為百位一定能被4整除
(25n)*4+m,n=0,1,2................,m=1,2,3,.........,98,99
n=20,m=2今年,m不能被4整除
.
.
.
.
.
愛護地球請用LINUX,省電又環保,大家共同為地球盡一份心力.
小弟的網頁
http://yplin123.googlepages.com/home
"資訊人權貴" 之家(令人佩服的洪朝貴老師)
http://people.ofset.org/~ckhung/

unitcell

  • 活潑的大學生
  • ***
  • 文章數: 411
    • 檢視個人資料
[Help]check日期 ?
« 回覆 #5 於: 2002-11-21 09:42 »
引述: "螢火飛"
既然如此!你應該要先知道閏年如何計算(可不是被 4 整除那樣簡單喔)。

閏年的規則是:4 年一閏,100 不閏,但 400 又閏。
依據這個規則,下列程式可以檢查日期是否合法,只要傳遞三個參數,分別是西元年、月、日,如果傳回 true 的話,代表日期合法,否則就是不合法:
──────────────────────────────

int Check_Date( int Year, int Month, int Day )
{

        int mod_4 = Year % 4; /* 取除以 4 的餘數 */
        int mod_100 = Year % 100; /* 取除以 100 的餘數 */
        int mod_400 = Year % 400; /* 取除以 400 的餘數 */
        /* 每個月的天數 */
        int month_table[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        /* 先檢查月份 */
        if ( Month < 0 || Month > 12 ) return 0; /* 不合法的月份 */

        /* 檢查該年是否為閏年 ? */
        /* 能被 100 整除,就一定能被 4 整除,只要檢查能否被 400 整除即可 */
        if ( mod_100 == 0 && mod_400 == 0 ) {
           month_table[ 1 ] = 29; /* 指定 2 月為 29 天 */
        /* 無法被 100 整除,但能被 4 整除,那一定是閏年 */
        } else {
           if ( mod_4 == 0 )
              month_table[ 1 ] = 29;  /* 指定 2 月為 29 天 */
        }

        /* 算完閏年後,就可以檢查日期的合法性 */
        /* 如果日大於 0 以及小於等於該月的天數,就是合法日期 */
        /* 傳回 TRUE */
        if ( Day > 0 && Day <= month_table[ Month - 1 ] ) {
           return 1;
        }

        return 0; /* 否則就是 FALSE */

}

────────────────────────────
這樣了解嗎?


嗯! 原本想說撿現成.
依照您的分析,自己來也蠻快的.
Thanx a lot.

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
[Help]check日期 ?
« 回覆 #6 於: 2002-11-22 12:55 »
引述: "螢火飛"
既然如此!你應該要先知道閏年如何計算(可不是被 4 整除那樣簡單喔)。

閏年的規則是:4 年一閏,100 不閏,但 400 又閏。
依據這個規則,下列程式可以檢查日期是否合法,只要傳遞三個參數,分別是西元年、月、日,如果傳回 true 的話,代表日期合法,否則就是不合法:
──────────────────────────────

int Check_Date( int Year, int Month, int Day )
{

        int mod_4 = Year % 4; /* 取除以 4 的餘數 */
        int mod_100 = Year % 100; /* 取除以 100 的餘數 */
        int mod_400 = Year % 400; /* 取除以 400 的餘數 */
        /* 每個月的天數 */
        int month_table[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

        /* 先檢查月份 */
        if ( Month < 0 || Month > 12 ) return 0; /* 不合法的月份 */

        /* 檢查該年是否為閏年 ? */
        /* 能被 100 整除,就一定能被 4 整除,只要檢查能否被 400 整除即可 */
        if ( mod_100 == 0 && mod_400 == 0 ) {
           month_table[ 1 ] = 29; /* 指定 2 月為 29 天 */
        /* 無法被 100 整除,但能被 4 整除,那一定是閏年 */
        } else {
           if ( mod_4 == 0 )
              month_table[ 1 ] = 29;  /* 指定 2 月為 29 天 */
        }

        /* 算完閏年後,就可以檢查日期的合法性 */
        /* 如果日大於 0 以及小於等於該月的天數,就是合法日期 */
        /* 傳回 TRUE */
        if ( Day > 0 && Day <= month_table[ Month - 1 ] ) {
           return 1;
        }

        return 0; /* 否則就是 FALSE */

}

────────────────────────────
這樣了解嗎?


嘿!沒人發現有問題嗎?
這段應該改成這樣:
        /* 檢查該年是否為閏年 ? */
        /* 能被 100 整除,就一定能被 4 整除,只要檢查能否被 400 整除即可 */
        if ( mod_100 == 0 ) {
           if (  mod_400 == 0 ) {
              month_table[ 1 ] = 29; /* 指定 2 月為 29 天 */
           }
        /* 無法被 100 整除,但能被 4 整除,那一定是閏年 */
        } else {
           if ( mod_4 == 0 )
              month_table[ 1 ] = 29;  /* 指定 2 月為 29 天 */
        }

看起來差不多,其實差很多 :-p

被騎上班的老

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 360
    • 檢視個人資料
[Help]check日期 ?
« 回覆 #7 於: 2002-12-03 14:55 »
如果是學習演算法,要訓練思考能力,我是沒有意見啦!
如果是要"用"的話,我建議使用 ctime 函數,如果指定日期轉換成功就表示OK,如果日期轉換失敗回傳 NULL 。

各位覺得呢?

螢火飛

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 400
    • 檢視個人資料
    • http://firefly.idv.tw
[Help]check日期 ?
« 回覆 #8 於: 2002-12-03 15:07 »
引述: "被騎上班的老鼠"
如果是學習演算法,要訓練思考能力,我是沒有意見啦!
如果是要"用"的話,我建議使用 ctime 函數,如果指定日期轉換成功就表示OK,如果日期轉換失敗回傳 NULL 。

各位覺得呢?


ctime 的話,有個缺點,他的年是從 1900 年開始,最大到多少,我沒試過,可能跟電腦時鐘有關,不太適合在商業上使用。

ㄡ,我是寫金融商業程式的,金融業對類似這樣的處理,絕不會用系統提供的時間日期函數,別的行業我不知道,金融業特別重視這個。

被騎上班的老

  • 酷!學園 學長們
  • 活潑的大學生
  • ***
  • 文章數: 360
    • 檢視個人資料
[Help]check日期 ?
« 回覆 #9 於: 2002-12-03 16:59 »
引述: "螢火飛"

ctime 的話,有個缺點,他的年是從 1900 年開始,最大到多少,我沒試過,可能跟電腦時鐘有關,不太適合在商業上使用。

ㄡ,我是寫金融商業程式的,金融業對類似這樣的處理,絕不會用系統提供的時間日期函數,別的行業我不知道,金融業特別重視這個。


unix 系統時間的話是從 1970/1/1 - 2037/?/?