- 前回の解答
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 - 個数を数えてから足す
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
- 場合分け
Sheet1に並んでいる個数とSheet2に並んでいる個数が違っていると、ベクトルの足し算は出来ません。例えば
+
では足し算できません。
ですから、Sheet1に並んでいる数字の個数と、Sheet2に並んでいる数字の個数を数えて、等しいときは足し算をして、等しくないときは足し算しないという場合分けが必要になります。場合分けのためにはIF文を使います。IF文の書き方はIf 条件 Then
条件が成立するときに実行するプログラム
Else
条件が不成立のときに実行するプログラム
End If
です。 - 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 - 課題
ベクトルの型が等しいときに、ベクトルの足し算をしてSheet3に表示するプログラムを書きなさい。
- 行列の足し算
ベクトルではなく次のように行列が入力されている場合について足し算するプログラムを書きましょう。
+ →
このように、縦横の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に読み込むことが出来ました。
- 課題1:4行3列の行列の足し算を行うプログラムを完成させなさい。
課題2:行列の型を調べて、行の数同士が等しく、列の数同士が等しい時だけ行列の足し算をし、そうでないときは「行列の型が異なるので足し算できません」と表示するプログラムを作ってください。If 文で条件が二つ以上あるときは、 And や Or を使います。
- 課題が出来た人は
行列の掛算のプログラムを作ります。行列の掛算の方法、特に掛算をするためには行列の型に どのような条件があったかを復習してください。
復習問題:次の行列の掛算は出来ますか。出来るかどうか判定し、出来る場合は掛算してください。
Amazonブラックフライデー、11月29日〜12月6日に開催
-
Amazonは、年末最後のビッグセール「Amazonブラックフライデー」を2024年11月29日(金)0時〜12月6日(金)23時59分まで開催する。セール開催に先駆け、先行セールを27日と28日に実施する。
プライム会...
0 件のコメント:
コメントを投稿