第16講 10進数をn進数に翻訳するマクロ
第6話 プログラム解説その2
cx
を実現するプログラム主要部分再掲
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
では何をしているのでしょうか。
k
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文のそれぞれの場合のプログラムを考えて下さい。


第5話へ 第7話へ
004

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入門へ
本サイトトップへ