第3講 For文の学習
第8話 2次元ループ
では、準備ができましたのでいよいよプログラム上から、
2次元上にデータを入れたり、列合計、行合計、行平均などを計算させて見ましょう。
(赤い囲いは、説明のために入れたもので実際のソフトのWindow上にはありません。)
エクセルのようにA列の1行目のセルをA1を表すことにしましょう。
A1は上図の選択セル(青いセル)です。
D1にデータを入れるときは、
DataGridView1(3,0).Value ="合計 "
とします。VBAの経験者なら、Cellsを思い浮かべるでしょうが、
違いが2点あります。行と列が反対ということと、DataGridView1(*,*)の始まりが0であるのに対して
Cells(*,*)の方は1から始まります。
つまり、DataGridView1(3,0)に対応するのはCells(1,4)です。
A1はDataGridView1(0,0)に対応します。A1は1列目1行目を意味していますから、
そこから1引くとDataGridView1になります。0から始まるからです。
エクセル場合は、A1(1列目1行目)がCells(1行目,1列目)と逆になっているので慣れるまで頭が混乱します。
DataGridViewの場合はA1(1列目,1行目)が(0列目,0行目)ですから、列行はその順で対応していますが、
一番最初を1ではなく0と数えるため1個ずれるのです。
Cellsになれた方は、逆順なのでしばらくは頭が混乱してしまうのは仕方がありません。
Cellsで一回頭が混乱し、再びDataGridViewで頭が混乱します。
さて、『.』は『の』でした。Valueはなんでしょうか。値です。
この値は、エクセルのシートのように数字でも文字でも入れられます。
文字を入れるときは""で囲うのは、文字の変数に文字を入れるときと同じです。そして、これはエクセルと同じです。
B2に数字4を入れるには、DataGridView1(1,1).Value =4です。
さて、ここの学習のメインは、のように2次元(平面すなわち縦と横の2方向)データをどう入れるかです。
また、1行の行合計の計算は1次元(直線=1方向))ですが、3行の処理となると横の処理に縦処理が加わりますから、
やはり2次元処理です。
2次元(縦と横の2方向)処理を行うのが、この話のメインテーマである2次元ループです。
2次元ループは、For文を入れ子式に入れることによって実現します。
では、順にプログラミングしていきましょう。
まず、
のように行を追加するプログラムからです。
実行ボタンをダブルクリックして、
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言
Dim i As Integer, j As Integer, w As Integer
'6行追加
For i = 1 To 6
DataGridView1.Rows.Add()
Next
End Sub
End Class
とプログラミングして、F5を押しましょう。
6行追加に成功したことがわかります。
DataGridView1.Rows.Add()は1行追加の命令です。
Rowsは行です。
そして、Addが追加の命令です。
For文で6回繰り返すので、6行追加されるわけです。
では、皆さん1行目のD1、E1に合計、平均を入れるコードを加えてください。
答えは、30行下です。
解答例
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言
Dim i As Integer, j As Integer, w As Integer
'6行追加
For i = 1 To 6
DataGridView1.Rows.Add()
Next
'1行目に列表題を入れる。
DataGridView1(3, 0).Value = "合計 "
DataGridView1(4, 0).Value = "平均 "
End Sub
End Class
次に、A5,A6に合計、平均と入れるコードを加えてください。
解答例は、30行下。
解答例
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言
Dim i As Integer, j As Integer, w As Integer
'6行追加
For i = 1 To 6
DataGridView1.Rows.Add()
Next
'1行目に列表題を入れる。
DataGridView1(3, 0).Value = "合計 "
DataGridView1(4, 0).Value = "平均 "
'5行目,6行目に行表題を入れる。
DataGridView1(0, 4).Value = "合計 "
DataGridView1(0, 5).Value = "平均 "
End Sub
End Class
次にいよいよ、2次元データの入力です。
これはいきなり、考えてくださいといっても無理ですからプログラミング例を表示してから解説します。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
'変数の宣言
Dim i As Integer, j As Integer, w As Integer
'6行追加
For i = 1 To 6
DataGridView1.Rows.Add()
Next
'1行目に列表題を入れる。
DataGridView1(3, 0).Value = "合計 "
DataGridView1(4, 0).Value = "平均 "
'5行目,6行目に行表題を入れる。
DataGridView1(0, 4).Value = "合計 "
DataGridView1(0, 5).Value = "平均 "
'2次元データを入力
For i = 1 To 3
For j = 1 To 2
DataGridView1(j, i).Value = 2 * i + j + 1
Next
Next
End Sub
End Class
ピンクの部分が2次元ループです。For文が入れ子式に入っています。
入れ子式に2重なら2次元、入れ子式に3重なら3次元、入れ子式に4重なら4次元というわけです。
因みに私の作った数独問題作成ソフトは、場合によっては2万次元ループを遙かに超えています。
魔方陣作ソフトによっては、軽く100万次元を超えているものもあります。
DataGridView1(j,i)のjは列、iは行に対応しています。
2次元だとトレースもかなり難しくなりますが、
トレースしてみましょう。
jとiは次の表の紺の数字の通りに動いていきます。
j | 1 | 2 | |
i | |||
1 | 1 | 2 | |
2 | 3 | 4 | |
3 | 5 | 6 |
1→2→3→4→5→6
理由は、次のように変化していくからです。
T i=1のとき
j=1→j=2
U i=2のとき
j=1→j=2
V i=3のとき
j=1→j=2
具体的に動きを追ってみましょう。
DataGridView1(j,i).Value =2*i+j+1は
T i=1の場合
@ j=1のとき
DataGridView1(1,1).Value =2*1+1+1から
B2は4となります。
A j=2のとき
DataGridView1(1,2).Value =2*1+2+1から
C2は4となります。
U i=2の場合
@ j=1のとき
DataGridView1(2,1).Value =2*2+1+1から
B3は6となります。
A j=2のとき
DataGridView1(2,2).Value =2*2+2+1から
C3は7となります。
V i=3の場合
@ j=1のとき
DataGridView1(3,1).Value =2*3+1+1から
B4は8となります。
A j=2のとき
DataGridView1(3,2).Value =2*3+2+1から
C4は9となります。
では、今話も大分長くなりました。
次に、行の合計と平均、列の合計と平均を出すプログラミングを考えてみましょう。
DataGridViewから値を取得して変数に代入するのは、
w = DataGridView1(1, 2).Value
等とすればよいのです。
vc++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
数学研究室に戻る