2007-12-12

IF文による条件分岐

  1. 前回の解答

    Sub ベクトル()

    Dim x(100) As Single, y(100) As Single, z(100) As Single

    Sheets(1).Select
    For i = 1 To 100
    x(i) = Cells(i, 1)
    Next i

    Sheets(2).Select
    For i = 1 To 100
    y(i) = Cells(i, 1)
    Next i

    For i = 1 To 100
    z(i) = x(i) + y(i)
    Next i

    Sheets(3).Select
    For i = 1 To 100
    Cells(i, 1) = z(i)
    Next i

    End Sub

  2. 個数を数えてから足す
    3個とか100個とかに限らず、縦に何個数字が並んでいるベクトルなのかを数えてから足すプログラムを考えて見ます。まずは、1枚目のシートに並んでいる数を数えるだけのプログラムです。

    Sub ベクトル2()
    Dim x() As Single, y() As Single, z() As Single, i As Integer, n As Integer

    Sheets(1).Select
    i = 1
    Do While Selection.Cells(i, 1) <> "" And IsNumeric(Selection.Cells(i, 1))
    i = i + 1
    Loop

    n = i - 1
    ReDim x(n)
    ReDim y(n)
    ReDim z(n)

    For i = 1 To n
    x(i) = Selection.Cells(i, 1)
    Next i

    Sheets(2).Select
    For i = 1 To n
    y(i) = Selection.Cells(i, 1)
    Next i

    For i = 1 To n
    z(i) = x(i) + y(i)
    Next i

    Sheets(3).Select
    For i = 1 To n
    Selection.Cells(i, 1) = z(i)
    Next i

    End Sub

  3. 場合分け
    Sheet1に並んでいる個数とSheet2に並んでいる個数が違っていると、ベクトルの足し算は出来ません。例えば
    +
    では足し算できません。
    ですから、Sheet1に並んでいる数字の個数と、Sheet2に並んでいる数字の個数を数えて、等しいときは足し算をして、等しくないときは足し算しないという場合分けが必要になります。場合分けのためにはIF文を使います。IF文の書き方は

    If 条件 Then
    条件が成立するときに実行するプログラム
    Else
    条件が不成立のときに実行するプログラム
    End If
    です。

  4. IF文の例

    Sheet1とSheet2に自分でベクトルを入力して、次のプログラムを実行してみてください。

    Sub ベクトルの型判定()

    Sheets(1).Select
    i = 1
    Do Until Selection.Cells(i, 1) = ""
    i = i + 1
    Loop
    n1 = i - 1

    Sheets(2).Select
    i = 1
    Do Until Selection.Cells(i, 1) = ""
    i = i + 1
    Loop
    n2 = i - 1

    If n1 = n2 Then
    MsgBox ("ベクトルの型は等しいので足し算できます")
    Else
    MsgBox ("ベクトルの型は異なるので足し算できません")
    End If

    End Sub

  5. 課題

    ベクトルの型が等しいときに、ベクトルの足し算をしてSheet3に表示するプログラムを書きなさい。

  6. 行列の足し算 ベクトルではなく次のように行列が入力されている場合について足し算するプログラムを書きましょう。
     +  → 

    このように、縦横の2つの方向に数字が並んでいるときには、それを記憶する配列も添え字が2つ必要です。
    Dim x(4,3) As Single
    と書くと、
    x(1,1), x(1,2), x(1,3)
    x(2,1), x(2,2), x(2,3)
    x(3,1), x(3,2), x(3,3)
    x(4,1), x(4,2), x(4,3)
    の12個が使えるようになります。(注:正確にはx(0,0)なども使えるので20個使えます)
    この配列にシートから数字を読み込むためには
    x(1,1)=Selection.Cells(1,1)
    x(2,1)=Selection.Cells(2,1)
    x(3,1)=Selection.Cells(3,1)
    x(4,1)=Selection.Cells(4,1)

    x(1,2)=Selection.Cells(1,2)
    x(2,2)=Selection.Cells(2,2)
    x(3,2)=Selection.Cells(3,2)
    x(4,2)=Selection.Cells(4,2)

    x(1,3)=Selection.Cells(1,3)
    x(2,3)=Selection.Cells(2,3)
    x(3,3)=Selection.Cells(3,3)
    x(4,3)=Selection.Cells(4,3)
    と書きますが、この書き方だと行列の成分の個数と同じ数だけプログラムを繰り返し書かなければなりません。 繰り返す部分をFor文を使ってまとめましょう。

    For i=1 to 4
    x(i,1)=Selection.Cells(i,1)
    Next i

    For i=1 to 4
    x(i,2)=Selection.Cells(i,2)
    Next i

    For i=1 to 4
    x(i,3)=Selection.Cells(i,3)
    Next i

    このようにすると少しはまとめることが出来ますが、まだまだ似たようなプログラムを3回書かなければなりません。

    For i=1 to 4
    x(i,1)=Selection.Cells(i,1)
    Next i

    この赤い部分だけが1, 2, 3と変わりながら繰り返されているので、さらにFor文を使って繰り返します。

    For j=1 to 3
     For i=1 to 4
      x(i,j)=Selection.Cells(i,j)
     Next i
    Next j

    このように書くと、Sheet1の行列を配列xに読み込むことが出来ました。

  7. 課題1:4行3列の行列の足し算を行うプログラムを完成させなさい。

    課題2:行列の型を調べて、行の数同士が等しく、列の数同士が等しい時だけ行列の足し算をし、そうでないときは「行列の型が異なるので足し算できません」と表示するプログラムを作ってください。If 文で条件が二つ以上あるときは、 And や Or を使います。

  8. 課題が出来た人は
    行列の掛算のプログラムを作ります。行列の掛算の方法、特に掛算をするためには行列の型に どのような条件があったかを復習してください。
    復習問題:次の行列の掛算は出来ますか。出来るかどうか判定し、出来る場合は掛算してください。

0 件のコメント: