【第7章】繰り返し処理(1)
2020.03.23
[一定回数同じ処理を繰り返すプログラム]
ここまでずっと順次処理ばかりやってきました。前にも言ったとおり、プログラムの最初から最後まで順番に命令を実行してゆく順次処理はコンピュータのプログラムの基本なのですが、これだけではコンピュータを使うメリットはあまり感じられません。電源が安定して供給され、故障や過熱による部品破損などがない限り疲れを知らないコンピュータらしい仕事といえば、同じ命令を何回も実行する繰り返し処理でしょう。
次のプログラムを実行してみてください。2、3行目のインデント(字下げ)はしなくても結果は変わりません。結果は図7_1.のようになります。
FOR I=1 TO 5
PRINT "HELLO. Tiny BASIC"
PRINT 3+5
NEXT I
END
図7_1.同じことをくり返した
プログラム2行目にPRINT "HELLO. Tiny BASIC"とあり、3行目にPRINT 3+5とありますから、このプログラムは"HELLO. Tiny BASIC"というストリングと、3+5の計算結果を表示することはおわかりになると思いますが、実行結果を見るとこれが1セットで5セット(5回)表示されています。なぜこうなったのでしょうか。それは1行目の FOR I=1 TO 5 と4行目の NEXT が為せる業です。
FORはこの場合、For You のForではなく、「~の間」と考えてください。 1行目は「変数 I の値が 1 から始まり 5 になるまでの間、以下を実行せよ」の意味になります。以下ってどこまで?ということになりますが、それを指示するのが4行目の NEXT です。「次」という意味ですが、NEXT ~で「次の~」ということになりますから、繰り返しはここまで、という指示と考えてください。このプログラムでは変数 I の値は繰り返しに突入する時に自動的に 1 とされ、NEXT I に来たところで、これまた自動的に +1 されます。このようにして 5 になって最後の回を実行して NEXT I に来たところで、 +1 されて 6 になります。これでFORに戻ると、すでに繰り返しの条件「 I が 5 になるまで」は満たしていますから、もう繰り返し部分には入らず、NEXT の次の行に移る、というわけです。
この FOR ~ NEXT のように、プログラムの実行順序を変えたりするステートメントのことを制御文といいます(制御文はそれ自体、入力、処理、出力などは行なわず、プログラムの動作をコントロールするだけです)。筆者が知る限り、ほとんどのプログラミング言語で、この FOR ~ NEXT に相当する繰り返し制御文がありますので、これはぜひ使えるようになってください。
図7_2.FOR~NEXTによる繰り返し処理の流れ
[FOR ~ NEXT制御文]の文法と使用上の注意
FOR 変数=初期値 TO 終端値 STEP 増分
繰り返し実行する命令
|
↓
NEXT 変数
1)FOR は必ず NEXT とペアでなくては使えません。
両方の変数は同じで、かつ数値が入るもの(数値型変数)でなくてはなりません。NEXTの後ろの変数名は省略できますが、その場合、そこから前の方にさかのぼっていちばん近い FOR とペアだとみなされます。
2)FOR 変数=初期値 TO 終端値 STEP 増分は、「変数の値が初期値から始まって増分値ずつ変化し終端値に達するまでの間」の意味になります。増分は省略できます。省略した場合は +1とみなされます。したがって、次のプログラムは図7_1.と同じ結果になります。
FOR I=38 TO 42
PRINT "HELLO. Tiny BASIC"
PRINT 3+5
NEXT I
END
初期値>終端値で増分を負の数にすることもできます。実行結果は図7_2のとおりです。
FOR I=5 TO 1 STEP -1
PRINT "発射";I;"秒前"
NEXT I
PRINT "発射!---→"
END
図7_2.増分値を負の数にした例(ロケット発射)
FOR文で使用する変数(上の例なら I )のことをループカウンタとかループ変数といいます。ループ変数は上のロケット発射プログラムのように繰り返し処理の中で使用できます。その場合、ループ変数の中味を見たり、計算式の右辺に使用するのはかまいませんが、ループ変数自体に何かを代入すると思わぬ事態になることがあります。
たとえば次のプログラムを実行するとどうなるでしょう。
FOR I=10 TO 15
PRINT "ピーターパンは";I;"歳になりました"
I=10
NEXT I
END
FOR~NEXTループに入ったところで I の値は10です。次のPRINT命令は"ピーターパンは";I;"歳になりました"となっています。 の現在の値は10ですから、ピーターパンは10歳になりました"と表示されます。3行目でループ変数である I に10を代入しているので、4行目のNEXT Iでは I の値は 11 になります。FORに戻ったところで I はまだ終端値になっていないので次はピーターパンは 11 歳になりました"と表示されます。次は 12 歳になるところですが、3行目の I=10 があるため、ここを繰り返し通る度に I は10に戻ってしまい、NEXT I まで来てもループ変数は再び 11 になります。その結果、このプログラムはピーターパンが 11 歳になったところで永遠に終わらない永久ループになります。「ピーターパンは永遠に歳をとらない男の子なんだからこれでいい」ではなくて、これはプログラムのミスでコンピュータが暴走しているのですから、プログラムを強制的に終了させなくてはなりません。「よし、バッテリーパックを外そう」、ダ、ダ、ダメですよぉ(冷汗)。稼働中のコンピュータの電源部に手を触れるなど危険きわまりない!
図7_3.永久ループしたプログラムの強制終了
実行中のプログラムを強制終了するには、実行画面上布施にある「中断」をクリックします。実行が停止し、実行画面にはOKの表示が出ます。
このようにループ変数に何かを直接代入するとプログラムの暴走につながるバグを招きかねません。そして筆者の経験で言えば、この手のバグを探すのはかなり大変です。ループ変数はその内容を使う(参照といいます)のはかまいませんがループ変数そのものの値を変えるのはやめておきしょう。
[この章のまとめ]
プログラムの全体または一部を何回も繰り返し実行することを繰り返し処理(またはループ)という。
計算や代入、表示ではなく、プログラムの動きをコントロールする分を制御文という。
Tiny BASICでは FOR ~ NEXT制御文を使うことによって繰り返し処理(ループ)が実現できる。使い方は
FOR ループ変数=初期値 TO 終端値 STEP 増分
繰り返し実行する命令
NEXT ループ変数
ループ変数の内容を繰り返し処理の中で参照するのはよいが、ループ変数そのものの値を変えるようなことは避けた方がよい。
【演習4】FOR ~ NEXT制御文を使って、1 から15までの自然数のうち、奇数( 2 で割り切れない数)を表示するプログラムを作りなさい。また 3 から15までの自然数のうち 3 の倍数を表示するプログラムはどうなるでしょう。