富山城址付近散策
2021.03.15
 
今日は代休なので、久しぶりに富山城址付近の散策を楽しんだ。ここに松川茶屋という休み処があり、その中に滝廉太郎記念館というのがあるので入ってみた。松本ピアノ製のアプライトピアノが展示してあった。店長さんから弾いてもよいと許可をもらったので弾いてみた。ダブルエスケーブメントアクションの今のピアノを弾きなれていると、鍵盤の戻りや音の返りがグニャッという感じがする。
今日のいちばんの目的は県民会館で開かれているミイラ展。ここで初めて知ったのは、発見されたミイラの数ってエジプトは意外に少なく、アジアがけっこう多いこと。ミイラというとエジプト→ピラミッド→ツタンカーメンと連想するのでエジプトがダントツに多いと思われがちだが、どうもそういうわけではないらしい。




左:富山城址公園入口 右:富山城天守閣


左:滝廉太郎彫像 右:展示されている松本ピアノ製の楽器


左:ミイラマップ 右:ミイラをMRIにかけると

【第12章】データをブログラム中に置く
2021.03.10
 前章のプログラムは出席番号、氏名、テストの得点すべてをキーボードから入力するものでした。作ったプログラムを実行してみていかがでしたか。データ入力がかなりたいへんだと感じた方も多いのではないでしょうか。小学校の先生なら(原則的には)すべての教科を担任の先生が教えます。中学・高校の先生なら担当教科は一つでも同じ学年の複数のクラスを担当することも多いでしょう。その度に出席番号、氏名、得点を入力することになり、入力が多くなればなるほど誤入力(誤操作)が発生する確率も高くなります。これをなんとかしましょう。
 次のプログラムを見てください。


   1: *SAKKYOKUKA
   2: DATA "J.S.バッハ",1665,1750
   3: DATA "ベートーヴェン",1770,1826
   4: DATA "ショパン",1810,1849
   5: DATA "チャイコフスキー",1840,1893
   6: DATA "ドビュッシー",1862,1918
   7: DATA "//",0,0
   8: PRINT "偉大なる作曲家"
   9: RESTORE *SAKKYOKUKA
  10: NAMAE$=""
  11: WHILE NAMAE$<>"//"
  12: READ NAMAE$,SEINEN,BOTSUNEN
  13: IF NAMAE$<>"//" THEN
  14: PRINT NAMAE$;" ";SEINEN;" ~";BOTSUNEN;
  15: END IF
  16: WEND
  17: END

[プログラム中にデータを入れる]
 Tiny BASICでは固定的なデータはDATA文でプログラム中に置いてそれをREAD命令で変数に読み込むことができます。次のプログラムを見てください。1行目はプログラム中の特定の場所に目印を付けるものでラベルといいます。ラベルを付けるときは半角の*に続けてラベル名を指定します。ラベル名の付け方の規則は変数名と同じです。
 2~4行目はDATAという指示語から始まって、その後に何か書いてあります。これはプログラム中に入れたデータです。このサンプルはクラシック音楽の作曲家の名前と生年、没年です。ラベルやDATA文は何かの動作をするわけではないので、プログラムを実行すると8行目から実行されます。
 順序が入れ替わりますが12行目のREADはDATA文でプログラム中に埋め込まれたデータを変数に読み込む命令です。9行目のRESTOREはREAD命令で読み込むデータがどこからかを指示するものです。ここで1行目に付けたラベルの意味が出てきます。
 当然のことですが、DATA文で入れるデータとREAD文で読み込む変数の型は一致していなくてはなりません。DATA文で用意されたデータの個数(a)とREAD文で指定した変数の個数(b)が一致していないとき、a<bだと余ったデータは無視されます。反対にa>bだと「お~い、データがないぞ」というエラーになります。このプログラムを実行すると図12_1.のようになります。



図12_1.作曲家の生年と没年


[プログラムはわかりやすく書こう]
 DATA文で入れるデータはデータの型、読み込む変数の数が合っていればプログラム中のどこへ置いてもかまいません。たとえば次のプログラムと上のプログラムは同じ動作をします。


   1: *SAKKYOKUKA
   2: DATA "J.S.バッハ",1665,1750, "ベートーヴェン",1770,1826
   3: DATA "ショパン",1810,1849,"チャイコフスキー",1840
   4: DATA 1893,"ドビュッシー",1862,1918, "//",0,0
   5: PRINT "偉大なる作曲家"
   6: RESTORE *SAKKYOKUKA
   7: NAMAE$=""
   8: WHILE NAMAE$<>"//"
   9: READ NAMAE$,SEINEN,BOTSUNEN
  10: IF NAMAE$<>"//" THEN
  11: PRINT NAMAE$;" ";SEINEN;" ~";BOTSUNEN
  12: END IF
  13: WEND
  14: END

 Tiny BASICではDATA文は制御文ブロックの中に置いてもかまいません(DATA文は繰り返し処理や選択処理の対象にはなりません)。次のプログラムも上2つと同じ動作をします。

   1: RESTORE *SAKKYOKUKA
   2: *SAKKYOKUKA
   3: PRINT "偉大なる作曲家"
   4: DATA "j.S.バッハ",1665,1750
   5: NAMAE$=""
   6: DATA "ベートーヴェン",1770,1826
   7: WHILE NAMAE$<>"//"
   8: READ NAMAE$,SEINEN,BOTSUNEN
   9: DATA "ショパン",1810,1849
  10: IF NAMAE$<>"//" THEN
  11: DATA "チャイコフスキー",1840,1893
  12: LIFE= BOTSUNEN-SEINEN
  13: PRINT NAMAE$;" ";SEINEN;" ~";BOTSUNEN
  14: END IF
  15: DATA "ドビュッシー",1862,1918
  16: WEND
  17: DATA "//",0,0
  18: END

 しかし、プログラム上は正しく動作するといっても、上2つのようなプログラムは見辛いというかわかりにくいことこの上ないですね。後でプログラムの修正の必要が出てきたとき作った当人でもかなり苦労すると思います。プログラムは後々のことを考えてわかりやすく書きましょう。次のプログラムを見てください。

   1: REM 読み込むデータ
   2: *SAKKYOKUKA
   3: DATA "J.S.バッハ",1665,1750
   4: DATA "ベートーヴェン",1770,1826
   5: DATA "ショパン",1810,1849
   6: DATA "チャイコフスキー",1840,1893
   7: DATA "ドビュッシー",1862,1918
   8: DATA "//",0,0
   9:
  10: REM オープニング
  11: PRINT "偉大なる作曲家"
  12:
  13: REM データの読み込みと表示
  14: RESTORE *SAKKYOKUKA
  15: NAMAE$=""
  16: WHILE NAMAE$<>"//"
  17: READ NAMAE$,SEINEN,BOTSUNEN '名前、生年、没年
  18: IF NAMAE$<>"//" THEN
  19: PRINT NAMAE$;" ";SEINEN;" ~";BOTSUNEN
  20: END IF
  21: WEND
  22:
  23: REM 修了
  24: END

 わかりやすいプログラムを書く第一歩は、一連の処理はひとかたまりにしておくことです。上の例では1~8行目は読み込むデータ、10~11行目は誤実行防止のためのプログラム名表示、13~21行目はデータの読み込みと表示の繰り返し、23~24行目はプログラム終了、となっています。そしてこれらの間に9、22行目のような空行が入っています。Tiny BASICではプログラム中に何行空行を入れても差支えありません(実行時は無視されます)。
 これだけでもだいぶプログラムは見やすくなりますが、もう一歩進みましょう。1、10行目は文頭にREMと書かれています。REMはremarks(備考)の意味で、これがあるとその行のREM以後は注記とみなされます(実行時は無視されます)。REMの代わりに ' (半角のシングルクォーテーション)にすることもできます。このようにプログラムの要所要所に注記を入れておくと「ここで何をやっているか」が一見してわかるようになります。



【この章のまとめ】

DATA文でプログラム中にデータを置くことができる。
DATA文で置いたプログラムはREAD命令で変数に読み込むことができる。
RESTORE文でREAD文で読み込むDATA文がどこからかを指示できる。



- CafeNote -