このサンプルでは、いよいよ条件分岐について学びます。
あ、ついカッコつけてむずかしい言い方をしてしまいました。
このサンプルでは、いよいよIF~THEN文について学びます。二度と条件分岐なんて言いません。
IF~THEN文は、もうこれさえマスターしたらBASICはほとんど乗り越えたようなものです。
ちょっと言いすぎた気もしますが、それくらい大事な命令です。
それから、ずいぶんもったいぶりましたが、変数がなんの役に立つのかもこのサンプルであきらかになります。
なかなか大事なサンプルプログラムですね。
そのわりにまったく役に立つけはいのないプログラムですが。
役に立つように見えないプログラムでも、そのリストから学べることは意外にあるものです。
この講座もまた、そういうものです。
たぶん。
やあショクン、いかしたサンプルプログラムを持ってきたぞい。
上の方では役にたたねえプログラムとか書いてあるけどな、まあやってみるぜ!
- LOAD”SYS/EX2CALC”
- RUN
これを読んでいるPCなどの前のみんなも、サンプルをRUNしてためしてみよう!
なんてこった、ビックリするほどおもしろくねえ!
ずいぶんストレートじゃな……
カンタンに言えば、計算機のプログラムになるのかな? 数字(1)と数字(2)を入力して、それを足すか引くか……ひととおりの計算ができるんだね。
+−×÷のいわゆる「四則演算」と、割り算の「あまり」を出すことができるね。
これならスマホに入ってる電卓でいいんじゃねェかってのはおいといて……
ワンパク君、ワシはそんなつめたいキミを見たくはなかったぞ……
「+」と「−」以外の計算に使う記号がヘンなんだよな。なんで「×」の計算するのに記号が「*」なんだ?
プログラムの世界では、たいてい×記号のかわりに*記号を使うね。
何十年も前のコンピュータには×記号がなかったので、しかたなく*記号で代用したと言われておるな。今でもそのままというのはヘンな気もするが、まあタンジュンな言いかえじゃよ。
じゃあ「÷」の計算に「/」を使ってるのは?
「/」だね。まず割り算が、分数で表わせるのは知ってるだろう。
へ?
4÷2は、分数で書くと。これをヨコに倒すように書くと……
なるほど、「4/2」になるわけだ!
お、オウ……。
ワンパク君……それは小学校中学年でもわかるはずじゃぞ。
オ、オレをそんな目で見るんじゃねェー! じゃあ割り算のあまりを出すのが「%」ってのはなんなんだコノヤロー! パーセントってのはそういうモンじゃねェだろ!
むむむ。これは例によってコンピューター界のお約束としか言えんのう。なぜか「7%3」と書くと「7を3で割ったあまりを出す」という意味になるのじゃ。ワシもくわしくは知らんが、タンジュンに「%」の記号があまっていたから、なんて話もあってキョウミぶかいところじゃ。
なりたちはどうでもいいし、もっとも、プチコン3号では「%」の記号は、あまりを出す計算には使えないから、いったん忘れよう。
インテリ君もけっこうバッサリくるのう……
サンプルプログラムの最初のほうはもうわかるね。
- ’┌────────────────┐
- ’│ EXAMPLE2 │
- ’│ けいさん COMPUTER │
- ’└────────────────┘
- XSCREEN 0
- DISPLAY 0
- VISIBLE 1,1,1.1
- CLS
- GCLS
- PRINT ”┌────────────────────┐”
- PRINT ”│けいさん COMPUTER(ニコチャン)│”
- PRINT ”└────────────────────┘”
- PRINT ”Ж:こんにちは ニコチャン です”
- PRINT ”ぼくの しつもんに こたえてね”
カンタンすぎてアクビが出るぜ! 要するに画面を消してメッセージを出してるだけだな!
DISPLAYやGCLSって、はじめて見る命令だけど……?
これも画面を消したり、上画面を使うよって指示したりしてるのじゃが……ここではそんなにダイジなものではないから、今は気にしなくていいぞい。
- ’−−−
- @LOOP
- PRINT
- COLOR 9
16~19行も今まで出てきた命令だね。18行目でただPRINTとだけ書いてあるのが気になるけど……。
これは1行あけてるのさ。PRINT命令の後には自動的に次の行にいくからね。ちょっとした省略かな。
まあPRINT””なんてイチイチ書くのもメンドくせェしな。
省略できるところはスグ省略する、というのは良くも悪くもプログラマーというもののクセじゃろうな。プログラムが見やすくなることもあれば、ナニしとるのかわからなくなることもある。ショクンには「見やすい省略」のほうをココロガケてほしいのう。
REMが’になるのも一種の省略形だね。実はPRINTも「?」と書いて省略できるんだよ。
あっ、本当だ。?”AAA”と書いただけでAAAって表示されたよ!
これもなんでPRINTが「?」になるんだって、聞いてもしかたねェんだろうな……。
20行目ではじめて見る命令が出てくるね。
- INPUT ”Ж:1つめのすうじは”;NO1
INPUTという名前と、プログラムを実行した結果から、なんとなく使い方はわかるんじゃないかな?
「入力する」という意味だし、キーボードから入力してもらうトキに使うんだよね。
……INPUTのアトに「”」でかこった文字を表示して、で、セミコロンもまあわかるゼ。そのアトにくる「NO1」ってナンだ?
これは変数だね。名前はなんでもよかったんだけど、1つ目の数字だからNO1というところかな。INPUT命令では、こうやって最後にセミコロンでつないで変数をきめておくんだ。
ワカんねえのはソコだぜ! ココで変数が出るのはなぜだ?
INPUT命令で使う変数には、キー入力された文字が入ることになっているよ。
この20行目でいえば、プレイヤーが打った「1つ目の数字」が変数NO1に入るんだね。
フムフム……次のINPUTも似たようなモンで、26~27行目でその変数をPRINTしてるワケだな……。
- PRINT ”(1)”;NO1;” と ”;
- PRINT ”(2)”;NO2;” ですね”
さようワンパク君、変数のダイジさがワカッてきたのではないかな?
ん? 変数なんてメンドクセェから、チョクセツ数字で書きゃいいじゃねえかって話か? そりゃコレだって数字で……オ?
……わ、わからねエぞ! なんてこった! どんな数字が入力されるのか、オレには読めねえ!
その通りじゃ。ジッサイにプレイヤーがキーを打つまで、プログラマーにはそのナカミはわからぬ。そこで変数というバケツを用意しておいて、とにかく中に何か数字が入っていると想像してプログラムするのじゃよ。
そういうコトだったのか! たしかに……コイツは変数じゃねえとハナシにもならねえ……。
INPUT命令にかぎらず、プレイヤーに入力をまかせる時や、プログラムの進行によって変化する時なんかは、変数を「ナカミは予想できないけど、中に何か入っているモノ」として使うね。
これが変数……オレの中でナニか大きなムーブメントがおきた気がするゼ! これが初期衝動ってヤツか!
それはどうか知らんが、ワカッてくれてワシもうれしいぞ。寝ないでサンプルプログラムを書いたカイがあったわい。
(本当に何の仕事をしている人なんだろう……)
36行目も、同じようにINPUT命令だね。
- INPUT”Ж:きごうは(+−/%*)”;K$
おぼえてたかな? 変数で数字以外の字を入れるときは、後ろに$がついた「文字変数」を使うんだったよね。
ここで入力してもらった記号を文字変数K$に入れるわけだね。
そのK$がカンケイしてるのはわかるが……39行から先はどういうイミだ?
- MARK=0
- IF K$==”+” THEN MARK=1
- IF K$==”−” THEN MARK=2
- IF K$==”/” THEN MARK=3
- IF K$==”%” THEN MARK=4
- IF K$==”*” THEN MARK=5
- ON MARK GOTO @SKIP,@PLUS,@MINUS,@DIV,@MOD,@MUL
39行目はいちおうフツウに変数かな。変数MARKに0を入れて……
40行目からは新しい命令だね。こういうのは「IF (イフ)~THEN (ゼン) 文」と呼ばれていて、日本語にすると「もしも~なら~」というところかな。
「もしもK$==”+”ならMARK=1」ってコトか。MARK=1はワカるぜ。フツーの変数だからな。だがK$==”+”ってナンだ? 「==」ってオカシイだろコンチクショー!
これまたプログラムの世界だけのヤクソクごとじゃな。まあイコールが1コの「=」は変数のために使ってしまったので、別の記号として2コつないだ「==」を使った、というのがそもそものなりたちと言われておる。
つまり、もともと「==」はイコール記号だった……?
ジッサイに、ワシの若いころBASICではこういう時はIF K$=”+” THENと書いたものじゃよ。「==」は新しめのヒョウゲンじゃな。
イロイロ聞きずてならねェな! ==が……変数に入れるイコールじゃなくて、オレたちのよく知ってる方のイコール記号だってことは、……ああヤヤコシイぜ……。
ツマリ、「K$==”+”」てのは「K$と”+”は同じもの」ってイミかよ?
ミゴトにたどりついたじゃないか、ワンパク君! 「もしもK$のナカミが”+”なら、MARK=1」というのが40行目のイミなんだよ。
うまくユウドウされた気もするが、ワルい気はしねェな。
このIF~THEN文、プログラムではダイジじゃぞい。どのキーが押されたか、敵にタマが当たったかどうか、アイテムを持っているか。すべてIF~THENで調べると言ってもいいじゃろう!
イキオイで言いすぎてる気もするが、ポイントなのは本当っぽいな! それで、このアトはどうなるんだ?
- MARK=0
- IF K$==”+” THEN MARK=1
- IF K$==”−” THEN MARK=2
- IF K$==”/” THEN MARK=3
- IF K$==”%” THEN MARK=4
- IF K$==”*” THEN MARK=5
- ON MARK GOTO @SKIP,@PLUS,@MINUS,@DIV,@MOD,@MUL
39~44行まではもうわかってるね。
変数K$に入った文字によって、変数MARKの数字を変えているんだね。
ワカんねーのは45行だぜ! またしても新しいメイレイかよ!
よく見ると、それほど新しくもないんじゃないかな? 最初のONはともかく、MARKは変数の名前だし、GOTO @~の形はよくおぼえてるよね。
にしても「ON」って言われてもよォ。電源でもオンにすんのか?
このON~GOTO文では、「~しだいで~に行け」という意味になるかな。45行目で言いかえると、「変数MARKしだいで、@SKIP、@PLUS、~、@MULへ行け」となるね。
変数しだいで……。もしかして、39~44行でMARKの数を順に並べたのと関係ある!?
そう、ON~GOTO文では変数が0のとき、1のとき、2のとき……と順にGOTOの行き先を決めているんだ。
45行目では変数MARKが0ならラベル@SKIPへ、1なら@PLUSへ……と順に飛ばしているんだね。IF~THEN文とも少し似てるんじゃないかな?
フーム……このタメだけに変数を0から順にふるってのはまだるっこしくて気にくわねェが……
そうだね。本当はこのプログラムでわざわざON~GOTOを使う必要はないんだ。
(イ、インテリ君! そんな痛いトコロを……!)
でもON~GOTOにはもっとプログラムの知識がふえていくと、ベンリな使い道が出てくるからね。今のうちにおぼえておいてソンはないさ。
(ム……この男、テキかミカタか……ユダンならぬヤツじゃぞい……)
ゴホン、ON~GOTO文でそれぞれの飛び先でやるコトはだいたいソウゾウできるじゃろう。
イチバンわかりづれェのは、MARKがゼロだったトキだな。
まずMARKがゼロになるのはどういう時か? そこを考えればわかりやすいね。
ええと、40行~44行のどれにも当たらなかった時だけ、39行で決めたゼロのままで45行のON~GOTO文にたどりつくんだね。
- MARK=0
- IF K$==”+” THEN MARK=1
- IF K$==”−” THEN MARK=2
- IF K$==”/” THEN MARK=3
- IF K$==”%” THEN MARK=4
- IF K$==”*” THEN MARK=5
- ON MARK GOTO @SKIP,@PLUS,@MINUS,@DIV,@MOD,@MUL
それは言いかえると、K$が+−/%*のどれでもなかったということだね。
ん? K$には「Ж:きごうは(+−/%*)?」と聞かれて入力した字が入ってるハズだろ……なのにどれでもないってコトは……
そうか! 打ちまちがいってコトだね! そのときだけMARKがゼロになって、@SKIPまで飛ばされるんだ。
たとえばAと打たれたら打ちまちがいだね。ホカにもBやC、AA、BBB、と「+−/%*」以外に打ち間違いのパターンはいくらでもあって、いちいちIF~THEN文でチェックしきれないよね。
だから39行で最初にMARK=0と決めてしまって、40~44行では正しい記号が打たれたときだけMARKが変わるように作ってあるんだね。
そしてMARKがゼロのまま変わらなければ、正しい記号が打たれていないとハッキリ言いきれるわけだ。
そういうこと。プログラム用語では「例外処理」というんだ。
ムズかしいコトバはいいけどよォ、そうなるとこのプログラムで最初に数字を聞いたトキの例外処理はどうなってんだ? 数字以外を入れることだってあるよな!
たとえば20行だね。INPUT文で変数が文字変数じゃないから、数字以外が入力されるとエラーが自動で出るよ。
- ?Redo from start
チッ、また英語かよ! BASICの自動にマカせるってのがそもそも気にくわねェが……
ワンパク君、イガイにこだわるタイプじゃのう。まあサンプルがあんまり長くなってもナンじゃし、ここはひとつオンビンにな?
- @SKIP
- BEEP 4
- PRINT”しらないきごうです...ゴメン”
- PRINT
- GOTO @MARK
そしてこれが例外処理で飛んできた@SKIPだね。
エラーメッセージをPRINTして、@MARKに飛んで入力をやり直すのはもうわかるね。49行のBEEP 4が新しい命令かな。
たしかに見たことのねェ命令だが、オレにはだいたいワカッたぜ! コレは音を出す命令だな!
(ワンパク君が英語に反応できた!?)
ジッサイにプログラム動かして、例外処理に飛ぶよう「W」って入力してやったからな!
(そういうコトか……)
プログラムの動きから、命令のイミを見つけ出す……それもジョウタツのひとつの方法じゃな。そればかりだとこの講座がいらなくなってしまうので、ひかえめにオネガイしたいところじゃが。
BEEP命令は、文字どおり「ビーッという音を鳴らす」命令だね。BEEPの後の数字は、ゼロから133まであってそれぞれ違ったサウンドが鳴るようになっているよ。
パンクスピリットがヨビサマされるゼ! 4以外の番号はどんな音なんだ?
- BEEP 0
- OK
- BEEP 1
- OK
- BEEP 2
- OK
ワンパク君のスイッチが入ってしまったようじゃが、画面の下にある SMILE(スマイル)ボタンを押すと、スマイルツールという便利なものが起動して、サウンドの一覧が表示されるのじゃ。タッチペンひとつで音の確認ができるから、そちらも見て欲しいのう。
あとはカンタンだね。ON~GOTOで記号どおりに飛んで、記号どおりに計算するだけさ。たとえばこんな感じにね。
- @PLUS
- PRINT NO1;”+”;NO2;”=”;NO1+NO2
- GOTO @LOOP
55行はいくつも変数と文字があって見づらいけど、たし算の結果を書いているんだね。
PRINTの中でも計算ってできるんだな。オレはてっきり
- NO3=NO1+NO2
- PRINT NO1;”+”;NO2;”=”;NO3
みたいに書かないとヤバいのかって思ってたぜ。
イガイに変数は自由に書けるものさ。ワンパク君の書きかたでもマチガイじゃないけど、スッキリしているのはこっちと言えるかな。
そのあとは、@LOOPにGOTOで戻るんだね。
そういえばこのプログラム、計算が終わったらまたやり直すんだな。コレ、無限ループになるんじゃねェか?
STARTボタンで止めることをゼンテイに作ってあるからのう。そういうプログラムはかつてのBASICではごくフツウにあることじゃったのじゃよ。あえて終了コマンドを用意しておくのもシンシ的でいいことではあるんじゃが。
- @MOD
- PRINT NO1;”%”;NO2;”=”;NO1 MOD NO2
- GOTO @LOOP
そういえば、ここ、あまりの計算のはずだけど、MODって書いてあるんだね。これは新しい命令?
さっきは「%」だって言ってたのに、ハナシがチガくねェか?
よく気づいたのう。「MOD」は命令ではなくて、「+」や「−」と同じ計算記号の一種じゃ。3号よりも前のプチコンでは、AをBで割ったあまりを計算するのにA%Bと書いてた時代があったんじゃが、プチコン3号では、A MOD Bで計算するんじゃよ。
サンプルプログラムで、入力も表示も「%」になっているのは、前に出たプチコンでのサンプルプログラムを使い回したまま、計算の部分だけを修正したからなんだよ。
(インテリ君……! 確かにその通りなんじゃが、今日のキミはとってもシビアなのじゃ……!)
表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.465 秒 | このページの最終更新 : 2022/09/20 (火) 12:49:19 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30