【第9章】繰り返し処理(2)
2020.03.28

[回数が決まっていない繰り返し]


第7~8章でやった繰り返し処理はループの回数が決まっていました(5回の例で説明しました)。これがもし回数が増えたらどうしましょうか。たとえばテストを受けた児童の人数が10人、20人・・・100人と増えたら?この場合は

FOR ループ変数=初期値 TO 終端値
の終端値を変えれば済むことです。では全国規模の模試のように受験者が何千人、何万人規模で、何人いるか試験が終わって答案を回収するまでわからないような場合はどうしたらよいでしょう。結論を先に言いますと、FOR ~ NEXT ループは不定回の繰り返し処理にはあまり向きません。では、次のプログラムを見てください。
  SEIKAI$="東京"
  ANS$=""
  WHILE ANS$<>SEIKAI$
     INPUT "日本の主都を漢字で書くと";ANS$
  WEND
  END

 まず、3行目のWHILEなんちゃらと5行目のWENDから説明します。WHILEは「~の間」という意味ですね。何となく想像つくと思いますが、これは「~である間、以下の処理を繰り返せ」という意味です。「どこまでを」を指示しているのが WEND です。このWHILE ~ WENDもFOR ~ NEXTと同じくプログラムの実行順序をコントロールする制御文です。WHILEの後ろに来るのは繰り返し実行条件です。ここで<>というのは≠の意味です(比較演算子と呼ばれるもののひとつです)。つまりこの3行目は「変数ANS$の内容が変数SEIKAI$の内容と等しくない間,以下の処理を実行せよ」という意味になります。
 Tiny BASICだけでなくほとんどのプログラミング言語では≠が使えません。多くのBASICでは<>、サーバープログラム向きのperlでは!=、昔懐かしいFORTRANでは.NE.などとなっています。


図9_1.クイズのプログラム実行結果

 このプログラムを実行すると図9_1のようになります。問題文はINPUTに続くストリングで表示されます。不正解だともう一度答えの入力に戻り、正解が出るとWENDの次に進みます。答えの入力に繰り返す回数は決まっていません。正解するまで時間無制限のデスマッチです。このプログラムではWENDの次には何もありませんから、正解が出ればこれで実行終了です。このように繰り返し回数が決まっていないループでは FOR ~ NEXT制御文より
WHILE~WEND制御文の方が適していることがわかります。

[WHILE ~ WEND 制御文の文法と使用上の注意]

WHILE文の書き方をまとめると次のようになります。
 WHILE 条件式
   繰り返して行う処理
 WEND

WHILEとWENDは必ず対になっていなくてはなりません。
WHILEの後ろに書かれる条件式は、繰り返し(ループ)に入るための条件です。繰り返し処理にWHILE ~ WEND を使う場合、繰り返しを終了する条件とは反対になります。
上の例なら、入力内容が正解でなければループに入れ(終了条件からみれば、入力内容が正解だったらループを抜けよ)ということになります。プログラミングの際に注意を要するところです。筆者はプログラム初心者だった頃、これがよくわかっていなくて1本のプログラムのデバッグで徹夜したことがあります。

[条件式と比較演算子]

 条件式は繰り返し処理の他、条件によって処理内容を選ぶ選択処理でも出てくるものですから、ここで書き方と意味をしっかり覚えましょう。条件式の書き方は

式1 比較演算子 式2

となります。式?と思われた方、プログラミングの世界では変数1個、数値1つ、ストリング1つでも式であることを思い出してください。条件式は2つの式を演算子で結んだ形で書かれます。このときに使われる演算子を比較演算子といいます。Tiny BASICで使える比較演算子は次の通りです(下の表では見やすくするためにすべて全角で書きましたが、実際にプログラム中で使うときには半角です)

図9_2.Tiny BASICで使用できる比較演算子

 = はここまでずっと代入演算子として使われてきました。代入演算子としての = は「右辺の値を左辺に代入する」でしたから、左辺は変数1つに限定されました。A=5 のような書き方はOKですが、5=Aのような書き方はだめでした。条件式としての = は数学の等号と同じ意味なので、たとえば 5+3=A といった書き方ができます。

  以下の2節(【この章のまとめ】の手前まで)は、先をお急ぎの方(とにかくプログラミングをひととおり覚えたい方)は今は飛ばしていただいてもかまいません(以後の実習には支障ありません)。お時間に余裕が出来たら戻ってきてください。

[式の値と論理値]

 今まであまり意識してきませんでしたが、プログラミング言語では式は何らかの値を持ちます。まず簡単なものから。
  5+3
このような算術式なら、この式の値は計算結果です。この例なら8です。
  A=5+3
は、右辺の式の値(8)を左辺(変数A)に代入するということです。では、たった今覚えた条件式の場合、式の値はどうなるかというと、条件が成立したときは真(true)、成立しないときは偽(false)となります。上のプログラムでは、答えに"東京"が入力されると、SEIKAI$=ANS$は真、SEIKAI$<>ANS$は偽(図9_3)となり、ループを抜けるというわけです。WHILE ~ WENDでループを作るときは「繰り返し終了条件が偽である間、以下の処理を繰り返せ」ということになるのでプログラムの書き方としては図9_4のようになります。この真(true)と偽(false)のことをboolean(ブーリアン)値または論理値といいます。


図9_3.終了条件からみた場合


図9_4.繰り返し条件からみた場合


[文字コード]

 このサンプルプログラムでは
  SEIKAI$="東京"
  ANS$=""
  WHILE ANS$<>SEIKAI$
ですから、2つのストリングが等しいか等しくないかを判定していることになります。数値ではない文字が等しいかどうか、どうやって判定するのかという話です。
 コンピュータには0と1の2進数しかわからない、という話をしましたが、これはプログラムだけでなく、データも同じです。たとえば8という数を8桁の2進数で表すと、00001000となります。記憶するときにもこの2進数で記憶されます。では文字の記憶はどうするのでしょう。文字もやはり数値に直して記憶されます。文字を数値に直したものを文字コードといいます。ストリングどうしが等しいか等しくないかを判定するのはこの文字コード(数値)が等しいか等しくないかを判定しているのです。
 何の文字をいくつにするのかは、いろいろな規格があるのですが、現在パソコンで広く使われているものはアスキーコードとよばれる規格です。アスキーコードでは半角の"A"は65(10進)、半角の"a"は97(10進)としています。図9_5は半角A~Z、a~zのアスキーコードを示したものです。この表では文字コードは10進で示してあります。


図9_5.アルファベット26文字のアスキーコード


[この章のまとめ]

不定回の繰り返し処理では、WHILE ~ WEND制御文を使う。

WHILE文の書き方は

WHILE 繰り返し実行条件


繰り返し実行条件が成立する時は繰り返し終了条件は成立しない。繰り返し終了条件が成立するときは繰り返し実行条件は成立しない。

条件式の書き方は

式1 比較演算子 式2


比較演算子としての=は代入命令ではなく、数学の等号と同じ意味を持つ。

[演習5]

 WHILE ~ WEND制御文を使って、クイズの問題を作りなさい。答えはキーボードから入力するものとします。問題文はPRINT命令で実行画面に表示/INPUT ストリングで入力窓に表示、どちらでもけっこうです。正解ではなかったら「もう一度!」と表示、正解だったら「正解です」と正解するまでにかかった回数を表示して終わるようにすること。問題が思いつかない人は下記の問題例を使ってください。( )内が正解です。
(問題例)
  ベートーヴェンの交響曲第5番は通称何と呼ばれていますか(運命)
  ポークは豚、ビーフは牛、チキンは鶏、ではターキーは(七面鳥)
  明治5年、日本で最初に開通した鉄道は東京からどこまで(横浜) 

コメント一覧
コメント投稿

名前

URL

メッセージ

- CafeNote -