第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.繰り返しの詳細」