Casio Basic入門5
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
修正最終:2015/01/06
修正最終:2015/01/06
4. CasioBasicを使ってみる(続き)
Chapter 1 - 初級
Getkey と Locate コマンドを使いこなす
前回: Casio Basic入門4
◆ Chapter 1 の目標: キーコードを調べるプログラムを作る
Chapter 1-3 で作ったプログラム
プログラム名 CH1-3
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 2,1," " (" " の中はスペース1つ: 2014/11/19 追記)
Locate 1,1,K
Goto 0
プログラム CH1-3 で、押したキーのキーコードを表示する中心部分が完成しました。今回は、誰でも使いやすいレベルまでプログラムの品質を向上させるために、適切な表示を追加して、以下の画面のようなプログラムに仕上げます。
プログラム起動時の表示:

プログラム起動直後に、プログラム名
GET KEYCODE
を1行目に表示し、
3行目に、プログラムの使い方の説明を表示します:
HIT ANY KEY
(何かキーを叩いてください)
このプログラムは、[AC]キー以外のすべてのキーのキーコードを表示します。[AC]キーにはプログラムの強制終了の機能があるので、このキーを使ってプログラムを終了させます。
そこで、プログラムの終了方法の説明を4行目に表示することにします。
<AC>
QUIT は終了と言う意味です。
さらに、得られたキーコードは、次の画面の1行目のように表示させます。
キーを押した時の表示:

Chapter 1-4
Locateコマンドと出力命令" "の違い
先ずは、キーコードを表示する部分を、例えば [EXE]キーを押した時に、
KEYCODE = 47
といった表示を行うために、今回は " " (出力命令)を用います。
Locateコマンドで表示する方法は既に紹介しています。CasioBasicでは、この他にも、出力したい文字列を " " で括る(くくる)方法があります。
"KEYCODE ="
とプログラムを書くだけで良いので、簡単です。
そして、この1行の下に、
Locate 1,11,K
とすれば、表示が
KEYCODE = 47
となるはずです。この表示で 47 の 4 は、1行目 - 11桁目にくるので、Locateコマンドの第1引数は 1、第2引数は 11 になります。
では、プログラムを変更しましょう。プログラム名を CH1-4とし、変更部分を赤文字で示します。
プログラム名 CH1-4
Lbl 0
Do
Getkey→K
LpWhile K=0
"KEYCODE ="
Locate 11,1,K
Goto 0
プログラム編集画面で、Locate 11,1,"KEYCODE =" の = 記号を入力できますか?
CasioBasicでは、コマンド、命令、その他何でも選択可能な記号を文字列に使うことが出来ます。
= 記号は比較演算子として用意されているので、プログラム編集画面で、[FUNCTION] キーを押し、出てくるメニューで 「3:PROG」を選び([3] キーを押し)、[▼]キーを1回押すと、メニューに 「1:=」 が現れますね。これをそのまま使えば良いのです。
" " で括られる中に = を入れると、それは文字として使えるわけです。
さて、このプログラムを実行すると、画面表示は以下のようになります。
KEYCODE = 22
KEYCODE =
KEYCODE =
KEYCODE =
ちょっと妙なことになってしまいました。
1行目は期待した通りの表示ですが、2行目以降に予期せぬ表示がズラズラと出てきてしまいます。
これは、出力命令 " " の仕様なのです。
プログラムの説明
CasioBasicでは、「カーソル行」というものが内部で管理されています。カーソル行は、プログラム開始時は1となっており、 " " 命令が実行されるたびに、自動的にカーソル行が1つづつ増えてゆきます。
従って、1回目の "KEYCODE =" は1行目、2回目は2行目・・・4回目は4行目、それ以降は画面がスクロールされて4行目に表示され続けます。見方を変えると、出力コマンド " " には、改行機能が付加されているとも言えます。
表示位置がカーソル行で管理される命令(コマンド)には、出力命令 " " 以外にも、入力命令 ? があります。つまり、" " (出力命令)や ? (入力命令)を使う時は、カーソル行がどこにあるのかを、きちんと意識して使う必要があります。
実際には、カーソル行を意識しないで使えるのは、実際はプログラム開始時くらいのものです。プログラムが入り組んでくると、カーソル行を把握するのが困難になります。
もし、プログラムの最初で
""
と書くと、何も表示をせずにカーソル行が1行下がるので、改行コマンドとして使えます。
これを応用すると、意図的にカーソル行を2行目にするには、プログラム開始時に
""
""
と、2回改行すれば良いわけですね。
従って、好みの位置に表示を行うには、Locateコマンドを使うのが賢明です。Locateコマンドと " " 命令の違いを理解しておけば、適切に使い分けができます。
ところで、入力コマンド ? の使用時も、カーソル行が自動的に変化して、改行されてから入力内容が表示されますので、画面設計の邪魔になります。入力させる時に、カーソル行の心配をせずに入力させてそれを変数に代入するには、入力命令 ? ではなくて、Getkeyコマンドを使った方が良いことがわかります。
※CasioBasicコマンドリファレンス
- " " (出力命令)
※ コマンドと命令
これまで、LocateコマンドとかGetkeyコマンドと言いながら、" "命令や ?命令と書いています。コマンドと命令は、いずれも同じ意味で、英語か日本語かの違いです。取扱説明書では、これらが混在して使われていますが、明確な使い分けがされていないように思われます。CasioBasic特有のコマンドを「命令」と言っている部分もあり、そうでない部分もあります。┃
そこで、私はCasio Basic特有のものを命令と呼び、他のBasicでも共通して使われるものをコマンドと呼ぶことにしています。
例えば、→、?、◢、" "、⇒、Dsz、Isz は、一般のBasicには無い、Casio Basic特有のコマンドなので、これらを「命令」と呼び、それ以外は「コマンド」と呼ぶことにします。
chapter 1-5
思い込みの罠
KEYCODE = 34
といった結果表示を必ず1行目に表示するには、積極的にLocateコマンドを使うべきだ、ということがハッキリと理解できたと思います。
では、プログラムを変更します。プログラム名を CH1-5 とし、変更する部分を赤文字で示します。
プログラム名 CH1-5
Lbl 0
Do
Getkey→K
LpEhile K=0
Locate 1,1,"KEYCODE ="
Locate 11,1,K
Goto 0
fxー5800P の取扱説明書には、キーコードは2桁の整数だと書かれていています。ところが、実際は、キーコードが1桁になるケースがあります。詳細はあとで紹介します。
そこで、
KEYCODE = 25
と表示されている時に、1桁のキーコード、例えば 2 が表示される場合を想定します。この時、変数Kは 2 になるので、
Locate 1,1,"KEYCODE ="
Locate 11,1,K
が実行されると、どうなるでしょうか?
Locate 11,1,K は、1行目の11桁目に、2 を表示させます。しかし12桁目には何も表示されないので、表示結果は、
KEYCODE = 25
となってしまいます。
本来、
KEYCODE = 2
となるべきなのですが、そうはなりません。そして、キーコードが 25 であるかのように表示されてしまうのです。これは、明らかなバグですね。
なぜそうなるのか、わかりますか?
ディスプレイに表示された状態は、以下のようになっています。
K | E | Y | C | O | D | E | = | 2 | 5 | ||||||
この状態で、Kが2になっていて、Locate 11,1,K を実行すると、1行目、11桁目に 2 が表示されます。 1行目12桁目に表示されている 5 はそのままです。キーコードが常に2桁の場合は、1行目12桁目の 5 も上書きされるので問題は発生しません
この問題を解決するには、Locate 11,1,K を実行する前に、11桁目と12桁目を消去しておけば良いですね。消去する代わりにスペースを上書きしても良いわけです。
fx-5800P には、画面消去コマンドとして、Cls が用意されていますが、これは画面全体、つまり4行16桁を全て消去しますので、今回のように、特定の位置だけを消去するのには使えません。そして、測定の位置だけを消去するコマンドはありません。
実は、そのようなコマンドは特に必要ありません。Locateコマンドを使って、特定の位置にスペースを表示させれば良いのです。
そこで、1行目、11桁目と12桁目にスペースを上書きするために、
Locate 11,1,"KEYCODE ="
と書くところを、
Locate 11,1,"KEYCODE = "
とします。"=" の後ろに、スペースを3つ追加しています。
K | E | Y | C | O | D | E | = | _ | _ | _ | |||||
ここでは、便宜上スペースを _ で表現していますが、実際は空白です。
こうしておいてから、K が 2 になっていて、Locate 11,1,K を実行すると、
K | E | Y | C | O | D | E | = | 2 | |||||||
と正しく表示されます。
表示する桁数に対する思い込みがバグの原因となっていたわけです。では、プログラムを修正して、プログラム名を CH1-5-2 とします。赤文字が修正部分です。
プログラム名 CH1-5-2
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE = " ( = の後ろにスペース3つ: 2014/11/19 追記)
Locate 11,1,K
Goto 0
Chapter 1-6
プログラム完成
プログラム名の表示、操作方法と終了方法の説明を追加します。
プログラム名 CH1-6
" GET KEYCODE " (Gの前にスペース2つ)
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE = " (=の後ろにスペース3つ)
Locate 11,1,K
Goto 0
今回は、プログラムの最初に赤文字で示した3行を追加しました。これは特に説明は不要だと思いますが、2点補足しておきます。
先ずは、Locate 8,4,"<AC>:QUIT" で表示する <AC>:QUIT ですが、ここでは、記号 < 、> 、: が出てきます。
これらは、アルファベットには有りません。
Casio Basicでは、コマンド、命令、その他何でも選択可能な記号を文字列に使うことが出来ます。
例えば、< や > は比較演算子 です。プログラム編集画面が表示されている時に、[FUNCTION] キーを押し、出てくるメニューで 「3:PROG」を選び([3] キーを押し)、[▼]キーを1回押すと、メニューに 「3:>」 や 「4:<」 が現れるので、それを文字として使用できます。
では、: 記号はどうやって入力するか?
この記号は、[SHIFT] [√■] で入力できます。
本来この記号は、複数行にわたるプログラムを1行に続けて記述する時に使います。
例えば、
Do
Getkey→K
LpWhile K=0
と書くところを、: 記号を使って、
Do:Getkey→K:LpWhile K=0
と書けます。
私は、画面上でプログラムを見やすくするために、 : 記号を使うことがありますが、むしろ表示のために多用しています。
2つめの、補足ポイントです。
1行目は、文字列が " " で括(くく)られているだけですが、これだけで出力ができる Casio Basic 特有のとても手軽な命令です。これを実行すると、ディスプレイ上では次のようになります。
G | E | T | K | E | Y | C | O | D | E | ||||||
続いて、2行目と3行目が実行され、
G | E | T | K | E | Y | C | O | D | E | ||||||
H | I | T | A | N | Y | K | E | Y | |||||||
< | A | C | > | : | Q | U | I | T |
そして、プログラム起動時に押した [EXE] キーの影響で、K には [EXE] キーのキーコード 47 が入っているので、Do ループが継続せずに、
Locate 1,1,"KEYCODE = "
(= の後ろにスペース3個)
が実行されるので、1行目、1桁目から左へ "KEYCODE = " が上書きされるはずです。
G | E | T | K | E | Y | C | O | D | E |
が、
K | E | Y | C | O | D | E | = | E |
となってしまうはずです。
最後の E もスペースで上書きしておく必要があるわけですね。
従って、Locate 1,1,"KEYCODE = " は、= の後ろにスペースを4個にしておけば、問題は解決です。
Locate コマンドで上書きする場合には、どこまでスペース上書きで消去するのかを、気をつけておくことが、バグを作らないポイントになります。たかが表示ですが重要なので、取り上げました。
さて、実際にプログラムを実行してみて、何か気付きませんか?
いままでは、プログラムを起動したら、プログラム起動に必要な [EXE] キーのキーコード 47 が表示されていました。ところが、今回新たに表示を追加したら、プログラム起動時には、キーコードが表示されません。つまり、画面の1行目には、GET KEYCODE と表示されており、KEYCODE = 47 と表示されませんね。
今回のプログラム改造により、起動時の [EXE] キーのキーコードが取得されなくなった、と言うことを意味しています。
しかしその後は、押したキーに対応するキーコードが表示されます。
試しに、起動時に [EXE] キーを少し長押ししてみてください。すると、一旦 GET KEYCODE が表示されますが、すぐに KEYCODE = 47 と表示が切り替わりますね。
このことから、Getkeyコマンドは、キーが押されてから一定時間内ならキーコードを取得するが、その時間を超えるとキーコードを取得しないことが分かります。
※ CasioBasicコマンドリファレンス
- Getkeyコマンド
を参照してください。
Chapter 1-7
思い込みの罠(補足)
それでは、プログラム名 を CH1-7 とし、ここまでのプログラムをまとめておきます。
プログラム名 CH1-7
" GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE = " (=の後ろにスペース4つ)
Locate 11,1,K
Goto 0
ここまでで、Chapter 1 の目標のプログラムが完成しました。
実際に実行してみます。

1行目の右端に、黒い■ が表示されていますね。
これは、プログラムが一旦停止せずに走っていることを示しています。
何かキーが押されるまで、
Do
Getkey→K
LpWhile K=0
のループが回り続けているので、リアルタイムに入力待ちをしていることになります。
ここで、[4] キーを押すと、キーコードが21であると表示されます。[7]を押すと、キーコードが31であると表示されます。
チョット面白い実験をしてみます。
[4] と [7] を同時に押してみて下さい。キーコードが 1 になりますね。縦の同じ並びのキーを2つだけでなく複数を同時に押すと、1桁のキーコードが得られます。
但し、電卓の右下にある [(-)] [EXE] [+] [-] [÷] の5つのキーは例外で、これらのうち何個でも同時に押すと、キーコード 7 が得られます。
いずれにせよ、キー1つを押して得られるキーコードの1の位の数が同じキーは、それらを何個でも良いので同時に押すと、1の位の数と同じ1桁のキーコードが得られるのです。
取扱説明書には説明はありませんが、ここで作ったキーコード取得プログラムを実際に走らせて、色々触っている時に発見しました。
自分で作ったプログラムで、電卓の内部動作を垣間見えると言うのは、チョット愉しいですね。
1桁のキーコードについては、詳しくは以前の記事をご覧ください。→ こちら
次回は、ここまで作ったプログラムに、ちょっと動きを取り入れたギミックを追加しようと思います。
つづく...
⇒ CasioBasic入門6 / 目次
応援クリックをお願いします。励みになるので...