サンプルプログラム2
このサンプルでは、いよいよ条件分岐について学びます。
あ、むずかしい言い方をすることはないですね。
このサンプルでは、いよいよIF~THEN文について学びます。二度と条件分岐なんて言いません。
IF~THEN文は、もうこれさえマスターしたらBASICはほとんど乗り越えたようなものです。
ちょっと言いすぎた気もしますが、それくらい大事な命令です。
それから、ずいぶんもったいぶりましたが、変数がなんの役に立つのかもこのサンプルであきらかになります。
なかなか大事なサンプルプログラムですね。
そのわりにまったく役に立つけはいのないプログラムですが。
役に立つように見えないプログラムでも、そのリストから学べることは意外にあるものです。
この講座もまた、そういうものです。
たぶん。

やあショクン、いかしたサンプルプログラムを持ってきたぞい。

上の方では役にたたねえプログラムとか書いてあるけどな、まあやってみるぜ!
LOAD”SAMPLE2”
RUN

これを読んでいるPCなどの前のみんなも、サンプルをRUNしてためしてみよう!

なんてこった、ビックリするほどおもしろくねえ!

ずいぶんストレートじゃな……

カンタンに言えば、計算機のプログラムになるのかな? 数字(1)と数字(2)を入力して、それを足すか引くか……ひととおりの計算ができるんだね。

+-×÷のいわゆる「四則演算」と、割り算の「あまり」を出すことができるね。

これならケータイに入ってる電卓でいいんじゃねェかってのはおいといて……

ワンパク君、ワシはそんなつめたいキミを見たくはなかったぞ……

「+」と「-」以外の計算に使う記号がヘンなんだよな。なんで「×」が「*」なんだ?

プログラムの世界では、たいてい×記号のかわりに*記号を使うね。

何十年も前のコンピュータには×記号がなかったので、しかたなく*記号で代用したと言われておるな。今でもそのままというのはヘンな気もするが、まあタンジュンな言いかえじゃよ。

じゃあ「÷」がちがうのは?

「/」だね。まず割り算が、分数で表わせるのは知ってるだろう。

へ?

4÷2は、分数で書くと

。これをヨコに倒すように書くと……

なるほど、「4/2」になるわけだ!

お、オウ……。

ワンパク君……それは小学校中学年でもわかるはずじゃぞ。

オ、オレをそんな目で見るんじゃねェー! じゃあ割り算のあまりを出すのが「%」ってのはなんなんだコノヤロー! パーセントってのはそういうモンじゃねェだろ!

むむむ。これは例によってコンピューター界のお約束としか言えんのう。なぜか「7%3」と書くと「7を3で割ったあまり」ということになるのじゃよ。ワシもくわしくは知らんが、タンジュンに「%」の記号があまっていたから、なんて話もあってキョウミぶかいところじゃ。

なりたちはどうでもいいけど、BASICの計算でもこの記号は使うからおぼえておいてソンはないんじゃないかな。

インテリ君もけっこうバッサリくるのう……

サンプルプログラムの最初のほうはもうわかるね。
0001#. ’┌─────────────────┐
0002#. ’│SAMPLE2 │
0003#. ’│ モシ゛ニュウリョクト フ゛ンキ │
0004#. ’└─────────────────┘
0005#. VISIBLE 1,1,0,0,0,0
0006#. CLS:COLOR 0
0007#. PRINT”┌────────────────────┐”
0008#. PRINT”│ケイサンCOMPUTER(ニコチャンЖ)│”
0009#. PRINT”└────────────────────┘”
0010#. PRINT”Ж:コンニチハ ニコチャンテ゛ス”
0011#. PRINT”Ж:ホ゛クノシツモンニ コタエテネ”

カンタンすぎてアクビが出るぜ! 要するに画面を消してメッセージを出してるだけだな!
0012#. ’---
0013#. @LOOP
0014#. PRINT
0015#. COLOR 9

12~15行も今まで出てきた命令だね。14行目でただPRINTとだけ書いてあるのが気になるけど……。

これは1行あけてるのさ。PRINT命令の後には自動的に次の行にいくからね。ちょっとした省略かな。

まあPRINT””なんてイチイチ書くのもメンドくせェしな。

省略できるところはスグ省略する、というのは良くも悪くもプログラマーというもののクセじゃろうな。プログラムが見やすくなることもあれば、ナニしとるのかわからなくなることもある。ショクンには「見やすい省略」のほうをココロガケてほしいのう。

REMが’になるのも一種の省略形だね。実はPRINTも?と書いて省略できるんだよ。

あっ、本当だ。?”AAA”と書いただけでAAAって表示されたよ!

これもなんでPRINTが「?」になるんだって、聞いてもしかたねェんだろうな……。

16行目ではじめて見る命令が出てくるね。
0016#. INPUT”Ж:1ツメノ スウシ゛ハ”;NO1
INPUTという名前と、プログラムを実行した結果から、なんとなく使い方はわかるんじゃないかな?

「入力する」という意味だし、キーボードから入力してもらうトキに使うんだよね。

……INPUTのアトに「”」でかこった文字を表示して、で、セミコロンもまあわかるゼ。そのアトにくる「NO1」ってナンだ?

これは変数だね。名前はなんでもよかったんだけど、1つ目の数字だからNO1というところかな。INPUT命令では、こうやって最後にセミコロンでつないで変数をきめておくんだ。

ワカんねえのはソコだぜ! ココで変数が出るのはなぜだ?

INPUT命令で使う変数には、キー入力された文字が入ることになっているよ。

この16行目でいえば、プレイヤーが打った「1つ目の数字」が変数NO1に入るんだね。

フムフム……次の
INPUTも似たようなモンで、22~23行目でその変数を
PRINTしてるワケだな……。
0022#. PRINT”Ж:(1)”;NO1;”ト”;
0023#. PRINT”(2)”;NO2;”テ゛スネ”

さようワンパク君、変数のダイジさがワカッてきたのではないかな?

ん? 変数じゃなくチョクセツ数字で書きゃいいじゃねえかって話か? そりゃコレだってチョクセツ……オ?
……わ、わからねエぞ! なんてこった! どんな数字が入力されるのか、オレには読めねえ!

その通りじゃ。ジッサイにプレイヤーがキーを打つまで、プログラマーにはそのナカミはわからぬ。そこで変数というバケツを用意しておいて、とにかく中に何か数字が入っていると想像してプログラムするのじゃよ。

そういうコトだったのか! たしかに……コイツは変数じゃねえとハナシにもならねえ……。

INPUT命令にかぎらず、プレイヤーに入力をまかせる時や、プログラムの進行によって変化する時なんかは、変数を「ナカミは予想できないけど、中にナニか入っているモノ」として使うね。

これが変数……オレの中でナニか大きなムーブメントがおきた気がするゼ! これが初期衝動ってヤツか!

それはどうか知らんが、ワカッてくれてワシもうれしいぞ。寝ないでサンプルプログラムを書いたカイがあったわい。

(本当に何の仕事をしている人なんだろう……)

31行目も、同じように
INPUT命令だね。
0031#. INPUT”Ж:キコ゛ウハ(+-/%*)”;K$
おぼえてたかな? 変数で数字以外の字を入れるときは、後ろに
$がついた「文字変数」を使うんだったよね。

ここで入力してもらった記号を文字変数K$に入れるわけだね。

そのK$がカンケイしてるのはわかるが……34行から先はどういうイミだ?
0034#. MARK=0
0035#. IF K$==”+” THEN MARK=1
0036#. IF K$==”-” THEN MARK=2
0037#. IF K$==”/” THEN MARK=3
0038#. IF K$==”%” THEN MARK=4
0039#. IF K$==”*” THEN MARK=5
0040#. ON MARK GOTO @SKIP,@PLUS,@MINUS,@DIV,@MOD,@MUL

34行目はいちおうフツウに変数かな。変数MARKに0を入れて……

35行目からは新しい命令だね。こういうのは「IF~THEN文」と呼ばれていて、日本語にすると「もしも~なら~」というところかな。

「もしもK$==”+”ならMARK=1」ってコトか。MARK=1はワカるぜ。フツーの変数だからな。だがK$==”+”ってナンだ? 「==」ってオカシイだろコンチクショー!

これまたプログラムの世界だけのヤクソクごとじゃな。まあイコールが1コの「=」は変数のために使ってしまったので、別の記号として2コつないだ「==」を使った、というのがそもそものなりたちと言われておる。

つまり、もともと「==」はイコール記号だった……?

ジッサイに、ワシの若いころBASICではこういう時はIF K$=”+” THENと書いたものじゃよ。「==」は新しめのヒョウゲンじゃな。

イロイロ聞きずてならねェな! ==が……ああヤヤコシイぜ……変数に入れるイコールじゃなくて、オレたちのよく知ってる方のイコール記号だってことは、じゃあ「K$==”+”」てのは「K$と”+”は同じもの」ってイミかよ?

ミゴトにたどりついたじゃないか、ワンパク君! 「もしもK$のナカミが”+”なら、MARK=1」というのが35行目のイミなんだよ。

うまくユウドウされた気もするが、ワルい気はしねェな。

このIF~THEN文、プログラムではダイジじゃぞい。どのキーが押されたか、敵にタマが当たったかどうか、アイテムを持っているか。すべてIF~THENで調べると言ってもいいじゃろう!

イキオイで言いすぎてる気もするが、ポイントなのは本当っぽいな! それで、このアトはどうなるんだ?
0034#. MARK=0
0035#. IF K$==”+” THEN MARK=1
0036#. IF K$==”-” THEN MARK=2
0037#. IF K$==”/” THEN MARK=3
0038#. IF K$==”%” THEN MARK=4
0039#. IF K$==”*” THEN MARK=5
0040#. ON MARK GOTO @SKIP,@PLUS,@MINUS,@DIV,@MOD,@MUL

34~39行まではもうわかってるね。

変数K$に入った文字によって、変数MARKの数字を変えているんだね。

ワカんねーのは40行だぜ! またしても新しいメイレイかよ!

よく見ると、それほど新しくもないんじゃないかな? 最初のONはともかく、MARKは変数の名前だし、GOTO @~の形はよくおぼえてるよね。

にしても「ON」って言われてもよォ。電源でもオンにすんのか?

このON~GOTO文では、「~しだいで~に行け」という意味になるかな。40行目で言いかえると、「変数MARKしだいで、@SKIP、@PLUS、~、@MULへ行け」となるね。

変数しだいで……。もしかして、34~39行でMARKの数を順に並べたのと関係ある!?

そう、ON~GOTO文では変数が0のとき、1のとき、2のとき……と順にGOTOの行き先を決めているんだ。
40行目では変数MARKが0ならラベル@SKIPへ、1なら@PLUSへ……と順に飛ばしているんだね。IF~THEN文とも少し似てるんじゃないかな?

フーム……このタメだけに変数を0から順にふるってのはまだるっこしくて気にくわねェが……

そうだね。本当はこのプログラムでわざわざON~GOTOを使う必要はないんだ。

(イ、インテリ君! なぜそれを……!)

でもON~GOTOにはもっとプログラムの知識がふえていくと、ベンリな使い道が出てくるからね。今のうちにおぼえておいてソンはないさ。

(ム……この男、テキかミカタか……ユダンならぬヤツじゃぞい……)

ゴホン、ON~GOTO文でそれぞれの飛び先でやるコトはだいたいソウゾウできるじゃろう。

イチバンわかりづれェのは、MARKがゼロだったトキだな。

まずMARKがゼロになるのはどういう時か? そこを考えればわかりやすいね。

ええと、35行~39行のどれにも当たらなかった時だけ、34行で決めたゼロのままで40行のON~GOTO文にたどりつくんだね。

それは言いかえると、K$が+-/%*のどれでもなかったということだね。

ん? K$には「Ж:キコ゛ウハ(+-/%*)?」と聞かれて入力した字が入ってるハズだろ……なのにどれでもないってコトは……

そうか! 打ちまちがいってコトだね! そのときだけMARKがゼロになって、@SKIPまで飛ばされるんだ。

たとえばAと打たれた時は打ちまちがいになるけど、ホカにもBやC、AA、BBB、と「+-/%*」以外に入力されるパターンはいくらでもあって、いちいちIF~THEN文でチェックしきれないよね。
だから34行で最初にMARK=0と決めてしまって、35~39行では正しい記号が打たれたときだけMARKが変わるように作ってあるんだね。

そしてMARKがゼロのまま変わらなければ、正しい記号が打たれていないとハッキリ言いきれるわけだ。

そういうこと。プログラム用語では「例外処理」というんだ。

ムズかしいコトバはいいけどよォ、そうなるとこのプログラムで最初に数字を聞いたトキの例外処理はどうなってんだ? 数字以外を入れることだってあるよな!

たとえば16行だね。INPUT文で変数が文字変数じゃないから、数字以外が入力されるとエラーが自動で出るよ。
?Redo from start

チッ、また英語かよ! BASICの自動にマカせるってのがそもそも気にくわねェが……

ワンパク君、イガイにこだわるタイプじゃのう。まあサンプルがあんまり長くなってもナンじゃし、ここはひとつオンビンにな?
0042#. @SKIP
0043#. BEEP 4
0044#. PRINT”Ё:シラナイキコ゛ウテ゛ス・・コ゛メン”
0045#. PRINT
0046#. GOTO @MARK

そしてこれが例外処理で飛んできた@SKIPだね。

エラーメッセージをPRINTして、@MARKに飛んで入力をやり直すのはもうわかるね。43行のBEEP 4が新しい命令かな。

たしかに見たことのねェ命令だが、オレにはだいたいワカッたぜ! コレは音を出す命令だな!

(ワンパク君が英語に反応できた!?)

ジッサイにプログラム動かして、例外処理に飛ぶよう「W」って入力してやったからな!

(そういうコトか……)

プログラムの動きから、命令のイミを見つけ出す……それもジョウタツのひとつの方法じゃな。そればかりだとこの講座がいらなくなってしまうので、ひかえめにオネガイしたいところじゃが。

BEEP命令は、文字どおり「ビーッという音を鳴らす」命令だね。BEEPの後の数字は、ゼロから69まであってそれぞれ違ったサウンドが鳴るようになっているよ。

パンクスピリットがヨビサマされるゼ! 4以外の番号はどんな音なんだ?
BEEP 0
OK
BEEP 1
OK
BEEP 2
OK

あとはカンタンだね。ON~GOTOで記号どおりに飛んで、記号どおりに計算するだけさ。たとえばこんな感じにね。
0048#. @PLUS
0049#. PRINT NO1;”+”;NO2;”=”;NO1+NO2
0050#. GOTO @LOOP

49行はいくつも変数と文字があって見づらいけど、たし算の結果を書いているんだね。

PRINTの中でも計算ってできるんだな。オレはてっきり
0049#. NO3=NO1+NO2
0050#. PRINT NO1;”+”;NO2;”=”;NO3
みたいに書かないとヤバいのかって思ってたぜ。

イガイに変数は自由に書けるものさ。ワンパク君の書きかたでもマチガイじゃないけど、スッキリしているのはこっちと言えるかな。

そのあとは、@LOOPにGOTOで戻るんだね。

そういえばこのプログラム、計算が終わったらまたやり直すんだな。コレ、無限ループになるんじゃねェか?

SELECTボタンで止めることをゼンテイに作ってあるからのう。そういうプログラムはかつてのBASICではごくフツウにあることじゃったのじゃよ。あえて終了コマンドを用意しておくのもシンシ的でいいことではあるんじゃが。
- 計算記号
- プログラムでは「+」「-」「*(×)」「/(÷)」、そしてAをBで割ったあまりを「A%B」と書いて出す「%」が使えます。
- 省略形
- たとえば「PRINT””」と書くところは「PRINT」と書くだけですませられます。
「PRINT」も「?」で代用できます。
- INPUT命令
- INPUT ”(メッセージ)”;(変数)
キーボードから入力を待って、入力された字を変数に入れます。
- IF~THEN命令
- IF (条件文。A$==”A”など) THEN (命令)
条件文(この場合、変数A$の内容がAであること)が正しければ、命令を実行します。
- ON~GOTO命令
- ON (変数) GOTO @(ラベル),@(ラベル)……
変数が0のとき最初のラベルに、1のとき次のラベルに……と、変数の内容によって飛び先を切りかえます。
- 例外処理
- 意味はいろいろありますが、ここではユーザーの入力がプログラムで必要なものと違った場合に使いました。
このサンプルではIF文をすりぬけたものを全部「例外」として処理しています。
- BEEP命令
- BEEP (数字)
0~69までのサウンドが鳴ります。