2011年7月29日 星期五

子字串特徵的判斷-2(99模擬)

子題2(10%):是否文句中存在任何子字串,其為「合理」的「台北市」、「台中市」或「高雄市」身份證字號。
註:
(1) 身份證字號第1 碼為地區碼,「台北市」以「A」開頭、「台中市」以「B」開頭、「高雄市」以「E」開頭。

(2) 身份證字號的第2 碼為「性別」碼,其值應為「1」或「2」。
(3) 若將身份證字號的「地區碼」改為2 碼數字,其中「A」改為「10」、「B」改為「11」、「E」改為「14」,其後併入原身份證後9 碼數字,成為1 個新的11 位數字碼。將此數字碼由左至右分別乘以「1、9、8、7、6、5、4、3、2、1、1」,其相乘後的總和應可被10 整除。

輸入說明:
第1~3 行表示欲檢查之文句。
輸出說明:
若存在合理的身份證字號即輸出「有」,不存在即輸出「沒有」。
輸入範例:【檔名:in-3-2.txt】
His ID number is A120441768.
Her ID number is B272857734.
Their ID numbers are E286585485, E282467997, and E195445887.

輸出範例:【檔名:out-3-2.txt】

沒有

6 則留言:

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

    Do While Not EOF(1)
    Line Input #1, X
    List1.Clear
    List2.Clear
    Call AA(X)

    For i = 0 To (List1.ListCount - 1)
    ans = 0
    For j = 1 To 10
    Select Case j
    Case 1:
    Select Case Mid(List1.List(i), 1, 1)
    Case "A": ans = 1 * 1 + 0 * 9
    Case "B": ans = 1 * 1 + 1 * 9
    Case "E": ans = 1 * 1 + 4 * 9
    End Select
    Case 2: ans = ans + Val(Mid(List1.List(i), j, 1)) * 8
    Case 3: ans = ans + Val(Mid(List1.List(i), j, 1)) * 7
    Case 4: ans = ans + Val(Mid(List1.List(i), j, 1)) * 6
    Case 5: ans = ans + Val(Mid(List1.List(i), j, 1)) * 5
    Case 6: ans = ans + Val(Mid(List1.List(i), j, 1)) * 4
    Case 7: ans = ans + Val(Mid(List1.List(i), j, 1)) * 3
    Case 8: ans = ans + Val(Mid(List1.List(i), j, 1)) * 2
    Case 9: ans = ans + Val(Mid(List1.List(i), j, 1)) * 1
    Case 10: ans = ans + Val(Mid(List1.List(i), j, 1)) * 1
    End Select
    Next j
    If ans Mod 10 = 0 Then List2.AddItem "有"
    Next i
    If List2.ListCount <> 0 Then Print #2, "有" Else Print #2, "沒有"
    Loop
    Close #2
    Close #1
    End
    End Sub

    Sub AA(A) '挑出可檢查字串
    For i = 1 To Len(A)
    B = Mid(A, i, 1)
    If B = "A" Or B = "B" Or B = "E" Then
    If IsNumeric(Mid(A, i + 1, 9)) = True Then List1.AddItem Mid(A, i, 10)
    End If
    Next i
    End Sub

    回覆刪除
  2. 佑好,
    程式結果正確。
    改進點:
    For j = 1 To 10
    Select Case j
    Case 1:
    Select Case Mid(List1.List(i), 1, 1)
    Case "A": ans = 1 * 1 + 0 * 9
    Case "B": ans = 1 * 1 + 1 * 9
    Case "E": ans = 1 * 1 + 4 * 9
    End Select
    Case 2: ans = ans + Val(Mid(List1.List(i), j, 1)) * 8
    Case 3: ans = ans + Val(Mid(List1.List(i), j, 1)) * 7
    Case 4: ans = ans + Val(Mid(List1.List(i), j, 1)) * 6
    Case 5: ans = ans + Val(Mid(List1.List(i), j, 1)) * 5
    Case 6: ans = ans + Val(Mid(List1.List(i), j, 1)) * 4
    Case 7: ans = ans + Val(Mid(List1.List(i), j, 1)) * 3
    Case 8: ans = ans + Val(Mid(List1.List(i), j, 1)) * 2
    Case 9: ans = ans + Val(Mid(List1.List(i), j, 1)) * 1
    Case 10: ans = ans + Val(Mid(List1.List(i), j, 1)) * 1
    End Select
    Next j
    這裡用迴圈是沒有必要的,不正是一個接一個的循序執行而已嗎?

    回覆刪除
  3. Dim N, ID$, ANS
    Private Sub Form_Load()

    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2


    Do While Not EOF(1)
    Line Input #1, N
    ANS = 0
    Call check




    Dim p
    p = Split("0 1 9 8 7 6 5 4 3 2 1 1")
    For i = 1 To Len(ID)
    ANS = ANS + Val(Mid(ID, i, 1)) * p(i)
    Next

    If ANS Mod 10 = 0 Then Print #2, "有" Else Print #2, "沒有"

    Loop


    Close
    Close

    End Sub



    Sub check()

    For i = 1 To Len(N)
    m = Mid(N, i, 1)
    If m = "A" Or m = "B" Or m = "E" Then
    If IsNumeric(Mid(N, i + 1, 9)) = True Then

    If m = "A" Then ID = "10" & Mid(N, i + 1, 9):
    If m = "B" Then ID = "11" & Mid(N, i + 1, 9):
    If m = "E" Then ID = "14" & Mid(N, i + 1, 9):
    End If
    End If
    Next




    End Sub

    回覆刪除
  4. 佑、arro好,
    你們兩個又都沒看清題目了,
    「(2) 身份證字號的第2 碼為「性別」碼,其值應為「1」或「2」。」
    這一點,你們都沒理它,當性別為3還是有機會驗算得過去的哦,例如[ A000000009 ]

    再小心一點兒,這也算是送分題了,不可以放過去哦。

    回覆刪除
  5. 熊掌好,

    整個拆掉迴圈
    全身舒暢許多XDD
    並加了判斷性別

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

    Do While Not EOF(1)
    Line Input #1, X
    List1.Clear
    List2.Clear
    Call AA(X)

    For i = 0 To (List1.ListCount - 1)

    ans = 0

    Select Case Mid(List1.List(i), 1, 1)
    Case "A": ans = 1 * 1 + 0 * 9
    Case "B": ans = 1 * 1 + 1 * 9
    Case "E": ans = 1 * 1 + 4 * 9
    End Select
    ans = ans + Val(Mid(List1.List(i), 2, 1)) * 8
    ans = ans + Val(Mid(List1.List(i), 3, 1)) * 7
    ans = ans + Val(Mid(List1.List(i), 4, 1)) * 6
    ans = ans + Val(Mid(List1.List(i), 5, 1)) * 5
    ans = ans + Val(Mid(List1.List(i), 6, 1)) * 4
    ans = ans + Val(Mid(List1.List(i), 7, 1)) * 3
    ans = ans + Val(Mid(List1.List(i), 8, 1)) * 2
    ans = ans + Val(Mid(List1.List(i), 9, 1)) * 1
    ans = ans + Val(Mid(List1.List(i), 10, 1)) * 1

    If ans Mod 10 = 0 Then List2.AddItem "有"
    Next i
    If List2.ListCount <> 0 Then Print #2, "有" Else Print #2, "沒有"
    Loop
    Close #2
    Close #1
    End
    End Sub

    Sub AA(A) '挑出可檢查字串
    For i = 1 To Len(A)
    B = Mid(A, i, 1)
    If B = "A" Or B = "B" Or B = "E" Then
    sex = Val(Mid(A, i + 1, 1))
    If IsNumeric(Mid(A, i + 1, 9)) = True And (sex = 1 Or sex = 2) Then List1.AddItem Mid(A, i, 10)
    End If
    Next i
    End Sub

    回覆刪除