【第10章】平均を求めるプログラム(2)選択処理
2020.03.30
 不定回の繰り返し処理のやり方はおわかりいただけたでしょうか。この章ではさらに「条件によって処理内容を変える」という方法を学びます。コンピュータの最もコンピュータらしい部分で、これができるゆえに、筆者が小学生だった昭和40年頃は、コンピュータは「人工頭脳」と呼ばれたりしたものでした。今でも中国語では「電脳」といい、日本でも電脳少女など、ホビーの世界ではこの言い方が使われてますね。
 話を本題に戻します。回数が決まってないとはいえ、データの件数が
無限ということはそうそうあることではありません。テストの平均点を求めるプログラムなら受験者の点数すべて入力し終わったらループは終了で、平均の計算に移ります。では、何人受験したかわからない学力テストの平均点を求めるプログラムで「ここでデータ入力終わり」ということをどうやってプログラムに知らせたらよいでしょう。これにはいくつかの方法がありますが、よく使われる方法は、「あり得ないデータ」が入ってきたところでループから抜けるというものです。たとえば


1)テストの点数は0点~100点の範囲である
2)点数に999が入力されたらデータ入力のループを抜ける
3)児童の出席番号(または受験番号)は1、2、3、・・・、Nとなっていて欠番はないものとする。


という前提で、不定回数の繰り返し処理によるテストの平均を求めるアルゴリズムを考えてみます。基本的な流れは次のようになります。



図10_1.受験者人数が一定でない学力テストの平均点を求める

 上の図で、入力された点数が(たとえば)75のときと999のときでは処理の流れがどう変わるかを辿ってみてください。このアルゴリズムをTiny BASICでコーディング(プログラミング言語を使って実際にプログラムを作成すること)すると次のようになります。

    1: PRINT "***テストの平均点***"
    2: GOKEI=0
    3: NINZU=0
    4: BANGO=0
    5: TENSU=-1
    6: WHILE TENSU<>999
    7:   BANGO=BANGO+1
    8:   PRINT BANGO;"番";
    9:   INPUT "点数(999=END)",TENSU
   10:   IF TENSU<>999 THEN
   11:     GOKEI=GOKEI+TENSU
   12:     NINZU=NINZU+1
   13:   END IF
   14: WEND
   15: HEIKIN=GOKEI/NINZU
   16: PRINT "平均点は";HEIKIN
   17: END
 1~3行目はもう説明不要ですね。
 4行目の変数BANGOは出席番号です。え?これ、NINZUを使えばいいんじゃない?と思われる方もいると思いますが、それはあまり感心しません。今ここでは番号の欠番はないものとしていますが、たとえば学校の場合、転校などによっていなくなった児童がいたりします。筆者の知る限りではこういうときその児童の出席番号は欠番となります(学年が変わってクラス替えがない限り1つずつ出席番号が前へずれるということはありません)。塾・予備校などの学力テストなら受験申し込みはしたものの受験はしなかったという児童・生徒がいるかもしれません。そういうとき、データ件数の値と出席番号(受験番号)の値が一致しなくなることは容易に想像がつきます。そのようなことにも対処できるようなプログラムにするにはデータ件数と出席番号は別々の変数にした方が後でプログラムの修正が楽になります。
 実際プロのプログラマが作ったプログラムを拝見すると後から機能の追加の要求がきたり、処理内容の一部に変更があってプログラムを修正(メンテナンス)する必要が出てきたときのことを想定して書かれていることがうかがえます。
 5行目はループに入るために、その条件となる変数TENSUに「得点の範囲外でループ終了条件とも違う値」を代入しています。WHILEの後ろの条件はループ実行条件であることを思い出してください。
 7~9行目、これで点数入力のループに入ったのですから出席番号を +1 して、点数入力です。
 10行目がこの章の主役、IF文です。ここでは「変数TENSUの値が999でないときはTHEN以下の処理をせよ」ということになります。どこまでかを示すのが13行目にあるEND IFです(詳細は次節で)。
 繰り返し処理はここまでなので14行目にはWENDがあり、6行目のループ実行判定に戻ります。もし今、入力した内容がループ終了条件の999だったら、11~12行目の処理は行なわずに6行目に戻ってくることになります。ここでTENSUの値は999ですから、ループ実行条件は成立せず(ループ終了条件が成立し)、15行目以下に飛びます。平均を計算し、表示してプログラムは終わります。


[IF ~ END IF制御文]

 このプログラム中に IF~END IFというのが出てきます。勘の良い方なら「ん?この構文は?FOR ~ NEXTやWHILE ~ WENDのように条件によってプログラムの実行順序を変える制御文かな?」と思ったことでしょう。その通りです。ただ、IF ~ END IFは繰り返し処理というより、条件によって処理内容が変わる選択処理に向いている制御文です。プログラミング言語によっては判断・分岐命令と呼ばれることもあります。IF ~ END IF制御文の使い方の基本はこうなります。
  IF 条件式 THEN
    条件式が成立したときに実行される命令
  ELSE
    条件式が成立しなかったときに実行される命令
  END IF
ここで、条件が成立しなかった時に行なう処理が何もなければ、ELSE以下、END IFの手前までは省略できます(上のサンプルプログラムがそうです)。
さらに条件を細かく分けたいときには、このような使い方もできます。
  IF 条件式1 THEN
    条件式1が成立したときに実行される命令
  ELSEIF 条件式2 THEN
    条件式1が成立しないが、条件式2は成立したときに実行される命令
  ELSE
    条件式1も条件式2も成立しなかったときに実行される命令
  END IF

 これは少々わかりにくいと思いますので、実例でみてみましょう。次のプログラムでは入力された値が1か2か、それ以外かによって、処理の内容が変わっています。
    PRINT "サービスデーのご案内"
    INPUT "お客様の性別は 1.男性 2.女性",SEI
    IF SEI=1 THEN
      PRINT "毎週火曜日は男性のお客様は¥1000で食べ放題"
    ELSEIF SEI=2 THEN
         PRINT "毎週木曜日は女性のお客様は¥1000で食べ放題"
    ELSE
    PRINT "毎週水曜日は¥1000で食べ放題"
    END IF
    PRINT
    PRINT "焼肉 〇〇"
    END
入力内容が1か2か、それ以外かで処理の流れがどのようになるか(この例では画面に表示される内容)、考えてみてください。実行結果は次のようになります。


条件によって処理内容が選択される

 こんな焼肉屋さんがあったら、火・水曜日はいつもここで夕食ですなぁ(^ ^;

[この章のまとめ]

条件によって処理内容が変わる処理を選択処理という。

Tiny BASICでは選択処理に向いている制御文はIF ~ END IF制御文である。基本的な書き方は

  IF 条件式 THEN
    条件式が成立したときの処理内容
  END IF

である。さらに条件を細かく分けたいときは
  IF 条件式1 THEN
    条件式1が成立したときの処理内容
  ELSEIF 条件式2 THEN
    条件式1は成立しないが、条件式2が成立したときの処理内容
  END IF

【演習6】ユーザー認証のプログラムを作ってみましょう。登録ユーザーは2人で、登録した名前で認証するものとします(ここでは変数で入れておくことにしておきます)。ユーザー名を入力し、登録ユーザー名のどちらかと一致すれば「〇〇(登録ユーザー名)さん、こんにちは」どちらとも一致しなければ「認証できませんでした」と表示するようにすること。このプログラムはいろいろな方法があるのですが、習熟のため、IF制御文を使うようにしましょう。

富山地方鉄道市内軌道線南北直通開始
2020.03.29

 2020年3月21日より、富山地方鉄道市内軌道線南北直通運転が開始された。これに伴い、富山ライトレールと富山地方鉄道が合併したため、富山~岩瀬浜間は何十年の時を経て、富山地鉄に帰ってきた。富山駅~岩瀬浜は富山港線の名称も復活した。



左:富山駅市内軌道線ホーム(南側) 右:富山駅市内軌道線ホーム(北側)



 南北直通で運転系統が大きく変わったのは岩瀬浜発の電車はすべて富山市中心部(南富山駅前、グランドプラザ前、富山大学前)に乗り入れること。富山ライトレール時代の富山駅北どまりがなくなった。



左:環状線を走るTLR0600形(ポートラム) 右:岩瀬浜駅まで乗り入れるT100形
 

 また合併の際、(旧)富山ライトレールのTLR0600形電車はすべて地鉄が引き継いだ(7色の塗色とPORTRAMのロゴはそのまま)のと、地鉄のデ9000形、T100形は富山港線にも入るので、富山駅でポートラムの電車が来たから岩瀬浜行きだと思って乗ったら、富山大学前に連れて行かれた、という乗り間違いに注意を要する。そのせいかどうか、直通開始から1週間経った今も富山駅の市内軌道線のりばには案内係が数名配置されている。
尚、旧来からあるデ7000形とデ8000形は富山港線には乗り入れない。



左:デ7000形 右:デ8000形


 春休み中最後の日曜日、この5系統(岩瀬浜~富山大学前)を始発から終点まで乗り通してみた。岩瀬浜発11:46、富山港線内は単線のため、途中、荻浦小学校前(旧大広田)、城川原、淡島、奥田中学校前に交換設備がある。乗り入れ電車の本数が増えたためか、以前は平日日中、休日は城川原と奥中前でしか交換がなかったのが、今回、荻浦小前でも交換があった。乗った電車はT100形(通称サントラム)だった。この電車は今まで南富山~富山駅~大学前でしか乗ったことも見たこともなかった。この区間は全線併用軌道なのでスビードは出しても30km/hくらい、のんびりのんびり走るチンチン電車という感じだったのが富山港線(ほとんどが鉄道線)ではガチで走る。いやはや、こんなスピードが出る車両だったのか!



↑画像をクリックすると動画で見られます


 富山大学前(旧大学前)着11:23、岩瀬浜からの所要時間は約40分。子供やお年寄りは全区間乗るなら、乗車前にトイレは済ませておいた方がいいかもしれない。
 ちょっと研究室に寄って、今度は富山大学前から丸の内まで乗車、ここで環状線廻りの岩瀬浜行きに乗車、岩瀬浜まで、乗った電車はTLR0600形、残念ながら赤ではなかった。富山ライトレールが開業した当時、沿線の高校の女子生徒の間で「赤ポートラムに乗れた日に告白すると両想いになれる」というのがあった。学校によりいろいろなバリエーションがあったようだ。今日は6系統の運用に赤ポートラムが入っているのは、来るときに確認しているが、まぁ、今さら両想いになりたい相手などいないので、来た電車に乗った。

 ところで、この6系統は岩瀬浜~富山駅~環状線~富山駅~岩瀬浜という運転である。環状線は丸の内からはグランドプラザ前~荒町~富山駅という一方向しか走らない。するとこの電車は再び富山港線に入るとき編成が逆になる?(鉄道に詳しくない方のために解説すると、鉄道は車両の編成が本来と逆の列車を走らせると信号など安全運転の設備が正しく作動しなくなるか破損してしまう)。まさか鉄道線の中をATS切って走るの?おっかねぇ~。もしかして電鉄富山駅エスタ前出てすぐのところに今でも残っている旧線(上図赤で示した区間)を使って方向変換するの?結果、富山駅から先、逆向きのまま岩瀬浜まで走りました。終点に着いて、運転士さんにきいてみたところ、「逆向きでも問題なく走れるように出来ている」とのことでした。よく考えるとTLR0600、デ9000は見た目が2両編成(T100だと3両編成)に見えますが、あれは1両の電車が真ん中でグニャグニャ動く構造なだけで、正確には単行なんですね。そりゃ、信号機から見れば1両の電車が行ったり来たりするだけなわけだ。と納得したところで帰路につきました(車は岩瀬浜駅のパークアンドライド駐車場に停めていました)。



 
【第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年、日本で最初に開通した鉄道は東京からどこまで(横浜) 

【第8章】平均を求めるプログラム(1)
2020.03.25
 前章で覚えた FOR ~ NEXT制御文を使うと、入力したデータの平均を求めるプログラムができます。この章からしばらくの間、テストの成績処理プログラム(学校のテストにはいい思い出がない方、少しの間がまんしてください)で合計、平均の求め方、ある条件により処理内容が変わる選択処理(次章以後)、変数の再利用以外のもっと高度なデータ再利用の方法を学びます。
 いよいよコンピュータならではのプログラミングに入ります。少しだけお楽しみに(^ ^;


[平均を求めるアルゴリズム]

アルゴリズムとは、問題解決の手順です。コンピュータのプログラムの世界では、主として計算、代入、条件判断をどのように組み合わせ、どのように繰り返せば目的の仕事ができるか、ということになります。前章までのサンプル程度のプログラムならパソコンの前に座ってチャッチャと作れますが、もう少し長い(規模の大きい)プログラムになると、最初にアルゴリズムを考えてから作り出さないと後で出来上がったプログラムを見直した時、作った本人でさえ何が何だかわからない、グチャグチャなプログラム(プロのプログラマが「スパゲッティプログラム」と呼んでいるヤツです)になってしまいます。ということでここから後はサンプルプログラムをお見せする前に、どのように考えてこのプログラムになったか、というアルゴリズムを示してゆくことにします。

 5人の児童のテストの点数が次のようになっているとします。
   75、80、60、35、95
 この平均点を求めます。この程度の計算なら皆さんなら5つの数字をながめて暗算で 69 点とわかると思います。ところがコンピュータに、5つの数字を見せて「平均は?」と言ってもわからないのです。コンピュータでいくつかの数の平均を求めるなら、1つ1つのデータを加算し、データ件数を数え、全部のデータを加算し終わったら、その値を数えたデータ件数で割る、という何とものんびりとした作業を行うことになります。



図8_1.5人の児童のテストの平均を求めるアルゴリズム

 このアルゴリズムをコンピュータで実現するのがコンピュータのプログラムであり、Tiny BASIC for Windowsはそのためのツールのひとつということになります。ではサンプルプログラムです。サンプルプログラムの各行に行番号が付いていますが、これは説明用のためのもので、実際にプログラムを作るときには省略してください。以後サンプルプログラムが10行以上になるときにはこのようにします。
  1: PRINT "テストの平均点"
  2: GOKEI=0
  3: NINZU=0
  4: FOR I=1 TO 5
  5: PRINT I;"番";
  6: INPUT "点数",TENSU
  7: GOKEI=GOKEI+TENSU
  8: NINZU=NINZU+1
  9: NEXT I
 10: HEIKIN=GOKEI/NINZU
 11: PRINT "平均点は";HEIKIN
 12: END

ここでは第2章でやった代入演算子が活躍します(忘れてしまった方は第2章図2_3をもう一度見てください)。
 まず、5~8行目(ループの中)を見てください。
 5行目は「これから入力するのは何番目のデータか」ということを表示しています。誤操作(誤入力)防止のためのものだす。
 6行目でキーボードから点数を入力し、変数TENSUに代入します。
 7行目は今入力した点数を、変数GOKEIに加算しています。
 8行目では入力した件数をカウントしています(この場合、テストを受けた人数)
 7、8行目の代入演算子=の使い方に着目してください。思い出しましたか。代入演算子の意味は「右辺の値を左辺に代入する」命令でしたね。
 この4行は点数の入力がすべて終わるまで繰り返しますから、4、9行目の FOR ~ NEXTで、(今回は)5回繰り返すようにしています。
 では、その他の箇所を見てみましょう。 
 1行目は「何のプログラムか」を表示しています。これはもちろん、誤操作(誤実行)防止策です。
 2行目、3行目はそれぞれ点数の合計、データ件数をカウントする変数ですが、これは処理に先立ち、0にしておく必要があります。なぜかというと、Tiny BASIC for Windowsを始め、多くのBASICではプログラム実行スタート時にすべての数値変数は0、ストリング変数は""(Null、何も入っていない)にリセットされるのですが、プログラミング言語はすべてそうなっているとは限りません。最初にクリアしておかないと何が入っているかわからないという言語もあります。筆者が30年ほど前に使っていたFORTRAN、COBOLなどではそうでした。また今日では、Visual BASICなどのように、最初に使用宣言をしていない変数は使えない、というプログラミング言語もあります。
 合計や平均を求めるプログラムでは、データの合計、データ数カウントのための変数は、最初に0にしておく(ゼロクリア)することを習慣にしましょう。


図8_2.実行中(3番目のデータの入力待ち)

 図8_2はこのプログラムの実行中です。入力窓は省略します。実行画面には、これから何番目のデータを入れるのかが表示されています。該当データを入れると何番目という表示(INPUT命令の直前のPRINT命令で表示した内容)が消えてしまいますが、これはTiny BASIC for Windowsの仕様なのでどうにもなりません。今後のバージョンアップで改善されることを期待しています。

図8_3.実行結果(平均が計算され表示された)

 データをすべて入力すると平均が計算され表示されてプログラムを終わります(図8_3)

【この章のまとめ】

問題解決の手順のことをアルゴリズムという。

代入演算子=とFOR ~ NEXTループを組み合わせると、入力したデータの合計や平均を求めるプログラムができる。

データを加算する(合計)やデータ件数を数えるための変数は、ループに入る前にゼロクリアしておく

【第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 の倍数を表示するプログラムはどうなるでしょう。
 

- CafeNote -