第6講 For文以外の繰り返し処理

第5話 While文とDo...Loop While文による2次元ループ

While文による2次元ループ例
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     '変数の宣言
     Dim a(4, 4) As Integer, b(4, 4) As Integer, i As Integer, j As Integer, w As String

     '自然行列の発生
     
i = 0
     
While i < 5
       j = 0
       While j < 5

         a(i, j) = i * 5 + j + 1
         j = j + 1  'これを忘れると永久ループになる
       
End Loop
       i = i + 1
     
End Loop

     '転置行列の発生
     i = 0
     
While i < 5
       j = 0
       While j < 5

         b(j, i) = i * 5 + j + 1
         j = j + 1
       End Loop
       w = w & vbNewLine
       i = i + 1
     End Loop
     '自然行列の表示
     w = ""
     
i = 0
     While i < 5
       j = 0
       While j < 5

         If a(i, j) < 10 Then w = w + "0" + a(i, j).ToString + " "
         If a(i, j) >= 10 Then w = w + a(i, j).ToString + " "
         j = j + 1
       End Loop
       w = w & vbNewLine
       i = i + 1
     End Loop
     Label1.Text = w

     '転置行列の表示
     w = ""
     i = 0
     While i < 5
       j = 0
       While j < 5

         If b(i, j) < 10 Then w = w + "0" + b(i, j).ToString + " "
         If b(i, j) >= 10 Then w = w + b(i, j).ToString + " "
         j = j + 1
       End Loop
       w = w & vbNewLine
       i = i + 1
    End Loop
    Label2.Text = w


    '自然行列と転置行列の和表示
    w = ""
     i = 0
     While i < 5
       j = 0
       While j < 5

        If a(i, j) + b(i, j) < 10 Then w = w + "0" + (a(i, j) + b(i, j)).ToString + " "
        If a(i, j) + b(i, j) >= 10 Then w = w + (a(i, j) + b(i, j)).ToString + " "
        j = j + 1
      End Loop
      w = w & vbNewLine
      i = i + 1
    End Loop
    Label3.Text = w

   End Sub
End Class

Do...Loop While文による2次元ループ例
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     '変数の宣言
     Dim a(4, 4) As Integer, b(4, 4) As Integer, i As Integer, j As Integer, w As String

     '自然行列の発生
     i = 0
     Do
       j = 0       
       Do
         a(i, j) = i * 5 + j + 1
         j = j + 1  'これを忘れると永久ループになる
       Loop While j < 5
       i = i + 1
     Loop While i < 5

     '転置行列の発生
     i = 0
     Do
       j = 0       
       Do
         b(j, i) = i * 5 + j + 1
         j = j + 1
       Loop While j < 5
       w = w & vbNewLine
       i = i + 1
     Loop While i < 5

     '自然行列の表示
     w = ""
     i = 0
     Do       
       j = 0
       Do
         If a(i, j) < 10 Then w = w + "0" + a(i, j).ToString + " "
         If a(i, j) >= 10 Then w = w + a(i, j).ToString + " "
         j = j + 1
       Loop While j < 5
       w = w & vbNewLine
       i = i + 1
     Loop While i < 5
     Label1.Text = w

     '転置行列の表示
     w = ""
     i = 0
     Do       
       j = 0
       Do
         If b(i, j) < 10 Then w = w + "0" + b(i, j).ToString + " "
         If b(i, j) >= 10 Then w = w + b(i, j).ToString + " "
         j = j + 1
       Loop While j < 5
       w = w & vbNewLine
       i = i + 1
    Loop While i < 5
    Label2.Text = w


    '自然行列と転置行列の和表示
    w = ""
    i = 0
    Do      
      
j = 0
      Do
        If a(i, j) + b(i, j) < 10 Then w = w + "0" + (a(i, j) + b(i, j)).ToString + " "
        If a(i, j) + b(i, j) >= 10 Then w = w + (a(i, j) + b(i, j)).ToString + " "
        j = j + 1
      Loop While j < 5
      w = w & vbNewLine
      i = i + 1
    Loop While i < 5
    Label3.Text = w

   End Sub
End Class
(すみません。2017/10/04に西 純一さんから間違いを指摘されて、
2017/10/05に訂正しました。
ピンクは本質的な間違いで、
はケアレスミスです。
ミスのご指摘に心より感謝致します。)


今回の例では、While文とDo...Loop While文ではまったく差がありませんでした。
結局、問題の種類よっては、どちらでもよいもの、前判定のWhile文と方が向いているもの、Do...Loop While文の方が向いているもの
があることになります。

また、2次元ループはFor文を用いなくても作れることがわかりました。
本質的には、While文とDo...Loop While文はFor文と同じです。
では、今回作ったWhile文とDo...Loop While文の2次元ループをfor文に書き換えてみましょう。
解答例は、30行下。









































解答例
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     '変数の宣言
     Dim a(4, 4) As Integer, b(4, 4) As Integer, i As Integer, j As Integer, w As String

     '自然行列の発生
     For i = 0 To 5
       For j = 0 To 5
         a(i, j) = i * 5 + j + 1
       Next
     Next

     '転置行列の発生
     For i = 0 To 5
       For j = 0 To 5
         b(j, i) = i * 5 + j + 1
       Next
       w = w & vbNewLine
     Next

     '自然行列の表示
     w = ""
     For i = 0 To 5
       For j = 0 To 5
         If a(i, j) < 10 Then w = w + "0" + a(i, j).ToString + " "
         If a(i, j) >= 10 Then w = w + a(i, j).ToString + " "
       Next
       w = w & vbNewLine
     Next
     Label1.Text = w

     '転置行列の表示
     w = ""
     For i = 0 To 5
       For j = 0 To 5
         If b(i, j) < 10 Then w = w + "0" + b(i, j).ToString + " "
         If b(i, j) >= 10 Then w = w + b(i, j).ToString + " "
       Next
       w = w & vbNewLine
     Next
     Label2.Text = w


     '自然行列と転置行列の和表示
     w = ""
     For i = 0 To 5
       For j = 0 To 5
         If a(i, j) + b(i, j) < 10 Then w = w + "0" + (a(i, j) + b(i, j)).ToString + " "
         If a(i, j) + b(i, j) >= 10 Then w = w + (a(i, j) + b(i, j)).ToString + " "
       Next
       w = w & vbNewLine
     Next
     Label3.Text = w

   End Sub
End Class


結局、For文、While文、Do...Loop While文は対して違いがないんじゃないの?
それだったら、記述が簡単なFor文オンリーに絞った方がいいじゃないの?
こうした疑問があると思います。
For文・While文・Do...While文の関係について、次話で考えてみたいと思います。

尚、第6講は第6話で終了の予定です。
ですから、次話が終われば卒業までは後4講ということになります。
ここまでついてこられた初心者の皆さんに敬意を表するともに、是非最後までのおつきあいをお願いいたします。
がんばりましょう!


第4話へ 第6話へ

006

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

数学研究室に戻る