【第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 の倍数を表示するプログラムはどうなるでしょう。
【第6章】誤操作を防ぐ工夫(1)
2020.03.22

さて、前章で学んだストリングやPRINT命令の様々な使い方を活用して、台形の面積を求めるプログラムを作ってみましょう。ここではオペレータの誤操作をできるだけ防ぐ工夫についてもお話します。
台形の面積は、上底をa、下底をb、高さをhとしたとき、
プログラムは次のようになりますね。
INPUT A
INPUT B
INPUT H
S=(A+B)*H/2
PRINT S
END

図6_2.実行結果
[できる限り誤操作対策をしよう]
このプログラムを実行すると図6_2のようになります。プログラム中にINPUT命令が3回でてきますから、実行すると図のような入力ボックスが3回現れます。INPUT命令が多いと、それだけ現れる入力ボックスも多くなり、オペレータがそのプログラムを作った当人なら別として、そうではないときは「今ここで何のデータを入力するのか」がわかりにくくなります。また、実行画面も何が何だかわからなくなってきます。それは誤操作を招きやすくなるということでもあります。筆者の経験で言うと、コンピュータから個人情報などが漏洩するトラブル、システム全体をダウンさせたなどの原因の半分以上は誤操作によるものです。そして「操作がわかりにくい」「画面が見づらい」は誤操作を招く最大要因です。
このプログラムを次のように改造して実行しましょう。
PRINT "台形の面積を求める"
INPUT "上底=";A
INPUT "下底=";B
INPUT "高さ=";H
S=(A+B)*H/2
PRINT "面積=";S
END
1行目ではこのプログラムが何のプログラムかを画面に表示しています。これを表示することにより、今ここで実行してよいプログラムかどうかオペレータに確認させるようにします。ここの実習ではそんな危険なプログラムは扱いませんが、実際のシステムでは、今ここで実行してはいけないプログラムを誤実行(誤操作の最も酷いもの)してシステムダウンを引き起こした、などというケースもあるからです。LINEなどのSNSでは送信相手の名前が画面上に表示されるようになっていますが、あれも誤操作・誤実行防止のためです。「今から帰る、愛してるよ、chu」と奥様に送るのを間違えて学生のグループに送信してしまったら?・・・明日からどのツラ下げて出勤するんだ!ということになります。
プログラムの始めに「何のプログラムか」を表示させるようにする、これも習慣づけておきましょう。
2行目のINPUT命令が実行されると、キーボードからの入力待ちになりますが、このとき入力ボックスと実行画面の両方に INPUT の後ろのストリングがそのまま表示されていることを確認してください(図6_3)。

図6_3.上底を入れるところ
上底の値(この例は10)と入れてOKをクリックするとプログラムは先に進み、次は3行目のINPUT命令で下底の入力待ちになります(図6_4)。

図6_4.下底を入れるところ
下底の値(この例は15)と入れてOKをクリックするとプログラムはさらに先に進み、次は4行目のINPUT命令で高さの入力待ちになります(図6_5)。

図6_5.高さを入れるところ
高さの値(この例は4)を入れてOKをクリックするとプログラムは5行目に進み、ここまでで入れた上底、下底、高さをもとに台形の面積を計算します。
そして最後に7行目で計算結果をディスプレイに表示します(図6_6)

図6_6.計算結果が表示された
このようにキーボードからの入力待ちのところで、何のデータを入れるのかを表示することで、操作がわかりやすくなり、誤操作防止になります。
尚、前章のサンプルにはありませんでしたが、INPUT命令ではストリングも扱えます。たとえば
[INPUT命令の便利な使い方]
Tiny BASICのINPUT命令は、次のような書き方ができます。
INPUT ストリング ; 変数名
ストリングと変数名の区切りには , と ; が使えます。 , の場合はストリングが表示されるだけですが(図6_7)、 ; にするとストリングの後ろに?マークが付加されます(図6_8)。

図6_7.INPUT ストリング , 変数の場合

図6_8.INPUT ストリング ; 変数の場合
[入力→処理→出力]
コンピュータに何らかのデータを入れることを入力といい、コンピュータで処理した結果をディスプレイに表示したりプリンタで印字することを出力といいます。今後は当カテゴリーでもこの言い方をすることにします。

図6_9.コンピュータのプログラムの基本は入力→処理→出力
そしてコンピュータのプログラムは、銀行のシステムのような巨大なものから、ゲームのようなホビープログラム、ここでのサンプルに出てくる小規模なものまですべて、入力→処理→出力という流れが基本になります。この章のサンプルプログラムなら、INPUT命令で上底、下底、高さを読み込む所が入力、台形の面積を計算する所が処理、計算した結果をPRINT命令で表示する所が出力です。
[この章のまとめ]
操作がわかりにくい、画面が見づらい、は誤操作を招く最大要因である
プログラム中には、誤操作・誤実行防止の対策を施しておくことがのぞましい
INPUT命令は INPUT ストリング,(または ; )変数、という使い方ができる
コンピュータに何かのデータを入れることを入力、処理した結果を表示(印字)することを出力という
コンピュータによるデータ処理の基本は入力→処理→出力という流れである
【演習3】直方体の底面積と体積を求めるプログラムを作りなさい。底面のたてとよこ、立体の高さはキーボードから入力するものとします。ただし画面の見やすさを工夫し、誤操作・誤実行対策を施すこと
【第5章】文字列を扱う(1)
2020.03.21
[ストリングとは]
ずっと堅苦しい話が続きましたので、Tiny BASICを使ってもうちょっと楽しいことをやってみましょう。

図5_1.文字を画面に表示する
ここまでずっと数値データばかり扱ってきました。変数に代入するのもPRINT命令で画面に表示するのもすべて数値のみでした。この章では画面に数値以外の文字を表示したり、文字データを扱うことを覚えましょう。まずは図5_1のように画面に文字を表示する方法です(思いっ切り筆者の趣味が入ったサンプルで申し訳ありません・・・汗)。これは、画面に何か表示するのだから PRINT命令を使うのかな、はい、そのとおりです。ではやってみましょう。プログラムはこうなるはず。では作って実行してみてください。
PRINT C62型は国鉄で最後に作られた蒸気機関車
END

図5_2.実行したらエラーになった
実行したらこうなってしまいました(図5_2)。では次のように直してください。
PRINT "C62型は国鉄で最後に作られた蒸気機関車"
END
どこが違うのかわかりますか。そうです。「C62型は」の前と「機関車」の後ろに"(ダブルクォーテーションまたは引用符とよばれる)が入っています。この" "で囲まれたものを文字列とか文字リテラル、ストリングと呼びます。当カテゴリーでは今後ストリングといいます。プログラミング言語ではストリングもまた「式」です。ストリングであることを示す引用符はTiny BASICでは"(ダブルクォーテーション)のみです。プログラミング言語によっては'(シングルクォーテーション)が使えるものもありますが、Tiny BASICでは ' は別の意味を持つのでご注意ください。引用符は始めも終わりも " です。日本語の「 」のように始め終わりの区別がありません。
最初の例がエラーとなった原因ですが、PRINT命令は続くオペランド(式)が数値、計算式、関数、ストリング以外のときはすべて変数とみなします。この場合だと「C62型~機関車」が" "で囲まれていないのでストリングではなく変数とみなされます。変数名は半角英数字という規則がありました(第2章)。なので「これは何?」ということでエラーになってしまったというわけです。
では次のようなプログラムはどういう結果になるでしょうか。考えてみてください。
PRINT 50+30
PRINT "50+30"
END
結果は図5_3のようになります。1行目のPRINT命令のオペランドの内容は 50+30 の計算結果ですが、2行目は " で囲まれているため「ご、ゼロ、たす、さん、ゼロ」というストリングとみなされていることがわかります。

図5_3. " "で囲むと計算式とはみなされない
ところで、大変細かいことなのですが、お気づきになったでしょうか。PRINT命令での表示のとき、ストリングは普通に(左詰めで)表示されますが、数値の場合は最上桁の左側に半角1文字分のスペースが空きます。これは本来正負を表す + 、 - の符合が入るところです。負の数の場合は - (マイナス)が表示されますが、正の数の場合、 + (プラス)は省略されます。トライアルコード(3和音)では、マイナーコードを表す小文字のmは書かれるけれど、メジャーコードを表す大文字のMは普通は省略されるというのと似ています(筆者の本業は・・・ええい、しつこい!)

図5_4.メジャーコード(左)とマイナーコード(右)
「変数にストリングを代入する」
次のプログラムを実行すると、図5_5のようになります。「誰か」の部分はご自分の名前でも好きな人の名前でもなんでもけっこうです。
A$="誰か"
B$="さん、こんにちは"
C$=A$+B$
PRINT C$
END

図5_5.実行結果
プログラム1、2行目の代入文を見てください。ストリングはこのように変数に代入することもできます。ストリングを入れる変数は変数名の後ろに半角の $ (ダラー、またはドルマーク)を付けます。
3行目ですが「えっ?文字と文字のたし算って?」と思われた方もいらっしゃると思います。これはたし算ではなく、ストリングの連結です。このサンプルの場合、A$に入っているストリングの後ろに変数B$に入っているストリングが連結されそれが変数C$に代入されます。
「PRINT命令の使い方いろいろ」
今度は少し長く面倒ですが、次のプログラムを実行してみましょう。 ; (セミコロン)と , (カンマ)を入れ間違えないように気をつけてください。
A$="誰か"
B$="さん、こんにちは"
D$=DATE$
PRINT A$;B$,"今日は";D$;"です"
PRINT "今日もお仕事がんばってください"
END
3行目に出てきたDATE$は、画面に美少女が現れてデートしてくれる・・・わけではなく(冷汗)、今日の日付です(現在のパソコンは、筆者の知る限りすべての機種で内部にカレンダー・時計機能を持っています)。DATE$はコンピュータが管理している日付を引っ張り出してくる(多くのプログラミング言語のマニュアルでは「与える」という言い方をします)関数です。Windows10+Tiny BASICの場合、日付は西暦4桁/月2桁/日2桁になります。DATE$は $ が付いているので想像つくと思いますが、日付をストリングで与えますから、3行目のように $ の付いた変数に代入して使うことが可能です。
このプログラムを実行するとこのようになります。PRINT命令は続くオペランドの中に式(表示するもの)が複数入っていてもよいのですが、その区切りを ; にすると続けて表示、 , にすると少し間隔を空けて表示します。またオペランドが全くないPRINTだけだと改行のみ行ないます。1行空けるときなどに使います。

図5_5.実行結果
[この章のまとめ]
画面に文字を表示するには表示したい文字を " で囲む
" "で囲まれたものを文字列、文字リテラル、ストリングという
変数名に $ を付けた変数にはストリングが代入できる
PRINT命令で数値を表示すると最上桁の左に正負の符合が入る半角1つのスペースが空く
PRINT命令で複数の式を表示させるとき、区切りを ; にすると続けて表示、 , にすると少し間隔を空けての表示となる。オペランドが何もないと改行のみ行なう
DATE$はコンピュータが管理している日付をストリングで与える関数である
2020.03.23 13:22
|
