第16講 10進数をn進数に翻訳するマクロ
第6話 プログラム解説その2
を実現するプログラム主要部分再掲
Sub h(b() As Integer)
Dim i As Integer, ik As Integer
i = 0
Do While 1
If b(i) = -1 Then
ik = i - 1
Exit Do
End If
i = i + 1
Loop
For i = ik To 0 Step -1
If b(i) < 10 Then Cells(5, 1 + ik - i) = b(i)
If b(i) = 10 Then Cells(5, 1 + ik - i) = "A"
If b(i) = 11 Then Cells(5, 1 + ik - i) = "B"
If b(i) = 12 Then Cells(5, 1 + ik - i) = "C"
If b(i) = 13 Then Cells(5, 1 + ik - i) = "D"
If b(i) = 14 Then Cells(5, 1 + ik - i) = "E"
If b(i) = 15 Then Cells(5, 1 + ik - i) = "F"
Next
End Sub
参考ダウンロード添付ファイル
解説の続き
b(g + 1) = -1
の意味は、表示プロシージャの中身を見なければ分かりません。
i = 0
Do While 1
If b(i) = -1 Then
ik = i - 1
Exit Do
End If
i = i + 1
Loop
では何をしているのでしょうか。
4876を2進数に翻訳した結果は1001100001100です。
逆順に表示する必要があります。
逆順というのは、下から上へと表示する必要があるということです。
i = 0
Do While 1
If b(i) = -1 Then
ik = i - 1
Exit Do
End If
i = i + 1
Loop
は、どこまで下へ遡及すべきを決定しています。
データは
b(0)=0,b(1)=0,b(2)=1,b(3)=1,b(4)=0,b(5)=0,b(6)=0,
b(7)=0,b(8)=1,b(9)=1,b(10)=0,b(11)=0,b(12)=1,b(13)=-1
のように入っています。
上から下へと進んだ訳ですから、
0011000011001-1
ですよね。この順にデータが入っているわけです。
Sub f(a As Long, b() As Integer, n As Integer, g As Integer)
b(g) = a Mod n
a = Int(a / n)
を思い出して下さい。
i = 0
Do While 1
If b(i) = -1 Then
ik = i - 1
Exit Do
End If
i = i + 1
Loop
は、b(12)=1の12を見いだすための処理です。
すなわち、12が意味のあるデータの最後の添え字であることを、
発見するための処理です。
このときに、
b(g + 1) = -1
が重要な働きをします。
b(13)=-1
となっていて、添え字13は意味のないデータであることが認識できるのです。
n進数表示では-1はあり得ない数字であるからです。
ですから、一番下は12であることが分かるわけです。
どうしてかと申しますと、
ik = i - 1
ですね。
すなわち、
12 = 13 - 1
13 の1つ手前ですよね。
後は、
For i = ik To 0 Step -1
If b(i) < 10 Then Cells(5, 1 + ik - i) = b(i)
If b(i) = 10 Then Cells(5, 1 + ik - i) = "A"
If b(i) = 11 Then Cells(5, 1 + ik - i) = "B"
If b(i) = 12 Then Cells(5, 1 + ik - i) = "C"
If b(i) = 13 Then Cells(5, 1 + ik - i) = "D"
If b(i) = 14 Then Cells(5, 1 + ik - i) = "E"
If b(i) = 15 Then Cells(5, 1 + ik - i) = "F"
Next
によって逆順に表示するだけです。
b(0)=0,b(1)=0,b(2)=1,b(3)=1,b(4)=0,b(5)=0,b(6)=0,
b(7)=0,b(8)=1,b(9)=1,b(10)=0,b(11)=0,b(12)=1
を12,11,10,・・・,2,1,0の逆順に表示して
1001100001100
となるわけです。
どうです。
解説を読んですっきりしたのではありませんか。
今回プロシージャの再帰的使用によって、
10進数をn進数に翻訳しましたが、
もちろん、Do文やWhile文によっても実現できます。
みなさん、Do文やWhile文のそれぞれの場合のプログラムを考えて下さい。
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
vc++講義へ
excel 2013 2010 2007 vba入門へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
専門用語なしの C言語 C++ 入門(Visual C++ 2010で学ぶ C言語 C++ 入門)
専門用語なしの excel vba マクロ 入門 2013 2010 2007 対応講義 第1部
eclipse java 入門へ
excel 2016 vba 入門へ
小学生からエンジニアまでのRuby入門へ
本サイトトップへ