第5回 これであなたもプログラマ「2.繰り返しの詳細」
|
|
5−2 繰り返しの詳細
さて、For NextがDo Loopと異なるのは、始点と終点が決まっている点です。 したがって、予めループの回数がわかっている場合は、For Nextを使うのが妥当です。 では、それらの値を途中で変えてしまったらどうなるでしょうか? ちょっといたずら、いや実験ですが、次のようなサンプルを用意しました。
Dim i as Integer
Dim A as Integer
A=10
For i=0 to A
{処理}
Next
このままなら、i=0,1,2,3,…,8,9,10の11回のループが行われるのはわかりますね?では最初に、ループ用の変数 iの方を変化させて見ましょう。
For i=0 to A
{処理}
i=i+1
Next
この場合、i=0,2,4,6,8,10と、2つ刻みになります。これは、Nextの部分でステップ値を加える処理が実行されるためです。このNextのところで +1がされますので、i=i+1 と合わせて1回のループで +2されるわけです。したがって、0,2,4・・・と2つずつ増えたわけですね。 次は、ループの終点である変数 Aを変えてみましょう。
For i=0 to A
{処理}
A=A+1
If A>100 Then
Exit For
End if
Next
これだと常に終了値が増え続け、終わらないかもしれませんので変数Aの値が100を超えたら、Exit For で強制的にループから抜けるようにしました。そうそう、強制的に抜けるコマンドはExit Forで、このあたりは、Exit Doと同じですね。さて、準備万端で実行してみると、i=0,1,2,3,4,5,6,7,8,0,10 と11回のループになります。 あれれ?予想に反して、ちゃんと終わっちゃいましたね。 実は、For Nextを細かく見てみると、次のようなイメージで動作しているのです。 ![]() 図のように、繰り返しの単位は、Forの次の行からNextの前の行までで、Nextの位置でStep値(この場合、1ですね)を加えて条件判断を行っています。最初のForは、初期値は終了値を設定しているだけに過ぎません。 したがって、先ほどの例では、最初の行で、既に終了値に変数Aの値、つまり10が設定されているため、途中で変数Aの値を変化させてもループは0〜10の11回だったのです。 ちょっと、ややこしい話でしたが、For Nextのループ内でそのループ用の変数を操作することはあまりないでしょうね。昔のBASICでは必ずループを終了しないとそこから抜けられなかったので、例えば、
For i=0 to 10
{処理}
If 条件 Then
i=10
End if
Next
このように強制的に終了値を代入してループから抜けていましたが、今では、Exit Forというコマンドがありますので、随分と楽になりました。さて、次はループを2重にしてみましょう。 NS Basicで適当なボタンを貼りつけて、次のようなコードを入れてみましょう。
Dim x as Integer
Dim y as Integer
For y=0 to 159 step 10
For x=0 to 159 step 10
FillRectangle x,y,10,10,0
Delay 0.1
Next
Next
FillRectangleは、塗りつぶした四角を描画するコマンドで、
FillRectangle X,Y,Width,Height,cornerDiam.PenType
と言う書式です。画面上の(X,Y)の位置に幅Width、高さHeightの塗りつぶした四角形を描きますが、cornerDiamを0より大きく指定すると、四角形の角が丸くなり、これは、その半径を表します。また、最後のPenTypeはNsbNormal、NsbInverted、NsbGrayのいずれかを指定し、省略するとNsbNormalと見なされます。これは塗りつぶしの形状で、通常、反転、半分(灰色)という意味です。 ちなみに、外枠だけの四角形はDrawRectangleです。 Delay はプログラムに「待ち」を入れます。Delay Nという書式で N秒間の待ちを指定します。この例では 0.1秒の待ちですね。 このプログラムを実行すると、四角形が左から右に、右端まで言ったら下に移ってまた、左から右・・・と全面が黒くなるまで処理が続くのが分かると思います。 ポイントは、このプログラムに入っている2つのFor Nextで、このような構造を「入れ子(ネスト)」といいます。 プログラムを書いていくうちに、ネストが多くなってくる場合があります。If ThenやDo Loopでもそうですが、ネスト毎に文頭をそろえることで、プログラムが読みやすくなります。(このあたりは、今までのサンプルでも使ってきましたね。) |
第5回 これであなたもプログラマ「2.繰り返しの詳細」
|