2011年11月8日 星期二

99正式 Problem 3-2:

請選手判斷輸入檔中的 4行文句,是否存在符合條件的「日期字串」。



在文句中,只可能包括「中文」及「半型數字」,並且不包含任何空白及標點符號。待檢查的「日期字串」格式為「民國 yyymmdd日」,其中「民國」、「年」、「月」及「日」的順序不可改變。屬於年的「 yyy」部分,合法值是「 1~999」,可存在「前置 0」,但其長度僅能是 123位數。例如民國 9年,可表現為「民國 9年」、「民國 09年」或「民國 009年」。關於月份部分,合法值是「1~12」,同樣接受「前置 0」,其長度僅能是 12位數。日期部分的範圍是「 1~31」,亦接受「前置 0」,其長度僅能是 12位數。選手應另注意,符合條件的日期值不應超過該年當月份的最大天數,例如某年某月份有 30天,則符合條件的日期值為 1~30

【註 1】西元年 = 民國年 + 1911 
【註 2】在本題限制的年份中,若其西元年「可被 400整除」或是「可被 4整除而且不被 100整除」,則當年是閏年,其 2月有 29天,否則為 28天。

輸入說明:輸入檔中的第 1~4行,表示待檢查的 4句文句,每行文句均獨立檢查,每句文句不超過 100個字。
輸出說明:依序 4行輸出,分別對應輸入檔第 1~4行文句之檢查結果。若文句中存在符合條件的「日期字串」請輸出「符合」,若不存在時請輸出「不符合」。



輸入檔案 1:【檔名:in1.txt】
他的生日是民國 89 年2 月29 日
她的生日是民國 90 月2 年29 日
民國 90 年3 月25 日是他的到職日
民國 90 年25 日3 月是她的到職日


輸入檔案 2:【檔名:in2.txt】
他的生日是民國 89 年12 月32 日
她的生日是民國 89 年12 月31 日
民國 090 年03 月02 日是他的到職日
民國 1000 年12 月31 日是她的到職日


輸出檔案:【檔名:out.txt】

符合
不符合
符合
不符合


不符合
符合
符合
不符合

1 則留言:

  1. Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in1.txt" For Input As #1
    Open App.Path & "\in2.txt" For Input As #2
    Open App.Path & "\out.txt" For Output As #3

    For i = 1 To 4
    Line Input #1, n
    Call A1(n)
    Next
    Print #3, " "
    For i = 1 To 4
    Line Input #2, n
    Call A1(n)
    Next

    Close
    Close
    Close
    End
    End Sub


    Sub A1(a)

    Dim y$, mo$, d$

    ch = 0
    For i = 1 To Len(a)
    If ch = 0 Then m = Mid(a, i, 2) Else m = Mid(a, i, 1)
    If m = "民國" Then ch = 1: i = i + 1
    If m = "日" Then ch = 0: b = b & m: Exit For
    If ch = 1 Then b = b & m
    Next



    ' Check 1
    If InStr(b, "年") = 0 Or InStr(b, "月") = 0 Or InStr(b, "日") = 0 Then GoTo Fa:
    If InStr(b, "年") > InStr(b, "月") Or InStr(b, "年") > InStr(b, "日") Or InStr(b, "月") > InStr(b, "日") Then GoTo Fa:


    'Check 1 - Y
    ch = 0
    For i = 1 To Len(b)
    m = Mid(b, i, 1)
    If m = "國" Then ch = 1: m = ""
    If m = "年" Then ch = 0
    If ch = 1 Then y = y & m
    Next

    If Len(Trim(y)) > 3 Or Trim(y) < 0 Then GoTo Fa:

    'Check 2 - Mo
    ch = 0
    For i = 1 To Len(b)
    m = Mid(b, i, 1)
    If m = "年" Then ch = 1: m = ""
    If m = "月" Then ch = 0
    If ch = 1 Then mo = mo & m
    Next
    If Val(mo) > 12 Or Val(mo) < 1 Then GoTo Fa:

    'Check 2 - D
    ch = 0
    For i = 1 To Len(b)
    m = Mid(b, i, 1)
    If m = "月" Then ch = 1: m = ""
    If m = "日" Then ch = 0
    If ch = 1 Then d = d & m
    Next

    si = Val(y) + 1911
    If si Mod 100 = 0 Or (si Mod 4 = 0 And si Mod 100 <> 0) Then s = Split("X 31 29 31 30 31 30 31 31 30 31 30 31") Else s = Split("X 31 28 31 30 31 30 31 31 30 31 30 31")
    If Trim(d) > s(mo) Or Val(d) < 0 Then GoTo Fa:




    Print #3, "符合"

    Exit Sub
    Fa:
    Print #3, "不符合"
    End Sub

    回覆刪除