第8講 プロシージャ(2)
第5話 もとの行列・左右反転行列・上下反転行列・転置行列のすべてを表示する
実行画面
もとの行列
1 7 4 0 9 4 8
8 2 4 5 5 1 7
1 1 5 2 7 6 1
4 2 3 2 2 1 6
8 5 7 6 1 8 9
2 7 9 5 4 3 1

左右反転
8 4 9 0 4 7 1
7 1 5 5 4 2 8
1 6 7 2 5 1 1
6 1 2 2 3 2 4
9 8 1 6 7 5 8
1 3 4 5 9 7 2

上下反転
2 7 9 5 4 3 1
8 5 7 6 1 8 9
4 2 3 2 2 1 6
1 1 5 2 7 6 1
8 2 4 5 5 1 7
1 7 4 0 9 4 8

転置
1 8 1 4 8 2
7 2 1 2 5 7
4 4 5 3 7 9
0 5 2 2 6 5
9 5 7 2 1 4
4 1 6 1 8 3
8 7 1 6 9 1

を実現するプログラム例
Module Module1

  Sub Main() '私は社長だ。
    Rnd (-1)
    Randomize (Timer())
    Dim a(5, 6) As Integer '配列の宣言
    f (a) 'データ作成
    g (a) 'もとの行列表示
    Console.WriteLine()
    h (a) '左右反転行列表示
    Console.WriteLine()
    t (a) '上下反転行列表示
    Console.WriteLine()
    s (a) '転置行列表示
  End Sub

  Sub f(x(,) As Integer)
    Dim i, j As Integer
    For i = 0 To 5
      For j = 0 To 6
        x(i, j) = Int(10 * Rnd())
      Next
    Next
  End Sub

  Sub g(x(,) As Integer)
    Dim i, j As Integer
    For i = 0 To 5
      For j = 0 To 6
        Console.Write("{0:d} ", x(i, j))
      Next
      Console.WriteLine()
    Next
  End Sub

  Sub h(x(,) As Integer)
    Dim i, j As Integer
    For i = 0 To 5
      For j = 0 To 6
        Console.Write("{0:d} ", x(i, 6 - j))
      Next
      Console.WriteLine()
    Next
  End Sub

  Sub t(x(,) As Integer)
    Dim i, j As Integer
    For i = 0 To 5
      For j = 0 To 6
        Console.Write("{0:d} ", x(5 - i, j))
      Next
      Console.WriteLine()
    Next
  End Sub

  Sub s(x(,) As Integer)
    Dim i, j As Integer
    For i = 0 To 6
      For j = 0 To 5
        Console.Write("{0:d} ", x(j, i))
      Next
      Console.WriteLine()
    Next
  End Sub

End Module


さて、Main()で配列を作り渡していましたが、
プロシージャ側から配列を戻すことが出来るでしょうか。
つまり、戻り値を配列にすることは出来るでしょうか。

もちろん配列を戻り値にすることは出来ません。
プロシージャのところで言い忘れましたが、
Functionプロシージャは必ず1つの値のみを返します。
ですから、VBのプロシージャも戻す値は1つです。
ならば、配列を社長以外の社員が作り、
社長に返すことができかといいますと、
出来るが答えです。
下の図では、配列の先頭アドレスである
w
1000を社員から返してもらえれば、
社長はx[0]からx[4]までのデータを受け取ることが出来ます。
連続する番地に5つのデータが入っているからです。
プロシージャは1つの値しか返せませんが、
1000という配列のアドレス(正確には1つ手前のアドレス)を受け取れば、
1001〜1004、1005〜1008、1009〜10012、1013〜1016、1017〜1020
に入っているデータを引き出すことが出来ます。
実質配列を返してもらったのと同じ結果になります。

本当は配列の先頭アドレスを返したり、送ったりするのですが、
実質は配列を返したり、送ったりするのと同じですから、
これからは配列の先頭アドレスを送るとか、返すとかとはいわないで、
単に配列を返す、配列を送ると表現することにします。


Function
プロシージャf()において2次元配列を作り、
それをMain()に返し、

Main()はその2次元配列をSubプロシージャg(x(,) As Integer)とSubプロシージャh(x(,) As Integer)におくり、
Subプロシージャg(x(,) As Integer)は2次元配列データすなわち行列データを作成して、
Subプロシージャh(x(,) As Integer)は行列を表示することによって、
実行画面が
もとの行列
1 7 4 0 9 4 8
8 2 4 5 5 1 7
1 1 5 2 7 6 1
4 2 3 2 2 1 6
8 5 7 6 1 8 9
2 7 9 5 4 3 1

となるようなコード例は
Module Module1

  Sub Main() '私は社長だ。
    Rnd (-1)
    Randomize (Timer())
    Dim a(5, 6) As Integer 'aはf()が作った配列の受け皿=配列の先頭アドレスを収納する変数
    a = f() '配列作成
    g (a) '行列データ作成
    h (a) '行列の表示
  End Sub

  Function f()
    Dim x(5, 6) As Integer
    Return x
  End Function

  Sub g(x(,) As Integer)
    Dim i, j As Integer
    For i = 0 To 5
      For j = 0 To 6
        x(i, j) = Int(10 * Rnd())
      Next
    Next
  End Sub

  Sub h(x(,) As Integer)
    Dim i, j As Integer
    For i = 0 To 5
      For j = 0 To 6
        Console.Write("{0:d} ", x(i, j))
      Next
      Console.WriteLine()
    Next
  End Sub

End Module
などです。
VBにはアドレスを受け取る変数(箱)であるポインタはありませんが、
    Dim a(5, 6) As Integer
    a = f() '配列作成
とすれば、実質aはアドレスを受け取る変数=ポインタと同じです。

では、実行画面が、
もとの行列
1 7 4 0 9 4 8
8 2 4 5 5 1 7
1 1 5 2 7 6 1
4 2 3 2 2 1 6
8 5 7 6 1 8 9
2 7 9 5 4 3 1

左右反転
8 4 9 0 4 7 1
7 1 5 5 4 2 8
1 6 7 2 5 1 1
6 1 2 2 3 2 4
9 8 1 6 7 5 8
1 3 4 5 9 7 2

上下反転
2 7 9 5 4 3 1
8 5 7 6 1 8 9
4 2 3 2 2 1 6
1 1 5 2 7 6 1
8 2 4 5 5 1 7
1 7 4 0 9 4 8

転置
1 8 1 4 8 2
7 2 1 2 5 7
4 4 5 3 7 9
0 5 2 2 6 5
9 5 7 2 1 4
4 1 6 1 8 3
8 7 1 6 9 1

であり、
以下の条件を満たすプログラムを作って下さい。
@ 2次元配列はFuncitonプロシージャf()が作る。
A 2次元の行列データはSubプロシージャg()が生成する。
B 行列の表示はSubプロシージャh()が担当する。
D 左右反転行列の表示はSubプロシージャs()が担当する。
E 上下反転行列の表示はSubプロシージャt()が担当する。
F 転置行列の表示はSubプロシージャu()が担当する。


第4話へ   第6話へ

002

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ