プチコン3号&BIGまとめWiki

プチコン3号&BIG 非公式初心者講座 : 第5章 サンプルプログラム2

パンくずリスト

プログラマーからひとこと

このサンプルでは、いよいよ条件分岐について学びます。
あ、ついカッコつけてむずかしい言い方をしてしまいました。
このサンプルでは、いよいよIF〜THEN文について学びます。二度と条件分岐なんて言いません。

IF〜THEN文は、もうこれさえマスターしたらBASICはほとんど乗り越えたようなものです。
ちょっと言いすぎた気もしますが、それくらい大事な命令です。

それから、ずいぶんもったいぶりましたが、変数がなんの役に立つのかもこのサンプルであきらかになります。
なかなか大事なサンプルプログラムですね。
そのわりにまったく役に立つけはいのないプログラムですが。

役に立つように見えないプログラムでも、そのリストから学べることは意外にあるものです。
この講座もまた、そういうものです。
たぶん。

計算記号

ハカセ

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

ワンパクくん

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

  1. LOAD”SYS/EX2CALC”
  2. RUN
インテリくん

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

screenshot_sample2.jpg
ワンパクくん

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

ハカセ(泣)

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

インテリくん

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

神崎

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

ワンパクくん

これならスマホに入ってる電卓でいいんじゃねェかってのはおいといて……

ハカセ(泣)

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

ワンパクくん

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

インテリくん

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

ハカセ

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

神崎

じゃあ「÷」の計算に「」を使ってるのは?

インテリくん

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

ワンパクくん

へ?

インテリくん

4÷2は、分数で書くとslash.png。これをヨコに倒すように書くと……

神崎

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

ワンパクくん

お、オウ……。

ハカセ(泣)

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

ワンパクくん

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

ハカセ

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

インテリくん

なりたちはどうでもいいし、もっとも、プチコン3号では「」の記号は、あまりを出す計算には使えないから、いったん忘れよう。

ハカセ(泣)

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

省略形

インテリくん

サンプルプログラムの最初のほうはもうわかるね。

  1. ’┌────────────────┐
  2. ’│ EXAMPLE2       │
  3. ’│ けいさん COMPUTER  │
  4. ’└────────────────┘
  5. XSCREEN 0
  6. DISPLAY 0
  7. VISIBLE 1,1,1.1
  8. CLS
  9. GCLS
  10. PRINT ”┌────────────────────┐”
  11. PRINT ”│けいさん COMPUTER(ニコチャン)│”
  12. PRINT ”└────────────────────┘”
  13. PRINT ”Ж:こんにちは ニコチャン です”
  14. PRINT ”ぼくの しつもんに こたえてね”
ワンパクくん

カンタンすぎてアクビが出るぜ! 要するに画面を消してメッセージを出してるだけだな!

神崎

DISPLAYGCLSって、はじめて見る命令だけど……?

ハカセ

これも画面を消したり、上画面を使うよって指示したりしてるのじゃが……ここではそんなにダイジなものではないから、今は気にしなくていいぞい。

  1. ’−−−
  2. @LOOP
  3. PRINT
  4. COLOR 9
神崎

16〜19行も今まで出てきた命令だね。18行目でただPRINTとだけ書いてあるのが気になるけど……。

インテリくん

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

ワンパクくん

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

ハカセ

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

インテリくん

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

神崎

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

ワンパクくん

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

I NPUT命令

神崎

20行目ではじめて見る命令が出てくるね。

  1. INPUT ”Ж:1つめのすうじは”;NO1
インテリくん

INPUTという名前と、プログラムを実行した結果から、なんとなく使い方はわかるんじゃないかな?

神崎

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

ワンパクくん

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

インテリくん

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

ワンパクくん

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

インテリくん

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

神崎

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

ワンパクくん

フムフム……次のINPUTも似たようなモンで、26〜27行目でその変数をPRINTしてるワケだな……。

  1. PRINT ”(1)”;NO1;” と ”;
  2. PRINT ”(2)”;NO2;” ですね”
ハカセ

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

ワンパクくん

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

ハカセ

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

ワンパクくん

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

インテリくん

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

ワンパクくん

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

ハカセ

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

神崎

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

IF〜THEN命令

神崎

36行目も、同じようにINPUT命令だね。

  1. INPUT”Ж:きごうは(+−/%*)”;K$
インテリくん

おぼえてたかな? 変数で数字以外の字を入れるときは、後ろにがついた「文字変数」を使うんだったよね。

神崎

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

ワンパクくん

そのK$がカンケイしてるのはわかるが……39行から先はどういうイミだ?

  1. MARK=0
  2. IF K$==”+” THEN MARK=1
  3. IF K$==”−” THEN MARK=2
  4. IF K$==”/” THEN MARK=3
  5. IF K$==”%” THEN MARK=4
  6. IF K$==”*” THEN MARK=5
  7. ON MARK GOTO @SKIP,@PLUS,@MINUS,@DIV,@MOD,@MUL
神崎

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

インテリくん

40行目からは新しい命令だね。こういうのは「IF (イフ)〜THEN (ゼン) 文」と呼ばれていて、日本語にすると「もしも〜なら〜」というところかな。

ワンパクくん

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

ハカセ

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

神崎

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

ハカセ

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

ワンパクくん

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

インテリくん

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

ワンパクくん

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

ハカセ

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

ワンパクくん

イキオイで言いすぎてる気もするが、ポイントなのは本当っぽいな! それで、このアトはどうなるんだ?

ON〜GOTO命令

  1. MARK=0
  2. IF K$==”+” THEN MARK=1
  3. IF K$==”−” THEN MARK=2
  4. IF K$==”/” THEN MARK=3
  5. IF K$==”%” THEN MARK=4
  6. IF K$==”*” THEN MARK=5
  7. 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文では変数がのとき、のとき、のとき……と順にGOTOの行き先を決めているんだ。
45行目では変数MARKならラベル@SKIPへ、なら@PLUSへ……と順に飛ばしているんだね。IF〜THEN文とも少し似てるんじゃないかな?

ワンパクくん

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

インテリくん

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

ハカセ(泣)

(イ、インテリ君! そんな痛いトコロを……!)

インテリくん

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

ハカセ

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

例外処理

ハカセ

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

ワンパクくん

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

インテリくん

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

神崎

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

  1. MARK=0
  2. IF K$==”+” THEN MARK=1
  3. IF K$==”−” THEN MARK=2
  4. IF K$==”/” THEN MARK=3
  5. IF K$==”%” THEN MARK=4
  6. IF K$==”*” THEN MARK=5
  7. ON MARK GOTO @SKIP,@PLUS,@MINUS,@DIV,@MOD,@MUL
インテリくん

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

ワンパクくん

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

神崎

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

インテリくん

たとえばと打たれたら打ちまちがいだね。ホカにもAABBB、と「+−/%*」以外に打ち間違いのパターンはいくらでもあって、いちいちIF〜THEN文でチェックしきれないよね。
だから39行で最初にMARK=0と決めてしまって、40〜44行では正しい記号が打たれたときだけMARKが変わるように作ってあるんだね。

神崎

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

インテリくん

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

ワンパクくん

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

インテリくん

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

  1. ?Redo from start
ワンパクくん

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

ハカセ

ワンパク君、イガイにこだわるタイプじゃのう。まあサンプルがあんまり長くなってもナンじゃし、ここはひとつオンビンにな?

BEEP命令

  1. @SKIP
  2. BEEP 4
  3. PRINT”しらないきごうです...ゴメン”
  4. PRINT
  5. GOTO @MARK
神崎

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

インテリくん

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

ワンパクくん

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

神崎

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

ワンパクくん

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

神崎

(そういうコトか……)

ハカセ

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

インテリくん

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

ワンパクくん

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

  1. BEEP 0
  2. OK
  3. BEEP 1
  4. OK
  5. BEEP 2
  6. OK
ハカセ

ワンパク君のスイッチが入ってしまったようじゃが、画面の下にある key_smile.png SMILE(スマイル)ボタンを押すと、スマイルツールという便利なものが起動して、サウンドの一覧が表示されるのじゃ。タッチペンひとつで音の確認ができるから、そちらも見て欲しいのう。

ループ

インテリくん

あとはカンタンだね。ON〜GOTOで記号どおりに飛んで、記号どおりに計算するだけさ。たとえばこんな感じにね。

  1. @PLUS
  2. PRINT NO1;”+”;NO2;”=”;NO1+NO2
  3. GOTO @LOOP
神崎

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

ワンパクくん

PRINTの中でも計算ってできるんだな。オレはてっきり

  1. NO3=NO1+NO2
  2. PRINT NO1;”+”;NO2;”=”;NO3

みたいに書かないとヤバいのかって思ってたぜ。

インテリくん

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

神崎

そのあとは、@LOOPGOTOで戻るんだね。

ワンパクくん

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

ハカセ

STARTボタンで止めることをゼンテイに作ってあるからのう。そういうプログラムはかつてのBASICではごくフツウにあることじゃったのじゃよ。あえて終了コマンドを用意しておくのもシンシ的でいいことではあるんじゃが。

MOD 演算子

  1. @MOD
  2. PRINT NO1;”%”;NO2;”=”;NO1 MOD NO2
  3. GOTO @LOOP
神崎

そういえば、ここ、あまりの計算のはずだけど、MODって書いてあるんだね。これは新しい命令?

ワンパクくん

さっきは「」だって言ってたのに、ハナシがチガくねェか?

ハカセ

よく気づいたのう。「MOD」は命令ではなくて、「」や「」と同じ計算記号の一種じゃ。3号よりも前のプチコンでは、で割ったあまりを計算するのにA%Bと書いてた時代があったんじゃが、プチコン3号では、A MOD Bで計算するんじゃよ。

インテリくん

サンプルプログラムで、入力も表示も「」になっているのは、前に出たプチコンでのサンプルプログラムを使い回したまま、計算の部分だけを修正したからなんだよ。

ハカセ(泣)

(インテリ君……! 確かにその通りなんじゃが、今日のキミはとってもシビアなのじゃ……!)

今回のまとめ

計算記号
プログラムでは「」「」「(×)」「(÷)」、そしてで割ったあまりを「A MOD B」と書いて求める「MOD」が使えます。
省略形
たとえば「PRINT””」と書くところは「PRINT」と書くだけですませられます。
PRINT」も「」で代用できます。
INPUT命令
INPUT ”(メッセージ)”;(変数)
キーボードから入力を待って、入力された字を変数に入れます。
IF〜THEN命令
IF (条件文。A$==”A”など) THEN (命令)
条件文(この場合、変数A$の内容が”A”であること)が正しければ、命令を実行します。
ON〜GOTO命令
ON (変数) GOTO @(ラベル),@(ラベル)……
変数がのとき最初のラベルに、のとき次のラベルに……と、変数の内容によって飛び先を切りかえます。
例外処理
意味はいろいろありますが、ここではINPUT命令での入力がプログラムで必要なものと違った場合に使いました。
このサンプルではIF文をすりぬけたものを全部「例外」として処理しています。
BEEP命令
BEEP (数字)
0〜133までの種類のサウンドが鳴ります。
スマイルツール
画面の key_smile.png SMILEボタンを押すと起動します。
サウンドの確認をはじめ、いろいろな機能があります。

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 8 人がこのサイトを見ています
  • このページはこれまでに 5129 回、本日は 2 回、昨日は 6 回閲覧されました

ページの先頭に戻る

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.094 秒 | このページの最終更新 : 2016/07/11 (月) 19:27:34 (1252d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30