第8講 4次魔方陣と6次魔方陣の作成

第4話 4次魔方陣解答例


第4話で4次魔方陣解答例を示し、
第5話で6次魔方陣解答例を示します。
そして、6次魔方陣の解答例については、
第6話以降から5話程度かけて詳しく解説していきます。
尚、4次魔方陣の方は初心者のためのvisual basic入門講義基礎編第6講 4次魔方陣を作ってみよう
の 第6話 解答1解説  第7話 解答2解説において詳しく解説していますので、
そちらも参照していただければと思います。

コード例
Dim a(4, 4) As Integer 'グローバル配列
Private Sub CommandButton1_Click()

  Dim n As Byte 'この行と次の行を省力して、f0 n以降をf0 4などとプログラムしてもよいが、
  n = 4       'この2行を入れてf0 nなどとしておけばn = 6と変更するだけで6次の場合になる。
            'プログラムを考える場合、汎用性=一般性が広くなるように組むことがコツ


  f0 n '自然配列の生成
  f1 n '自然配列の表示
  f2 n '対角線対称移動
  f3 n '4次魔方陣の表示
  f4 n '検証

End Sub

'自然配列の生成 前の正方行列のマクロからそのまま借用させてもらっている。コピペや『別名で保存する』(『名前を付けて保存』使う)をうまく利用する。
Sub f0(n As Byte)

  Dim i As Byte, j As Byte
  
  For i = 0 To n - 1
    For j = 0 To n - 1
      a(i, j) = n * i + j + 1
    Next
  Next

End Sub

'自然配列の表示 同じく前の正方行列のマクロ自然配列の部分を少し変更して、再利用している。
Sub f1(n As Byte)

  Dim i As Byte, j As Byte

  Cells(5, 1) = "自然配列"
  For i = 0 To n - 1
    For j = 0 To n - 1
      Cells(6 + i, 1 + j) = a(i, j)
    Next
  Next

End Sub

'対角線対称移動
Sub f2(n As Byte)

Dim i As Byte, w As Byte, m As Byte

  m = Int(n / 2)
  '対角線移動
  For i = 0 To m - 1
    w = a(i, i)
    a(i, i) = a(n - 1 - i, n - 1 - i)
    a(n - 1 - i, n - 1 - i) = w
  Next
  '逆対角線移動
  For i = 0 To m - 1
    w = a(n - 1 - i, i)
    a(n - 1 - i, i) = a(i, n - 1 - i)
    a(i, n - 1 - i) = w
  Next

End Sub

'4次魔方陣の表示
Sub f3(n As Byte)

  Dim i As Byte, j As Byte

  Cells(11, 1) = "4次魔方陣"
  For i = 0 To n - 1
    For j = 0 To n - 1
      Cells(12 + i, 1 + j) = a(i, j)
    Next
  Next

End Sub

'検証
Sub f4(n As Byte)

  Dim i As Byte, j As Byte, w As Byte

  Cells(17, 1) = "検証"
  '4次魔方陣再表示
  For i = 0 To n - 1
    For j = 0 To n - 1
      Cells(19 + i, 1 + j) = a(i, j)
    Next
  Next
  '行合計の算出と表示
  For i = 0 To n - 1
    w = 0
    For j = 0 To n - 1
      w = w + a(i, j)
    Next
    Cells(19 + i, 5) = w
  Next
  '列合計の算出と表示
  For i = 0 To n - 1
    w = 0
    For j = 0 To n - 1
      w = w + a(j, i)
    Next
    Cells(23, 1 + i) = w
  Next
  '対角線合計の算出と表示
  w = 0
  For i = 0 To n - 1
    w = w + a(i, i)
  Next
  Cells(18, 6) = "対角線合計"
  Cells(18, 8) = w
  '対角線合計の算出と表示
  w = 0
  For i = 0 To n - 1
    w = w + a(n - 1 - i, n - 1 - i)
  Next
   Cells(23, 6) = "対角線合計"
  Cells(23, 8) = w

End Sub


Private Sub CommandButton2_Click()

  Rows("5:1000").Select
  Selection.ClearContents
  Cells(1, 1).Select

End Sub


実行画面

実行例


第3話へ 第5話へ

004


vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る