☆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でも問題なく動作すると思います。
なお、このコーナーに掲載されているプログラムコード、およびプログラムファ イルが原因で生じた損害などに関して一切の責任を負うことはできません。
★掲載されているプログラムコード、およびプログラムファイル、 ソースファイルを無断で配布・転載することは、原則として禁止です。