2010年3月5日 星期五

2010/03/03 羅馬數字

設計一程式可將最長含10個字元的字串讀入, 每一個字元均代表某一數值的羅馬數表示法。將讀入之羅馬數及其相對應之阿拉伯數一起列印出來。
【壹】 羅馬數和字元之對應表如下:

M 1000

D 500

C 100

L 50

X 10

V 5

I 1
你的輸入有下列幾組:

(1) VII

(2) LXXXVII

(3) CCXIX

(4) MCCCLIV

(5) MMDCLXXIII

(6) MCDLXXVI

8 則留言:

  1. Dim Roma(11) As Integer
    Private Sub Form_Load()
    Open App.Path & "/in.txt" For Input As #1
    Open App.Path & "/out.txt" For Output As #2
    k = 1
    Do While Not EOF(1)
    Input #1, n
    For i = 5 To Len(n)
    X = Mid(n, i, 1)
    Select Case X
    Case "M"
    Roma(k) = Roma(k) + 1000
    Case "D"
    Roma(k) = Roma(k) + 500
    Case "C"
    Roma(k) = Roma(k) + 100
    Case "L"
    Roma(k) = Roma(k) + 50
    Case "X"
    Roma(k) = Roma(k) + 10
    Case "V"
    Roma(k) = Roma(k) + 5
    Case "I"
    Roma(k) = Roma(k) + 1
    End Select
    Next i
    Print #2, Roma(k)
    k = k + 1
    Loop
    Close #2
    Close #1
    End Sub

    輸入:
    (1) VII
    (2) LXXXVII
    (3) CCXIX
    (4) MCCCLIV
    (5) MMDCLXXIII
    (6) MCDLXXVI
    輸出:
    7
    87
    221
    1356
    2673
    1676

    方法一樣是用習慣的字串式處理
    雖然好像不太好
    但是因為習慣所以做起來快多了

    回覆刪除
  2. Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, X
    For w = 1 To Len(X)
    q = Mid(X, w, 1)
    Select Case q
    Case "M"
    ans = ans + 1000
    Case "D"
    ans = ans + 500
    Case "C"
    ans = ans + 100
    Case "L"
    ans = ans + 50
    Case "X"
    ans = ans + 10
    Case "V"
    ans = ans + 5
    Case "I"
    ans = ans + 1
    End Select
    Next w
    Print #2, ans
    Close #1
    Close #2
    End Sub
    老師 我有個疑問@@
    假設
    w="zzxx"
    t=mid(w,1,1)
    z=100
    那麼有捨嚜辦法 能印出來 把T變成100嗎

    回覆刪除
  3. Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    While Not EOF(1)
    Input #1, x
    n = Len(x)
    ans = 0: k = ""

    For i = 1 To n
    k = Mid(x, i, 1)
    Select Case k
    Case "M"
    ans = ans + 1000
    Case "D"
    ans = ans + 500
    Case "C"
    ans = ans + 100
    Case "L"
    ans = ans + 50
    Case "X"
    ans = ans + 10
    Case "V"
    ans = ans + 5
    Case "I"
    ans = ans + 1
    End Select
    Next i
    Print #2, ans
    Wend
    Close #1
    Close #2
    End Sub

    回覆刪除
  4. 高仔好,
    1.依題意,你的程式是對的。這題也似乎適合用字串吧。
    2.只是,羅馬數字中,依我從我的老師那兒學到的,除了用加法之外,還有「減法」的部分,像是「VII」是7,但是「IIV」是3。不過,這題目中,似乎不想說這個部分,那就算了。

    Y揚好,
    1.你的程式是對的,但是,你的輸入設定上...,似乎又有些不同了吧。你是當成只有一行的內容吧?
    2.你的問題的第1行執行後,第2行執行後,t是"z"。
    然後,你想讓if t="z" then t=100,這個意思嗎?
    如果是,那直接就可以執行了啊,只要你的t一開始沒特別定義成什麼特定的資料型態就可以變了。


    上個星期看了今年初的技藝競賽的會議資料,有三個需要注意的內容。
    1.這個程式設計比賽,有學科的。所以,來去找找以往的學科內容,或是,找找相關的題庫。
    2.某個學校的選手,在解題時,多設了個結束的命令鈕,結果還是0分,這個可就搞笑了。因為,像我們這樣一路寫來的程式,的確是要再去按一次停止,才會程式結束,有選手多寫了個命令按鈕來做結束end而已,還是得到0分。小心啊,選手們。
    3.有學校提到,目前用的是vb6,但是外頭(?)用的是vb8(?),建議更改。這...這...還真得注意啊。目前還沒有更改的意思,如果更改也會從所謂的「下一屆」才有可能吧。

    回覆刪除
  5. 阿瑋好,
    怪怪的,怎麼沒看到你的程式,在我的post之前呢?
    (時間差)
    程式ok,輸入設定也ok。
    (設定成有可能有好多組輸入的)

    回覆刪除
  6. Dim Rnum(7) As Integer
    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)
    Input #1, strQ
    ans = 0
    For j = Len(strQ) To 1 Step -1
    q = Mid(strQ, j, 1)
    Select Case q
    Case "I"
    ans = ans + 1
    Case "V"
    ans = ans + 5
    Case "X"
    ans = ans + 10
    Case "L"
    ans = ans + 50
    Case "C"
    ans = ans + 100
    Case "D"
    ans = ans + 500
    Case "M"
    ans = ans + 1000
    Case " "
    Print #2, ans
    Exit For
    End Select
    Next j
    Loop
    Close #2
    Close #1
    End Sub

    回覆刪除
  7. 不好意思請問一下各位
    如果小弟現在想要做的題目是由數字轉羅馬字
    那方法是不是會差很多
    該如何做呢?

    回覆刪除
  8. 方法似乎沒太大差別,就只是反過來而已!
    但羅馬數字有個規則,似乎是數字小的在數字大的前面為減,例如 IV 是 5-1 =4 而非5+1=6。
    最多應該就是只有加3次數字小的,例如 VIII = 8 而 IX =9!
    加油!

    回覆刪除