実みつるのPreプログラミング

プログラミングの学習を考えている方へ

4-2 途中で別の事をする

第四章 繰り返し

(2)途中で別の事をする

中距離走競技では有り得ないと思いますが、繰り返しの折り返し地点、例えば10周走る競走なら5周走り終わった時に、水分補給するというルールが有ったとします。走る事以外の行為ですが、走者は周回表示器の数字を見て「5」だったら水分補給を行うのではないでしょうか。

 

コンピューターが行う繰り返し作業でもこの様な事が可能です。前項ではコンピューターにカウンターを持たせましたが、このカウンターが「5」を示した時には別の処理を行う様にします。この場合、先ほど登場した「10」と固定表示されている表示器とは別に、「5」と表示された何かが必要になります。例えば「カウンターが5になったら○○して」といった内容が記載された看板の様な物です。

 

ところで、上で述べたような表示器や看板はどこに置かれるべきでしょうか。持っているカウンターと見比べるタイミングを考えると、スタートライン(ゴールラインと一緒)に置く必要があります。こうすれば、コンピューターはスタートラインに到達するたびに二つの表示と自分のカウンターを比較し、繰り返しを継続するのか、また何か特別な事は無いかと毎周回判断できます。

 

さて、これまで述べてきた中距離競走の内容を前章で見てきた「条件分岐」を使って図で表してみます。

 

 

この条件分岐に従えば、スタートして5周走ったら水分補給、10周走ったらゴールということが実現できます。しかし先ほど述べた通りコンピューターの場合は、持たされたカウンターの値と掲示板の値を比較します。そこでもう少しコンピューターの目線に近い図を作ってみます。COUNTERという変数(要するにカウンターです)を用意し、「5」や「10」といった数値と比較する様子を確認して下さい。

 

 

まずスタート時にCOUNTERを0にします。次に、条件分岐を2つ(値の比較)を通過し、トラックを1周します。その次の内容はわかりますか?第一章で見た「変数の中身を増やす」事をやっています。元々COUNTERには0が入っていましたが、これに1を足した値(すなわち1なのですが)を再びCOUNTERに入れています。結果としてCOUNTERの内容を1増やす事ができました。

 

ここから矢印に従い初めに戻り、順調に行けばCOUNTERの値が1ずつ増えていきます。COUNTERが5の時に水分補給、10になったらゴールして終了となります。

 

ところでCOUNTERの値を1増やした後、「COUNTER←0」という箇所よりも下に戻るようにしています。仮にSTARTの直後、すなわち「COUNTER←0」より上に戻すようにしたらどうなるでしょうか?再びCOUNTERに0が入ってしまいます。すると、また条件分岐を2つ通り、一度はCOUNTERが1になるも、また0に戻され…もうお分かりでしょうか。このままではCOUNTERが10になることは永遠に無く、ゴールする事ができません。そしてただひたすら周り続けます。

 

つまり繰り返しの制御に失敗したのです。この様に永遠に周り続けるプログラムを「無限ループ」と言います。最近ではコンピューターに限らず、様々な場面でも使われる様になった言葉ですね。

 

さて、ここで少しひねった例を考えてみます。もし水分補給のタイミングを半周した地点、つまり5周半した時点で行いたい場合はどうしたら良いでしょうか。イメージとしてはトラックのスタートラインのちょうど反対側という感じです。

 

実際の競走で実現する方法を考えます。スタートライン通過時に周回表示器の「5」を確認した選手が、その後半周走った後に水分補給すれば良いのですが、スタートラインで確認した数字を忘れてしまうという可能性は有ります。ですから半周する場所に予めテーブルを設置し、6周目を走っている選手のボトルだけ置くといった対策が必要になるかもしれません。一方、コンピューターではどうしたら良いでしょうか。

 

これは「カウンターが5になったら水分補給して」という看板を半周した地点に置けば実現できます。イメージとしては、スタートラインから半周したらカウンターが「5」なのかを確認、そこから半周して再びスタートラインに戻ってきたらカウンターが「10」なのかを確認します。以下の条件分岐を見て下さい。

 

 

「1周走る」というのが無くなり、「半周走る」が2個になりました。この様に1周走るプロセスを半分にする事で、半周した際に条件を判断する事が可能となります。当然ですが、トラックを1周走る事を10回繰り返すのと、半周を20回繰り返す結果は同じです。

 

この様に、コンピューターでは繰り返しの途中に何かを行う場合、行いを分割するというちょっとした工夫が必要になります。さて次回は途中で繰り返しを止めてしまうということを考えてみます。