第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

ここでは、各学期の各教科および合計点の合計を計算して、
それぞれの合計と平均を表示しています。
3次元配列
成績一覧表
          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話へ

006

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

数学研究室に戻る