第5講 配列の学習
第10話 3次元配列の利用による年間成績一覧表の作成の解説その2
今日は残りを解説しましょう。
'各学期合否・講評の算出・表示
For i = 0 To 2
For j = 1 To 40
If a(i, j - 1, 6) >= 250 Then DataGridView1(11, i * 47 + j +
1).Value = "合格"
If a(i, j - 1, 6) < 250 Then DataGridView1(11, i * 47 + j +
1).Value = "不合格"
Next
For j = 1 To 40
If a(i, j - 1, 6) >= 350 Then DataGridView1(12, i * 47 + j +
1).Value = "上位合格です。"
If a(i, j - 1, 6) < 350 And a(i, j - 1, 6) >= 280 Then DataGridView1(12,
i * 47 + j + 1).Value = "余裕で合格です。"
If a(i, j - 1, 6) < 280 And a(i, j - 1, 6) >= 250 Then DataGridView1(12,
i * 47 + j + 1).Value = "ぎりぎり合格です。"
If a(i, j - 1, 6) < 250 And a(i, j - 1, 6) >= 230 Then DataGridView1(12,
i * 47 + j + 1).Value = "合格まで後一歩です。"
If a(i, j - 1, 6) < 230 Then DataGridView1(12, i * 47 + j +
1).Value = "よく勉強して再挑戦!"
Next
Next
'各学期各教科の合計・平均の算出・表示
For i = 0 To 2
For j = 1 To 6
w = 0
For k = 1 To 40
w = w + a(i, k - 1, j)
Next
DataGridView1(j, i * 47 + 42).Value = w
DataGridView1(j, i * 47 + 43).Value = w / 40
Next
DataGridView1(7, i * 47 + 42).Value = DataGridView1(6, i * 47 + 42).Value
/ 5
DataGridView1(7, i * 47 + 43).Value = DataGridView1(7, i * 47 + 42).Value
/ 40
Next
'各学期各教科の最高点・算出の算出・表示
For i = 0 To 2
For j = 1 To 6
max = 0
min = 500
For k = 1 To 40
If a(i, k - 1, j) > max Then max = a(i, k - 1, j)
If a(i, k - 1, j) < min Then min = a(i, k - 1, j)
Next
DataGridView1(j, i * 47 + 44).Value = max
DataGridView1(j, i * 47 + 45).Value = min
Next
Next
'各学期の成績順並び替え
Dim bn As Integer, w1 As String
For i = 0 To 2
For j = 40 To 2 Step -1
min = 500
For k = 1 To j
If a(i, k - 1, 6) < min Then
min = a(i, k - 1, 6)
bn = k
End If
Next
For k = 0 To 6
w = a(i, bn - 1, k)
a(i, bn - 1, k) = a(i, j - 1, k)
a(i, j - 1, k) = w
Next
For k = 0 To 12
w1 = DataGridView1(k, i * 47 + bn + 1).Value
DataGridView1(k, i * 47 + bn + 1).Value = DataGridView1(k, i
* 47 + j + 1).Value
DataGridView1(k, i * 47 + j + 1).Value = w1
Next
Next
Next
'各学期順位付け
For i = 0 To 2
For j = 1 To 40
DataGridView1(10, i * 47 + j + 1).Value = j
Next
For j = 2 To 41
If a(i, j - 1, 6) = a(i, j - 2, 6) Then DataGridView1(10, i * 47
+ j + 1).Value = DataGridView1(10, i * 47 + j).Value
Next
Next
'各学期出席番号順並び替え
For i = 0 To 2
For j = 40 To 2 Step -1
max = 0
For k = 1 To j
If a(i, k - 1, 6) < min Then
min = a(i, k - 1, 6)
bn = k
End If
Next
For k = 0 To 6
w = a(i, bn - 1, k)
a(i, bn - 1, k) = a(i, j - 1, k)
a(i, j - 1, k) = w
Next
For k = 0 To 12
w1 = DataGridView1(k, i * 47 + bn + 1).Value
DataGridView1(k, i * 47 + bn + 1).Value = DataGridView1(k, i
* 47 + j + 1).Value
DataGridView1(k, i * 47 + j + 1).Value = w1
Next
Next
Next
'各学期合否・講評の算出・表示
For i = 0 To 2
For j = 1 To 40
If a(i, j - 1, 6) >= 250 Then DataGridView1(11, i * 47 + j +
1).Value = "合格"
If a(i, j - 1, 6) < 250 Then DataGridView1(11, i * 47 + j +
1).Value = "不合格"
Next
For j = 1 To 40
If a(i, j - 1, 6) >= 350 Then DataGridView1(12, i * 47 + j +
1).Value = "上位合格です。"
If a(i, j - 1, 6) < 350 And a(i, j - 1, 6) >= 280 Then DataGridView1(12,
i * 47 + j + 1).Value = "余裕で合格です。"
If a(i, j - 1, 6) < 280 And a(i, j - 1, 6) >= 250 Then DataGridView1(12,
i * 47 + j + 1).Value = "ぎりぎり合格です。"
If a(i, j - 1, 6) < 250 And a(i, j - 1, 6) >= 230 Then DataGridView1(12,
i * 47 + j + 1).Value = "合格まで後一歩です。"
If a(i, j - 1, 6) < 230 Then DataGridView1(12, i * 47 + j +
1).Value = "よく勉強して再挑戦!"
Next
Next
は合否と講評です。わかりやすさを優先してIf...Else...文は使わず、すべて肯定表現
If a(i, j - 1, 6) >= 350 Then DataGridView1(12, i * 47 + j +
1).Value = "上位合格です。"
If a(i, j - 1, 6) < 350 And a(i, j - 1, 6) >= 280 Then DataGridView1(12,
i * 47 + j + 1).Value = "余裕で合格です。"
If a(i, j - 1, 6) < 280 And a(i, j - 1, 6) >= 250 Then DataGridView1(12,
i * 47 + j + 1).Value = "ぎりぎり合格です。"
If a(i, j - 1, 6) < 250 And a(i, j - 1, 6) >= 230 Then DataGridView1(12,
i * 47 + j + 1).Value = "合格まで後一歩です。"
If a(i, j - 1, 6) < 230 Then DataGridView1(12, i * 47 + j +
1).Value = "よく勉強して再挑戦!"
で講評を行っています。
For i = 0 To 2となっていますので同様なことを3回繰り返しています。
1回目が1学期、2回目が2学期、3回目が3学期です。すべての処理が3回繰り返されます。
'各学期各教科の合計・平均の算出・表示
For i = 0 To 2
For j = 1 To 6
w = 0
For k = 1 To 40
w = w + a(i, k - 1, j)
Next
DataGridView1(j, i * 47 + 42).Value = w
DataGridView1(j, i * 47 + 43).Value = w / 40
Next
DataGridView1(7, i * 47 + 42).Value = DataGridView1(6, i * 47 + 42).Value
/ 5
DataGridView1(7, i * 47 + 43).Value = DataGridView1(7, i * 47 + 42).Value
/ 40
Next
ここでは、各学期の各教科および合計点の合計を計算して、
それぞれの合計と平均を表示しています。
DataGridView1(j, i * 47 + 42).Value = w
DataGridView1(j, i * 47 + 43).Value = w / 40
では、図の緑の枠を
DataGridView1(7, i * 47 + 42).Value = DataGridView1(6, i * 47 + 42).Value / 5
DataGridView1(7, i * 47 + 43).Value = DataGridView1(7, i * 47 + 42).Value
/ 40
では赤の枠を計算しています。平均は小数になってしまうので、配列の対象にしていませんでした。
そこで茶色の枠と黄色の枠の値(9548と238.7)を使い、平均の合計と平均の平均を計算しています。
合計の合計(茶色の枠9548)を5教科の5で割れば、平均の合計値になります。
また、合計の平均(黄色の枠238.7)を40で割れば平均の平均値になります。
'各学期各教科の最高点・算出の算出・表示
Dim max As Integer, min As Integer
For i = 0 To 2
For j = 1 To 40
max = 0
min = 100
For k = 1 To 5
If a(i, j - 1, k) > max Then max = a(i, j - 1, k)
If a(i, j - 1, k) < min Then min = a(i, j - 1, k)
Next
DataGridView1(8, i * 47 + j + 1).Value = max
DataGridView1(9, i * 47 + j + 1).Value = min
Next
Next
では、
の表示をしています。ここでも、
超難解な
'各学期の成績順並び替え
Dim bn As Integer, l As Integer, w1 As String
For i = 0 To 2
For j = 40 To 2 Step -1
min = 500
For k = 1 To j
If a(i, k - 1, 6) < min Then
min = a(i, k - 1, 6)
bn = k - 1
End If
Next
For l = 0 To 6
w = a(i, bn, l)
a(i, bn, l) = a(i, j - 1, l)
a(i, j - 1, l) = w
Next
For l = 0 To 12
w1 = DataGridView1(l, i * 47 + bn + 2).Value
DataGridView1(l, i * 47 + bn + 2).Value = DataGridView1(l, i
* 47 + j + 1).Value
DataGridView1(l, i * 47 + j + 1).Value = w1
Next
Next
Next
ですが、 a(i, j - 1, 6)のj - 1とDataGridView1(l, i * 47 + j + 1).Valueのj + 1の間に2つのずれがあることを把握すれば、
第7話で解説したものと代わりありません。第7話では1つのずれだったのが2つになったのは、各学期の見出し行に1行追加したからです。
見出し行と列見出しの2行分ずれているわけです。
'各学期順位付け
For i = 0 To 2
For j = 1 To 40
DataGridView1(10, i * 47 + j + 1).Value = j
Next
For j = 2 To 41
If a(i, j - 1, 6) = a(i, j - 2, 6) Then DataGridView1(10, i * 47
+ j + 1).Value = DataGridView1(10, i * 47 + j).Value
Next
Next
第7話で解説したとおりです。それが3回繰り返されている点以外は変わりません。
'各学期出席番号順並び替え
For i = 0 To 2
For j = 40 To 2 Step -1
max = 0
For k = 1 To j
If a(i, k - 1, 0) > max Then
max = a(i, k - 1, 0)
bn = k
End If
Next
For k = 0 To 6
w = a(i, bn - 1, k)
a(i, bn - 1, k) = a(i, j - 1, k)
a(i, j - 1, k) = w
Next
For k = 0 To 12
w1 = DataGridView1(k, i * 47 + bn + 1).Value
DataGridView1(k, i * 47 + bn + 1).Value = DataGridView1(k, i
* 47 + j + 1).Value
DataGridView1(k, i * 47 + j + 1).Value = w1
Next
Next
Next
については、
'各学期の成績順並び替え
Dim bn As Integer, w1 As String
For i = 0 To 2
For j = 40 To 2 Step -1
min = 500
For k = 1 To j
If a(i, k - 1, 6) < min Then
min = a(i, k - 1, 6)
bn = k
End If
Next
For k = 0 To 6
w = a(i, bn - 1, k)
a(i, bn - 1, k) = a(i, j - 1, k)
a(i, j - 1, k) = w
Next
For k = 0 To 12
w1 = DataGridView1(k, i * 47 + bn + 1).Value
DataGridView1(k, i * 47 + bn + 1).Value = DataGridView1(k, i
* 47 + j + 1).Value
DataGridView1(k, i * 47 + j + 1).Value = w1
Next
Next
Next
と基本的に同じです。
基準になっているのがa(i, k - 1, 6) かa(i, k - 1, 0)の違いと
降順と昇順の違いがあるだけです。a(i, k - 1, 6)とは合計値、a(i, k - 1, 0)とは出席番号でした。
この講では年間成績一覧表を題材にしたため超難解になってしまって申し訳ありませんでした。
これでこの講は閉め、次講ではFor文以外のループ処理について見ていきます。
第9話へ 第6講第1話へ
VC++講義第1部へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
数学研究室に戻る