サンプルプログラム2
プログラマーからひとこと
このサンプルでは、いよいよ条件分岐について学びます。あ、ついカッコつけてむずかしい言い方をしてしまいました。
このサンプルでは、いよいよIF~THEN文について学びます。二度と条件分岐なんて言いません。
IF~THEN文は、もうこれさえマスターしたらBASICはほとんど乗り越えたようなものです。
ちょっと言いすぎた気もしますが、それくらい大事な命令です。
それから、ずいぶんもったいぶりましたが、変数がなんの役に立つのかもこのサンプルであきらかになります。
なかなか大事なサンプルプログラムですね。
そのわりにまったく役に立つけはいのないプログラムですが。
役に立つように見えないプログラムでも、そのリストから学べることは意外にあるものです。
この講座もまた、そういうものです。
たぶん。
計算記号
ハカセ「やあショクン、いかしたサンプルプログラムを持ってきたぞい。」
ワンパク「上の方では役にたたねえプログラムとか書いてあるけどな、まあやってみるぜ!」
LOAD”SAMPLE2”
RUN
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”Ж:ホ゛クノシツモンニ コタエテネ”
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
0013#. @LOOP
0014#. PRINT
0015#. COLOR 9
神崎「12~15行も今まで出てきた命令だね。14行目でただPRINTとだけ書いてあるのが気になるけど……。」
インテリ「これは1行あけてるのさ。PRINT命令の後には自動的に次の行にいくからね。ちょっとした省略かな。」
ワンパク「まあPRINT””なんてイチイチ書くのもメンドくせェしな。」
ハカセ「省略できるところはスグ省略する、というのは良くも悪くもプログラマーというもののクセじゃろうな。プログラムが見やすくなることもあれば、ナニしとるのかわからなくなることもある。ショクンには「見やすい省略」のほうをココロガケてほしいのう。」
インテリ「REMが’になるのも一種の省略形だね。実はPRINTも「?」と書いて省略できるんだよ。」
神崎「あっ、本当だ。?”AAA”と書いただけでAAAって表示されたよ!」
ワンパク「これもなんでPRINTが「?」になるんだって、聞いてもしかたねェんだろうな……。」
INPUT命令
インテリ「16行目ではじめて見る命令が出てくるね。
INPUT という名前と、プログラムを実行した結果から、なんとなく使い方はわかるんじゃないかな?
」
0016#. INPUT”Ж:1ツメノ スウシ゛ハ”;NO1
」
神崎「「入力する」という意味だし、キーボードから入力してもらうトキに使うんだよね。」
ワンパク「……INPUTのアトに「”」でかこった文字を表示して、で、セミコロンもまあわかるゼ。そのアトにくる「NO1」ってナンだ?」
インテリ「これは変数だね。名前はなんでもよかったんだけど、1つ目の数字だからNO1というところかな。INPUT命令では、こうやって最後にセミコロンでつないで変数をきめておくんだ。」
ワンパク「ワカんねえのはソコだぜ! ココで変数が出るのはなぜだ?」
インテリ「INPUT命令で使う変数には、キー入力された文字が入ることになっているよ。」
神崎「この16行目でいえば、プレイヤーが打った「1つ目の数字」が変数NO1に入るんだね。」
ワンパク「フムフム……次のINPUTも似たようなモンで、22~23行目でその変数をPRINTしてるワケだな……。
0022#. PRINT”Ж:(1)”;NO1;”ト”;
0023#. PRINT”(2)”;NO2;”テ゛スネ”
」0023#. PRINT”(2)”;NO2;”テ゛スネ”
ハカセ「さようワンパク君、変数のダイジさがワカッてきたのではないかな?」
ワンパク「ん? 変数なんてメンドクセェから、チョクセツ数字で書きゃいいじゃねえかって話か? そりゃコレだって数字で……オ?
……わ、わからねエぞ! なんてこった! どんな数字が入力されるのか、オレには読めねえ!」
……わ、わからねエぞ! なんてこった! どんな数字が入力されるのか、オレには読めねえ!」
ハカセ「その通りじゃ。ジッサイにプレイヤーがキーを打つまで、プログラマーにはそのナカミはわからぬ。そこで変数というバケツを用意しておいて、とにかく中に何か数字が入っていると想像してプログラムするのじゃよ。」
ワンパク「そういうコトだったのか! たしかに……コイツは変数じゃねえとハナシにもならねえ……。」
インテリ「INPUT命令にかぎらず、プレイヤーに入力をまかせる時や、プログラムの進行によって変化する時なんかは、変数を「ナカミは予想できないけど、中に何か入っているモノ」として使うね。」
ワンパク「これが変数……オレの中でナニか大きなムーブメントがおきた気がするゼ! これが初期衝動ってヤツか!」
ハカセ「それはどうか知らんが、ワカッてくれてワシもうれしいぞ。寝ないでサンプルプログラムを書いたカイがあったわい。」
神崎「(本当に何の仕事をしている人なんだろう……)」
IF~THEN命令
インテリ「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
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$==”+”」てのは「K$と”+”は同じもの」ってイミかよ?」
インテリ「ミゴトにたどりついたじゃないか、ワンパク君! 「もしもK$のナカミが”+”なら、MARK=1」というのが35行目のイミなんだよ。」
ワンパク「うまくユウドウされた気もするが、ワルい気はしねェな。」
ハカセ「このIF~THEN文、プログラムではダイジじゃぞい。どのキーが押されたか、敵にタマが当たったかどうか、アイテムを持っているか。すべてIF~THENで調べると言ってもいいじゃろう!」
ワンパク「イキオイで言いすぎてる気もするが、ポイントなのは本当っぽいな! それで、このアトはどうなるんだ?」
ON~GOTO命令
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
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文とも少し似てるんじゃないかな?」
40行目では変数MARKが0ならラベル@SKIPへ、1なら@PLUSへ……と順に飛ばしているんだね。IF~THEN文とも少し似てるんじゃないかな?」
ワンパク「フーム……このタメだけに変数を0から順にふるってのはまだるっこしくて気にくわねェが……」
インテリ「そうだね。本当はこのプログラムでわざわざON~GOTOを使う必要はないんだ。」
ハカセ「(イ、インテリ君! そんな痛いトコロを……!)」
インテリ「でもON~GOTOにはもっとプログラムの知識がふえていくと、ベンリな使い道が出てくるからね。今のうちにおぼえておいてソンはないさ。」
ハカセ「(ム……この男、テキかミカタか……ユダンならぬヤツじゃぞい……)」
例外処理
ハカセ「ゴホン、ON~GOTO文でそれぞれの飛び先でやるコトはだいたいソウゾウできるじゃろう。」
ワンパク「イチバンわかりづれェのは、MARKがゼロだったトキだな。」
インテリ「まずMARKがゼロになるのはどういう時か? そこを考えればわかりやすいね。」
神崎「ええと、35行~39行のどれにも当たらなかった時だけ、34行で決めたゼロのままで40行のON~GOTO文にたどりつくんだね。
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
」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
インテリ「それは言いかえると、K$が+-/%*のどれでもなかったということだね。」
ワンパク「ん? K$には「Ж:キコ゛ウハ(+-/%*)?」と聞かれて入力した字が入ってるハズだろ……なのにどれでもないってコトは……」
神崎「そうか! 打ちまちがいってコトだね! そのときだけMARKがゼロになって、@SKIPまで飛ばされるんだ。」
インテリ「たとえばAと打たれたら打ちまちがいだね。ホカにもBやC、AA、BBB、と「+-/%*」以外に打ち間違いのパターンはいくらでもあって、いちいちIF~THEN文でチェックしきれないよね。
だから34行で最初にMARK=0と決めてしまって、35~39行では正しい記号が打たれたときだけMARKが変わるように作ってあるんだね。」
だから34行で最初にMARK=0と決めてしまって、35~39行では正しい記号が打たれたときだけMARKが変わるように作ってあるんだね。」
神崎「そしてMARKがゼロのまま変わらなければ、正しい記号が打たれていないとハッキリ言いきれるわけだ。」
インテリ「そういうこと。プログラム用語では「例外処理 」というんだ。」
ワンパク「ムズかしいコトバはいいけどよォ、そうなるとこのプログラムで最初に数字を聞いたトキの例外処理はどうなってんだ? 数字以外を入れることだってあるよな!」
インテリ「たとえば16行だね。INPUT文で変数が文字変数じゃないから、数字以外が入力されるとエラーが自動で出るよ。」
?Redo from start
ワンパク「チッ、また英語かよ! BASICの自動にマカせるってのがそもそも気にくわねェが……」
ハカセ「ワンパク君、イガイにこだわるタイプじゃのう。まあサンプルがあんまり長くなってもナンじゃし、ここはひとつオンビンにな?」
BEEP命令
0042#. @SKIP
0043#. BEEP 4
0044#. PRINT”Ё:シラナイキコ゛ウテ゛ス・・コ゛メン”
0045#. PRINT
0046#. GOTO @MARK
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
OK
BEEP 1
OK
BEEP 2
OK
ループ
インテリ「あとはカンタンだね。ON~GOTOで記号どおりに飛んで、記号どおりに計算するだけさ。たとえばこんな感じにね。」
0048#. @PLUS
0049#. PRINT NO1;”+”;NO2;”=”;NO1+NO2
0050#. GOTO @LOOP
0049#. PRINT NO1;”+”;NO2;”=”;NO1+NO2
0050#. GOTO @LOOP
神崎「49行はいくつも変数と文字があって見づらいけど、たし算の結果を書いているんだね。」
ワンパク「PRINTの中でも計算ってできるんだな。オレはてっきり
」
0049#. NO3=NO1+NO2
0050#. PRINT NO1;”+”;NO2;”=”;NO3
みたいに書かないとヤバいのかって思ってたぜ。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までのサウンドが鳴ります。