Casio Basic入門3
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終修正:2016/12/17
最終修正:2016/12/17
4. CasioBasicを使ってみる
これまでのプログラミングの経験(無しを含む)に合わせて、最適な読み進め方が分かるかも知れないので、<目次>に目を通しておくと良いと思います。
Chapter 1 - 初級
Getkey と Locate コマンドを使いこなす
◆ Chapter 1 の目標: キーコードを調べるプログラムを作る
新世代Casio Basicが優れている理由の1つが、Getkeyコマンド と Locateコマンドの機能にあります。
Getkeyコマンドは、押されたキーをリアルタイムに識別するものです。ゲームを作ろうと思ったら間違いなく必要になりそうです。Getkey が実行されると、どのキーが押されたかの判別結果を2桁の数で返します。返ってくる値を「戻り値(もどりち)」と言います。
Locateコマンドは、画面の好きな位置に数字や文字を出力するものです。fx-5800P の画面は、横16桁、縦4行なのでその範囲内で表示位置を指定して使います。Locate には、3つの設定値が必要です。この設定値を「引数(ひきすう)」と言います。
Chapter 1-1
ここで、事前準備として、ENGモードをOFF にしてくだたい。
1) fx-5800P の電源を入れて、COMPモード(通常に関数電卓として使えるモード)にする

2) [SHIFT] [MODE] (SETUP) でセットアップメニューに切り替え、

3) [▼] を一回押して、メニューの次画面を表示

4) 3:ENG を選択 ([3] を押す)

5) 2:EngOff を選択 ([2] を押す)
COMPモードの画面に戻ります。
もし、ENGモードが ON になっていると、画面上部に ENG サインが現れます。

今回は、ENGモードを OFF にしますので、COMPモードで画面上部に ENG サインが無いことを確認してください。
プログラムの入力
では、2行の簡単な例題プログラムを作ります。
COMPモード(通常の電卓画面)で [MODE] キーを押して、モード選択画面にします。

プログラムモードに移行するために、[5] (5:PROG) を選ぶと、Progra Menu が表示されます。

新たにプログラムを作るので、[1] (1:NEW) を選ぶと、File Name 画面が現れます。

この画面の左上に、小さく A と表示されています。これはアルファベットモードになっていることを示していて、テンキーなどを押すと赤く印字されているアルファベットが入力されます。この File Name 入力画面ではアルファベットモードがロックされていて、連続してアルファベットを入力できます。もし数字を入力したい時は、[ALPHA] キーを1回押すとアルファベットモードが解除されます。もう一度 [ALPHA] を押すとアルファベットモードになりますが、1つ入力するとアルファベットモードが解除されます。連続してアルファベットモードにするには、[SHIFT] [ALPHA] を押してロックします。
これから作るプログラムの名前を CH1-1 とします。
アルファベットモードで、 CH と入力し、アルファベットモードを解除して、1-1 を入力しましょう。

ここで、プログラム名 CH1-1 を入力したら、[EXE]キーで確定。すると File Mode 画面になるので、

[1] (1:COMP) を入力。すると以下のプログラム編集画面が表示されます。

まだ何も入力していないので、カーソルが点滅しているだけです。
ここで、次の2行のプログラムを入力しましょう。
Getkey→K
Locate 1,1,K

Getkey の入力
[FUNCTION] [3] (3:PROG) [▼] [▼] [▼] [▼] [4] (4:Getkey)
→ の入力
[FINCTION] [3] (3:PROG) [2] (2:→)
K の入力
[ALPHA] [7] (K)
改行マークの入力
[EXE]
Locate の入力
[FUNCTION] [3] (3:PROG) [▼] [▼] [4] (4:Locate)
続いて、1,1,K を入力します。
プログラムの入力は、ある程度慣れると、どこに何があるのか分かってくるので、大変なのは最初だけです。私の経験では、fx-9860GII よりも fx-5800P の方が遙かに早く慣れます(これが fx-5800P の良い点だと思います)。
入力が終われば、[EXIT] キーを1回押します。すると、Prog Edit 画面が表示されます。

もし、[EXE] キーを押せば、プログラム編修画面に戻ります。
ここでは、[EXIT] キーを押して、Progman Menu 画面に戻ってください。

プログラムの実行
では、今作ったプログラムを実行してみましょう。
[2] (2:RUN) を選択すると Program List が現れます。

今作ったプログラム CH1-1 にカーソルが合っています。ここで [EXE] キーを押すと CH1-1 が実行されます。

実行すると、このように左上に
47
と表示されました。
プログラムの説明
1行目: Getkey→K
Getkey コマンドは、押されたキーのキーコードを取得してから返します。fx-5800P の全てのキーには2桁の異なる数が割り振られていて、この2桁の数をキーコードといいます。但し [AC] キーだけはキーコードが割り振られていません。
例えば、[ 1 ]キーのキーコードは35、[ 2 ]キーのキーコードは36、[EXE]キーのキーコードは47です。
このプログラムを実行した時の操作を思い出してください。[EXE] を押しましたね。だから Getkey は[EXE] が押されたと認識して、キーコード 47 を取得します。
Getkey は、キーコードを取得した後、その値を返します。「返す」というのは、Getkey がその値を持つと言うことです。つまり、
Getkey→K
とすると、取得したキーコードを変数 K に代入します。
→ は代入命令でした。→ の左の値を右の変数に格納するわけです。
これが実行されると、変数 K に は 47 が格納されます。
2行目: Locate 1,1,K
見て分かるように、Locate の引数 (ひきすう) は3つあり、それぞれを "," (コンマ)で区切っています。左から順に第1引数、第2引数、第3引数と言います。
Locate [X座標],[Y座標],[出力内容]
X座標とは左端からの桁数で、Y座標とは上端からの行数です。
一般的に言えば、座標とは、横方向の位置や縦方向の位置のことです。2つの数の組で、位置を特定できるので、座標を(7, 2)のような表記にすることもあります(横は7の位置、縦は2の位置と言う意味になります)。なお、引数とコンマの間にスペースを入れてはいけません。不要なところにスペースが入るとエラーになるので、注意が必要です。
ところで、座標を決めるためには、基準になる位置(原点)が必要です。左下が原点になっているグラフをよく見ますが、プログラミングの世界では、歴史的に画面の左上を原点にします。CasioBasicでも同様です。
横方向がx軸で、x座標の値は、1番左が1、右にゆくほど大きくなります。
縦方向がy軸で、y座標の値は、1番上が1、下に行くほど大きくなります。
特に縦方向は慣れるまで違和感があるかも知れません。この原点と座標の決め方は CasioBasicに限らず、パソコンで使うプログラミング言語にほぼ共通したものです。
Casio Basic では、原点の座標:(x,y) = (1,1)となっています。
16桁 x 4行のディスプレイ
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
2 | |||||||||||||||
3 | |||||||||||||||
4 |
fx-5800Pのディスプレイは、横16桁、縦4行なので、
x = 1, 2, 3,・・・,15, 16
y = 1, 2, 3, 4
のいずれかになります。
Locate コマンドで、この範囲外の値を指定するとエラーになります。
例えば、Locate 15,1,123 は、15桁目-1行目から 数字 123 を表示しなさい、と言う命令になります。15桁目の 1 と16桁目の 2 は表示できますが、1行に16桁しかないので、17桁目の 3 は表示されません。
Locate 15,1,123 を実行すると、1行におさまらず、3 があふれてしまいます。
1 | 2 | ||||||||||||||
この場合、X座標の値(桁数)が範囲内 (1~16) なので、エラーにはなりません。
さて、上のプログラムでは、Locateコマンドの第3引数の[出力内容]に、変数Kを指定しています。この場合は、K に代入されている値が表示されます。Kに47が代入されているので、表示は 47 となります。
K=47 の時に Locate 1,1,K を実行した時の表示
4 | 7 | ||||||||||||||
第3引数に、K ではなくて 47 を指定した場合、
Locate 1,1,47 を実行した時の表示
4 | 7 | ||||||||||||||
座標(1, 1)に 4 が、座標(2, 1)に 7 が表示され、これらは同じ結果になります。
第3引数には、文字や文字列も指定できます。文字や文字列は、頭とお尻に "String" のようにタブルクォーテーションで挟みます(ちなみにStringは文字列という意味です)。
Locate 4,3,"STRING" を実行したときの表示
S | T | R | I | N | G | ||||||||||
Locate の引数、[x座標]、[y座標]、[出力内容] には、式、関数、さらには戻り値のあるコマンド (Getkey)を指定することもできます。但し、座標や出力内容の結果でエラーが出ないように留意しなくてはいけません。
戻り値のあるコマンドとして、Getkey を指定してみましょう!
Locate 1,1,Getkey
は、上の2行のプログラムCH1-1
Getkey→K
Locate 1,1,K
と同じ結果になります。
最後に、もう一つ悪乗りします。
Locate 1,1,Getkey2
これもOK。一度実際に上のプログラムを変更して試してみてください。
脱線しましたが、プログラム CH1-1 へ戻ります。
プログラム実行結果
プログラム CH1-1 を実行すると、常に 47 しか表示しません。プログラムを起動する時、Getkey が [EXE] のキーコードを拾ってしまい、それ以外は受け付けません。
そこで、このプログラムを改造して、他のキーのキーコードも調べられるようにしてゆきます。
※ CasioBasicコマンドリファレンス
- → (代入命令)
- Getkey
- Locate
Chapter 1-2
プログラム CH1-1 は、Getkey が一回働いたら、スグにプログラムが終了してしまうので、最初に押される [EXE] のキーコードを取得して終わってしまいます。
これではつまらないので、色々なキーを押した時に、そのキーコードを表示するように変更したいと思います。そこで、CH1-1 の2行の処理を繰り返えすように、変更してみます。
プログラム名: CH1-2
Lbl 0
Getkey→K
Locate 1,1,K
Goto 0
赤文字が追加した部分で、Lbl / Goto コマンドを使いました。
プログラムの説明
Lbl は、Label (ラベル)の略で、Goto は Go to (~へ行く) の意味です。一番下の行の Goto 0 は、「ラベル0まで行く」 と言うコマンドで、一番上の行の Lbl 0 は 「ラベル0 はここだよ」 と位置を示しています。
前に、「特別な指示が無い限りプログラムは上から下へ連続的に実行される」、と書いたことを思い出して下さい。今回のプログラムは、原則通りに一番下まで実行されます。そして、Goto 0 に出くわし、「Lbl 0 へジャンプしなさい」と指示を受けます。だからプログラムは原則を破って、一番上へ戻ります。これ以外にプログラムの流れを変える指示が無いので、エンドレスで繰り返すことになります。
プログラム実行結果
実際にプログラム CH1-2 を実行して、色々とキーを押してみると、確かにキー入力を次々に受け付けていますが、画面表示が妙な結果になります。
押したキーに応じたキーコードが表示する筈ですが、左端の数字がチカチカして、最後は必ず0になってしまいますね。
例えば、[7] を押します。キーを押したまだと 31と表示し、キーを離すと表示が01に変化します。どのキーを叩いても、キーを離すと左端が必ず0になります。つまり、Getkey が 0 を返して、それが左端に表示されているわけです!
Getkey は、キーが押されている時に実行されるとそのキーのキーコードを返し、キーが押されていない時に実行されると 0 を返す、そいういう仕様になっています。
※ Getkey の説明は、fx-5800P 取扱説明書 の99ページにあるので、確認してください。
この現象は、Getkey が正しく仕様通りに動いていることを示しています。キー [7] を押すと、確かにGetkey がキーコード 31 を返し、それが表示されます。キーを離した時は、キーが押されていないので、左端に0 が表示されるわけです。
では、Locate 1,1,K によって、31と01が表示される時の様子を細かくみてみます。
K=31 の時の Locate 1,1,K の表示結果
3 | 1 | ||||||||||||||
次に、K=0 の時の Locate 1,1,K の表示結果
0 | 1 | ||||||||||||||
左端だけ0に書き換えられるものの、隣の1が書き換えられずに残っています。キーを離した時は、本来 「0」 と表示されるべきところが、「01」 となる理由が分かりました。
この問題を解決するためには、Locate 1,1,K が実行される直前に、左から2桁目の表示を消せば良いことになります。
つまり、
Locate 2,1," " (スペース1つを " " でかこむ: 2014/11/19 追記)
Locate 1,1,K
とプログラムを変更すれば良いわけです。
以上を反映したプログラムの修正版は、以下のようになります。
プログラム名: CH1-2-2
Lbl 0
Getkey→K
Locate 2,1," " (" " の中は、スペース1つ)
Locate 1,1,K
Goto 0
※ CasioBasicコマンドリファレンス
- Lbl / Goto
これで、Getkeyの動作に忠実に結果を表示するプログラムができました。
これからは、キーコード表示プログラムの完成度を上げてゆきます。
重要な補足
冒頭で、プログラムを作る前にENGモードをOFFにしましたが、それには深い理由があります。
プログラム CH1-2 では表示の問題があり、それを改善したものが プログラム CH1-2-2 でした。
実は、ENGモードをON にすると、プログラム CH1-2 は上記のような問題が発生しないのです。
一方、改善プログラムCH1-2-2 は、どちらでも問題が発生しません。
電卓の設定によって、異常になったり正常になったりするプログラムは作ってはいけなので、本来あるべき姿として、CH1-2-2 を作りました。
ここで、ENGモード と Locate コマンドの関わりについて、説明しておきます。
ENGモードと Locate コマンドの関係
fx-5800P の設定の1つに、ENGモードと言うのがあります。
ENGモードをONにすると、数を表示するとき、2000 と表示する代わりに 2k と表示します。同様に、0.03 と表示する代わりに 30m、6,500,000 の代わりに 6.5M、0.00005 の代わりに 5μ などとなります。
ENGモードは、プログラム中で ON / OFF を切り替えることが出来ます。
・EngOn コマンド: ENGモードをONにする
・EngOff コマンド: ENGモードをOFFにする
そして、プログラム CH1-2 の改善方法として、以下のように ENGモードをON にする方法があります。
プログラム名: CH1-2
EngOn
Lbl 0
Getkey→K
Locate 1,1,K
Goto 0
一方、プログラム CH1-2-2 はそのままで問題ありません。
プログラム名: CH1-2-2
Lbl 0
Getkey→K
Locate 1,1," "
Locate 1,1,K
Goto 0
もし、関数電卓として使う際に、ENGモードをOFFにして使っている場合、CH1-2 を実行すると勝手に EngOn されてしまうので、プログラムとしてはチョット問題です。
プログラムが実行される時、一番最初に現在の ENGモードを調べておき、プログラム中で ENG On として、上記の表示の問題を回避し、プログラムが終了する直前に、調べておいた ENGモードに戻しておくべきです。こうすれば、プログラム中で、ENGモードを自由に変更しても問題ありません。
ところが、実はこの作戦が使えません。ENGモードを切り替えるコマンド EngOn や EngOff は準備されていますが、現在の ENG モードを調べるコマンドは準備されていないのです。従って、プログラムで勝手にENGモードを切り替えるのは、できるだけ避けるべきです。
やはり、プログラム CH1-2-2 の方が素性の良いプログラムと言えます。
それはさておき、なぜこのように プログラム動作が、ENGモードの影響を受けるのかを、調べてみます。そのために以下のようなプログラムを作って、走らせてみましょう。
EngOn
Locate 1,1,"ENGON"◢
Locate 1,1,100◢
EngOff
Locate 1,1,"ENGOFF"◢
Locate 1,1,100◢
◢ の入力
[SHIFT] [X2] (Xの2乗)
・ 1行目: EngOn
このコマンドで、ENGモードをONにします。
・2行目: Locate 1,1,"ENGON"◢
画面の左上に
ENGON
と表示され、プログラムが一時停止。[EXE] を押すと次へ進む。
・3行目: Locate 1,1,100◢
画面の左上に 100 と上書きされプログラムが一時停止。
表示結果は、
100 N
と、100の後にスペースが入ります。[EXE] を押すと次へ進む。
・4行目: EngOff
ENGモードをOFFにします。
・5行目: Locate 1,1,"ENGOFF"
画面の左上に
ENGOFF
と表示され、プログラムが一時停止。[EXE] を押すと次へ進む
・6行目: Locate 1,1,100
画面の左上に 100 と上書きされプログラムが一時停止。
表示結果は、
100OFF
と、100の後にスペースは入りません。
このように、ENGモードがON の場合、1桁~3桁の整数を表示する場合は k や m といった記号が末尾に付きません。記号の代わりにスペースが1つだけ末尾に付くのです。これは、ENGモードON の時の仕様だと分かります。
今回のプログラムは、2桁の数を表示するので、0 + [スペース] と表示される仕様が、うまく働きましたが、4桁の表示を行う場合は、この効用は役に立ちません。
Locate コマンドと ENGモード の関係は覚えておくとして、今後はそれに依存しないプログラムを書くようにしてゆきます。
※ CasioBasicコマンドリファレンス
- Getkey
- Locate
- Lbl / Goto
- EngOn / EngOff
つづく...
⇒ CasioBasic入門4 / 目次
応援クリックをお願いします。励みになるので...