[回数が決まっていない繰り返し]
第7~8章でやった繰り返し処理はループの回数が決まっていました(5回の例で説明しました)。これがもし回数が増えたらどうしましょうか。たとえばテストを受けた児童の人数が10人、20人・・・100人と増えたら?この場合は
FOR ループ変数=初期値 TO 終端値
の終端値を変えれば済むことです。では全国規模の模試のように受験者が何千人、何万人規模で、答案を回収するまで実際に受験した人数か試験が終わってわからないような場合はどうしたらよいでしょう。結論を先に言いますと、FOR ~ NEXT ループは不定回の繰り返し処理にはあまり向きません。では、図9-1のようなクイズのプログラムで、ある条件を満たしている間、繰り返し処理を行なう方法を考えてみます。
図9-1.不定回繰り返し
図9-1の流れに従って作ったプログラムは図9-2のようになります。
SEIKAI=1
ANS=0
WHILE ANS<>SEIKAI
PRINT "幻想即興曲、子犬のワルツで知られる作曲家といえば?"
PRINT "1. ショパン 2.ショクパン"
INPUT "番号で応えてください",ANS
WEND
END
図9-2.クイズのプログラム
まず、3行目のWHILEなんちゃらと5行目のWENDから説明します。WHILEは「~の間」という意味ですね。何となく想像つくと思いますが、これは「~である間、以下の処理を繰り返せ」という意味です。「どこまでを」を指示しているのが WEND です。このWHILE ~ WENDもFOR ~ NEXTと同じくプログラムの実行順序をコントロールする制御文です。WHILEとWENDで囲まれた部分をWHILEブロックといいます。WHILEの後ろに来るのは繰り返し実行条件です。ここで<>というのは≠の意味です(比較演算子と呼ばれるもののひとつです)。つまりこの3行目は「変数ANS$の内容が変数SEIKAI$の内容と等しくない間,以下の処理を実行せよ」という意味になります。
Tiny BASICだけでなくほとんどのプログラミング言語では≠が使えません。多くのBASICでは<>(または><)、サーバープログラム向きのperlでは!=、昔懐かしいFORTRANでは.NE.などとなっています。
図9-3.クイズのプログラム実行結果
このプログラムを実行すると図9-3のようになります。問題文はWHILEブロック内のPRINTで表示、解答入力は同じくWHILEブロック内のINPUTで行ないます。これにより正解を答えられるまで問題文の表示と解答入力に戻り、正解が出るとWENDの次に進みます。答えの入力に繰り返す回数は決まっていません。正解するまで回数無制限のデスマッチです。このプログラムではWENDの次には何もありませんから、正解が出ればこれで実行終了です。このように繰り返し回数が決まっていないループでは FOR ~ NEXT制御文よりWHILE~WEND制御文の方が適していることがわかります。
[WHILE ~ WEND 制御文]
WHILE文の書き方をまとめると次のようになります。
WHILE 条件式
繰り返して行う処理
WEND
1)WHILEとWENDは必ず対になっていなくてはなりません。
2)WHILEブロックはプログラム中にいくつあってもかまいません。
3)WHILEブロックの中にWHILEブロックを包括することができます(ネスティング)。
WHILEブロックのネスティングを使うと、データの誤入力(誤ったデータを入力すること)防止を施すことができます(この後の章でやります)。
[繰り返し条件]
WHILEの後ろに書かれる条件式は、繰り返し(ループ)に入るための条件です。繰り返し処理にWHILE ~ WEND を使う場合、繰り返しを終了する条件とは反対になります。
図9-2のプログラム例なら、入力内容が正解でなければループに入れ(終了条件からみれば、入力内容が正解だったらループを抜けよ)ということになります。プログラミングの際に注意を要するところです。筆者はプログラム初心者だった頃、これがよくわかっていなくて1本のプログラムのデバッグで徹夜したことがあります。
[条件式と比較演算子・論理演算子]
条件式は繰り返し処理の他、条件によって処理内容を選ぶ選択処理でも出てくるものですから、ここで書き方と意味をしっかり覚えましょう。条件式の書き方は
式1 比較演算子 式2
となります。式?と思われた方、プログラミングの世界では変数1個、数値1つ、ストリング1つでも式であることを思い出してください。条件式は2つの式を演算子で結んだ形で書かれます。このときに使われる演算子を比較演算子といいます。Tiny BASICで使える比較演算子は次の通りです(下の表では見やすくするためにすべて全角で書きましたが、実際にプログラム中で使うときには半角です)
図9-4.Tiny BASICで使用できる比較演算子
= はここまでずっと代入演算子として使われてきました。代入演算子としての = は「右辺の値を左辺に代入する」でしたから、左辺は変数1つに限定されました。A=5 のような書き方はOKですが、5=Aのような書き方はだめでした。条件式としての = は数学の等号と同じ意味なので、たとえば 5+3=A といった書き方ができます。
このサンプルプログラムには出てきませんが、条件式を書くのにもうひとつ覚えておきたいのは論理演算子です。
図9-5.Tiny BASICで使用できる論理演算子
論理演算子はこの他にもいろいろあるのですが、図9-5の3つはぜひ使えるようにしておきたいというものです。論理演算子の優先順位は、NOT、AND、ORです。ただし( )内が優先されます。
IF A=B AND (C=D OR NOT E=F) THEN
処理
END IF
これは
E=Fが成立しない、またはC=Dが成立し、かつA=Bが成立するとき以下の処理を行なう
ということになります。
[この章のまとめ]
不定回の繰り返し処理では、WHILE ~ WEND制御文を使う。
WHILE文の書き方は
WHILE 繰り返し実行条件
繰り返し実行条件が成立する時は繰り返し終了条件は成立しない。繰り返し終了条件が成立するときは繰り返し実行条件は成立しない。
条件式の書き方は
式1 比較演算子 式2
条件式1 論理演算子 条件式2
比較演算子としての=は代入命令ではなく、数学の等号と同じ意味を持つ。
【演習5】
WHILE ~ WEND制御文を使って、クイズの問題を作りなさい。答えはキーボードから番号で入力するものとします。問題文はPRINT命令で実行画面に表示/INPUT ストリングで入力窓に表示、どちらでもけっこうです。正解だったら「正解です」というメッセージと正解するまでにかかった回数を表示して終わるようにすること。問題が思いつかない人は下記の問題例を使ってください。( )内が正解です。
(問題例)
ベートーヴェンの交響曲第5番は何と呼ばれていますか(1.英雄 2.運命 3.田園、正解は2)
ポークは豚、ビーフは牛、チキンは鶏、ではターキーは(1.羊 2.アヒル 3.七面鳥、正解は3)
明治5年、日本で最初に開通した鉄道は東京からどこまで(1.横浜 2.京都 3.大阪、正解は1)