§Algorithm§


☆n進数→m進数への変換☆

Hex関数等、VBにも進数変換をできるものが用意されていますが、汎用的に利用できる物を 作成してみました。計算はできるだけ抑えましたが、エラー処理などがまるで不十分なので、 利用する際はその処理も追加して下さい。 (変数名もプロシージャ名もかなり怪しくなってきたような・・・。手抜きですみません。)


(10進数→n進数への変換)

'数字をn進数文字で返すプロシージャ
Private Function subdeccn(ByVal a As Long) As String
    
    If a < 10& Then
        subdeccn = CStr(a)
    Else
        subdeccn = Chr(65 + a - 10)
    End If
    
End Function

'lngNumberをn進数に変換して、文字列として返す
'負の数対応やオーバーフローなどのエラー処理を追加する必要があります
Private Function deccn(ByVal n As Long, ByVal lngNumber As Long) As String

    Dim t As Long
    Dim ret As String
    If lngNumber = 0& Then deccn = "0": Exit Function
    t = 1&
    ret = ""
    Do While (t <= lngNumber)
        ret = subdeccn((lngNumber Mod (t * n)) \ t) & ret
        t = t * n
    Loop
    deccn = ret
    
End Function


(n進数→10進数への変換)

'文字を数字として返すプロシージャ
Private Function subncdec(ByVal b As String) As Long
    
    Dim r As Long
    r = Asc(UCase(b))
    If r > 64& Then
        subncdec = r - 55&
    Else
        subncdec = CLng(b)
    End If
    
End Function

'n進数の文字列strNumberを10進数の数字に変換して返す
Private Function ncdec(ByVal n As Long, ByVal strNumber As String) As Long

    Dim lngt As Long
    Dim c As Long
    Dim i As Long
    lngt = 0&
    c = 1&
    For i = 1& To Len(strNumber)
        lngt = lngt + subncdec(Left$(Right$(strNumber, i), 1)) * c
        c = c * n
    Next i
    ncdec = lngt

End Function


(n進数→m進数への変換)

上のプロシージャを利用すれば、One Line で可能です。

'n進数文字列strNumberを変換してm進数文字列として返す
Public Function ncm(ByVal n As Long, ByVal m As Long, _
                    ByVal strNumber As String) As String
    
    ncm = deccn(m, ncdec(n, strNumber))

End Function


(正当性の評価)

ちょっと脇道にそれますが、上のようなプログラムが正しく動作するかどうかを 調べるには?? これは、非常に重要なことなのですが、なかなか難しくてそういったチェック プログラムを作成することはかなり困難です。ですが、 例えば上のものを例に取ると、『10進数→n進数への変換』のプロシージャが 正しいという前提のもとで行えば、次のように簡単に実行可能です。

    Private Const N = 16
    Private Const CHECK_MAX = 1000
    
    Dim i As Long
    For i = 0 To CHECK_MAX
        If ncdec(N, deccn(N, i)) <> i Then
            MsgBox "Your program is wrong..."
            Exit Sub
        End If
    Next i
    MsgBox "Your program is collect!!"

『プログラムの正当性』は単に正確さを求めているのではなく、その速さや ロジックのわかりやすさ等も含みます。今後、そういうサンプルをUPする かもしれませんが、ちょっと難しいかな・・・。


(サンプルプログラムの動作確認)

機種 PC-9821V13S
OS Windows95
開発ツール Visual Basic Ver.4.0
更新日 00/11/05

ダウンロード Convert.lzh(1.85KB)

Visual Basic Ver.5.0,Ver.6.0でも問題なく動作すると思います。
なお、このコーナーに掲載されているプログラムコード、およびプログラムファ イルが原因で生じた損害などに関して一切の責任を負うことはできません。

★掲載されているプログラムコード、およびプログラムファイル、 ソースファイルを無断で配布・転載することは、原則として禁止です。


Algorithmインデックス トップ


Copyright(C)2000 Tomoya. All rights reserved.