第8回 表計算:プログラムでは配列って言ってFor…Nextとタッグを組むと最強
(学習目標:配列を理解し、For…Nextと組み合われて使う方法をマスターする。ここはプログラミングの中核になる部分です。最後の山ですので、がんばりましょう。ここを乗り越えると大体のプログラムは書けるようになります)
8−1 表(配列)
下の表(図8.1)は、A中学校の学生数です。表計算とは、横の行の総和を求めたり、縦の列の総和を求めたりする計算で、コンピュータが使われる代表的な仕事です。
プログラムでは表を配列と呼び、繰り返し命令(For…Next)と組み合わせることで強力な計算手段になります。
配列は変数の一種と考えられますが、データを沢山書くことが出来る点が変数との違いです。配列にも好きな名前を付けてプログラムの中で使います。配列は変数と、2つ違うところがあります。
(変数との違い1)プログラムの最初に、配列の名前と大きさを(これを使いますよ、と)宣言します。
(変数との違い2)プログラム中では配列名に加え、配列中のどのデータを使うのかを指定します。例えば、A校の1年2組のデータを使うには、(上の配列をAという名にすると)A(1,2)とします。
* 配列の各マスを配列の“要素”といいます。
上の表で1年生の人数を計算するプログラムは次のようになります。
Dim A(3,4) ßAという配列は横に3行、縦に4列、あることを宣言する
A(1,4)= A(1,1)+A(1,2)+A(1,3) ß1年生を1組から3組まで足して計の所に書き込む
(配列宣言のDimはプログラムの最初に書きましょう)
8−2 1次元配列
図8.1の表は横に3行ありましたが、1年制の専門学校Bなどは1行で済んでしまいます。
この場合、Dim B(1,5)としてもよいのですが、簡単にDim B(5)で済ませられます。
この様に横1行しかない配列を一次元配列と呼びます。
この場合、4組の人数はB(4)と指定します。
(例題)マーリンにB校の各クラス人数を読み上げさせましょう
(配列の要素にデータを書き込むには、次のプログラムの様に:で区切って並べて書くことができます)
‘===プログラム8.1
Dim B(5)
B(1)=20:B(2)=30:B(3)=50:B(4)=40
Merlin.Speak B(1)
Merlin.Speak B(2)
Merlin.Speak B(3)
Merlin.Speak B(4)
でもよいのですが、クラス数が多くなると書くのが容易でありません。そこで繰り返しを使います。
Dim B(5)
B(1)=20:B(2)=30:B(3)=50:B(4)=40
For i=1 To 4
Merlin.Speak B(i)
Next
だいぶすっきりしましたよね。
(例題)B校の人数の合計をB(5)に求めましょう。
Dim B(5)
B(5)= B(1)+B(2)+B(3)+B(4)
でもよいのですが、練習ですので繰り返しを使いましょう。
‘===プログラム8.2
Dim B(5)
B(1)=20:B(2)=30:B(3)=50:B(4)=40
B(5)=0
For i=1 To 4
B(5)= B(5)+ B(i)
Next
MsgBox B(5)
となります。For文でB(5)=B(5)+B(1), B(5)=B(5)+B(2),…とB(5)にデータが足し込んでいきます。これは、プログラムでいつも使う手ですよね。
(問題8.1)マーリンの横方向に移動させようと思います。配列Dim C(4)には移動先が順に書かれています。For文でマーリンを移動させましょう。縦方向の位置は200で変わらないものとします。C(1)=100,C(2)=400,C(3)=200,C(4)=100。a81.vbs
(問題8.2)B校で人数の一番多いクラスは何人でしょう。a82.vbs
(問題8.3:中3レベル)B校で人数の一番多いクラスは何組でしょう。a83.vbs
8−3 2次元配列
A校の人数表のように、縦横のある表を2次元配列といいます。
(例題)マーリンにA中学の各クラスの人数を読み上げさせましょう
‘===プログラム8.3
Dim A(3,4)
A(1,1)=38:A(1,2)=41:A(1,3)=28
A(2,1)=40:A(2,2)=35:A(2,3)=33
A(3,1)=25:A(3,2)=30:A(3,3)=43
For i=1 To 3
For j=1 To 3
Merlin.Speak i&"年"&j&"組"& A(i,j)
Next
Next
MsgBox "終わり"
(例題)Dには横、縦の場所が入っています。この通り移動させよう
‘===プログラム8.4
Dim D(3,4)
D(1,1)=200:D(1,2)=300:D(1,3)=400
D(2,1)=200:D(2,2)=200:D(2,3)=300
For i=1 To 3
Merlin.MoveTo D(1,i),D(2,i)
Next
MsgBox "終わり"
(例題)A中学の各学年の合計を求めましょう
Dim A(3,4)
A(1,4)=0:A(2,4)=0:A(3,4)=0
A(1,1)=38:A(1,2)=41:A(1,3)=28
A(2,1)=40:A(2,2)=35:A(2,3)=33
A(3,1)=25:A(3,2)=30:A(3,3)=43
For j=1 To 3
A(1,4)= A(1,4)+ A(1,j)
A(2,4)= A(2,4)+ A(2,j)
A(3,4)= A(3,4)+ A(3,j)
Next
でもよいのですが、勘のよい人は次のように2重ループにできることに気づくと思います。
‘===プログラム8.5
Dim A(3,4)
A(1,4)=0:A(2,4)=0:A(3,4)=0
A(1,1)=38:A(1,2)=41:A(1,3)=28
A(2,1)=40:A(2,2)=35:A(2,3)=33
A(3,1)=25:A(3,2)=30:A(3,3)=43
For i=1 To 3
For j=1 To 3
A(i,4)= A(i,4)+ A(i,j)
Next
Next
MsgBox A(1,4)&”,”&A(2,4)&”,”&A(3,4)
Dim hiroba( 5, 5)
For i=1 To 5
For j=1 To 5
hiroba(i,j)= 0
Next
Next
8−4 配列操作の(体育会系)筋トレ
配列はアニメーションであまり活躍できませんが、普通のプログラムでは配列と繰り返しの組み合わせは最も重要な技術です。配列と繰り返しの組み合わせは、沢山の形があるように思いますが整理してみると以下のパターンに分類されます。ここで、本格的プログラム入門の特訓をします、頭の体操にもなります。
計算結果はメッセージボックスに表示しましょう。配列は小さなものを用いていますが、必ずFor…Nextを使って処理しましょう。
タイプ1:全要素に同じ数を書く
(問題8.4)配列Sの配列の要素に全部0を書く。
(問題8.5)配列Sの上の行に全て0を書く。
(問題8.6)配列Tのように数を書こう。
(問題8.7)配列Uのように数を書こう。
タイプ2:総和を求める(要素の足し込み)
(問題8.8)配列Sの総和を求める。
(問題8.9)配列Sの下の行の総和を求める。
(問題8.10)配列Sの偶数の総和を求める。
(問題8.11)配列Sの偶数の数(偶数がいくつあるか)を求める。
タイプ2:最大最小(最大値や最小値を求める)
(問題8.12)配列Sの最大値を求める。
(問題8.13)配列Sの最大値の入っている要素番号を求める。
タイプ3:検索(ある数の入っている要素番号を求める)
(問題8.14)配列Sで9の入っている要素番号を求める。
(問題8.15)配列Sで上下の数を比較し、上の方が下より大きい列の数を求める。
タイプ4:入れ替え(要素や配列の入れ替え)
(ヒント:要素の入れ替えには、一時的にデータを保管する変数を使う)
図8.7 配列V
(問題8.16)配列Vで、要素1と要素3を入れ替える。
(問題8.17)配列Sで、上の行と下の行を入れ替える。
(問題8.18)配列Sで、上、下の数を比較し、大きい方が下になるようにする。
(問題8.19:中3レベル)配列Vに左から1,2,3,4と書いておき、乱数で2箇所を選んで入れ替える処理を5回繰り返す(最後にVの中に1〜4がデタラメに入る)。
タイプ5:シフト
(問題8.20)配列Vの中身を1マス分左にシフト(右端は、そのまま)
(問題8.21:中3レベル)配列Vの中身を1マス分右にシフト(左端は、何でもよい)
右シフトは少し工夫が必要です。色々な方法がありますので、トライしてみて下さい。
(問題8.22)配列Sの中身を1マス分左にシフト(右端は、そのまま)
タイプ6:配列同士の計算
(問題8.23)配列Sと配列Tの対応する各要素を加えて、結果を配列Tに書く。
この位ができれば大体どんなプログラムも書けます。これらの問題全体を20分位でできるようにしておきましょう。