Casio Basic入門46
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
修正:2015/04/12
修正:2015/04/12
4. CasioBasicを使ってみる(続き)
Chapter 8 - 初級
前回: Casio Basic入門45 を見る
◆ Chapter 8 の目標: Basic コマンドを使ってみる
前回は、入力ボックスを実装し、TC7 を作りました。
温度換算プログラム TC7
0→A
Lbl 0
Cls
"1: °C" (スペース11個)
"2: °F" (スペース11個)
"3: K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°?"
-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
Locate 1,4," " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd
Goto 0
(赤文字は、前回修正した部分)
前回までの検討で Chapter 7 で使った旧来の?(入力)命令を Basic コマンドである Getkey を中心としたコードに置き換えることができました。
?(入力)命令は、Chapter 7 で紹介したように多彩な機能を内蔵していて簡単に使えます。その反面 Chapter 8 で見てきたように、柔軟性がありません。
Chapter 8 では、メニュー選択については Basic コマンドで置き換えられることを紹介しました。さらに、Basic コマンドとして用意されていない機能も、Basic コマンドを使ったサブルーチン(入力ボックス)を使って実現しました。ここに新世代 Casio Basic の柔軟性を見て取れ、その能力もお分かりでしょう。そして、新世代 Casio Basic を使いこなせるようになれば、その知識と経験はパソコンなどで使える Basic のプログラミングで役立ちます。
いずれにせよ、これまでのところ Basic コマンドを使えば、旧来の?(入力)命令を置き換えられることを、実際に体験してもらいました。今回は、?(入力)命令でできないことを Basic コマンドで実現します。
?(入力)命令 は、入力確定の [EXE] キーとテンキーや関数キーなど、入力できるキーが限られます。矢印キーや [DEL] キーなどの制御関連のキーは受け付けません。一方、Basic コマンドである Getkey は、[AC] 以外の全てのキー入力を検出できます。これを利用すれば、より柔軟で実用的なプログラムを作れます。
Chapter 8-4
テンキー以外のキー入力を利用する
ここまで作ってきた温度換算プログラムですが、私が普段使う際、摂氏温度、華氏温度、絶対温度の換算式を簡単に確認したくなることがあります。そこで、私の手元のプログラムでは、これらの計算式を表示させる機能を追加しています。
具体的には、メイン画面で、[FMLA] キーを押したら計算式が表示されるようにしています。

計算式は英語で Formula で、fx-5800P には計算式を保存して使う機能の [FMLA] キーがあるので、まさにこのキーが計算式呼び出しにピッタリです。
「計算式表示には [FMLA] キーを押す」、と操作案内をするためにメイン画面の右下に <FMLA> と言う表示を追加しています。そのため、上の写真にあるように INPUT MENU N°? と言う表示を切り詰めて、MENU N°? に変更しています。
次に、[FMLA] キーを押した時の計算式表示は、以下のようにします。

右下の <EXIT> は、[EXIT] キーでメイン画面に戻るための案内表示です。EXIT は、建物の出口に表示されていることが多いですね。「退出する」と言う意味なので、計算式画面から出て、メイン画面に戻ると言う意味で、丁度良さそうです。
さらに、fx-5800P では、[EXIT] キーと [FMLA] キーが隣り合っているので操作しやすそうです。

自作プログラムとはいえ、久しぶりに使う時に忘れていることもあるので、分かり易くするために、必要な局面で操作するキーを示すようにしています。
プログラム変更の方針
具体的には、以下の方針で機能追加します。
・ 表示の変更: 一番下の行(4行目)の表示を下記のように変更する;
MENU N°? <FMLA>
・ [1] ~ [3] のテンキー入力の判定に [FMLA] キーの判定を追加して、[FMLA] キーが押された時はメニュー番号を4(変数 M に 4 を格納する)として、If 文による条件分岐のブロックに、 変数 M が 4 の時の処理を追加することにします。
・ If 文による条件分岐ブロックで、M が 4 の時に計算式を表示するようにします。
・ If 文による条件分岐ブロックで、計算式表示の処理の後ろに、[EXIT] キーが押されるまでプログラムの進行を止めて、[EXIT] キーが押されたらプログラムを先に進める処理を追加します。これで、メイン画面に戻れるはずです。
では、以下で実際のコードを作ってゆきます。
表示の変更
4行目を左端から右端まで16桁全て使って、MENU N°? <FMLA> と表示させることにします。
つまり、以下のような配置にします。
1 | : | ° | C | ||||||||||||
2 | : | ° | F | ||||||||||||
3 | : | K | |||||||||||||
M | E | N | U | N | ° | ? | < | F | M | L | A | > |
16桁一杯に使っても、MENU N°? と <FMLA> の間はスーペース2つしかありません。スペース1つだと区切りが狭い感じなので、スペース2つの方が区切りがはっきりして見やすいので、16桁全てを使って表示することにします。
この4行目を表示させるために、" "(出力)命令を使って、以下のようにしてみます。
"MENU N°? <FMLA>"
やってみると分かりますが、表示全体が1行上にスクロールしてしまい、画面構成が壊れます。

これは、" "(出力)命令 の仕様なので、しかたありません。1行の桁数を目一杯使う表示を " "(出力)命令で実行すると、このように改行してしまいます。" " は便利な命令ですが、限界があります。
そこで、Locate コマンドを使います。
Locate 1,4,"MENU N°?"
Locate 11,4,"<FMLA>"
Locate コマンドは、1行を目一杯使う表示でも改行して画面が上にスクロールするようなことはありません。
[FMLA] キー判定とメニュー番号取得
前回作ったプログラム TC7 から、キー入力判定とメニュー番号取得のブロックを以下に抜き出します。
-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
[FMLA] キーのキーコードは、74 です。fx-5800P の取扱説明書で確認するか、キーコードを調べるプログラム GET KEYCODE で確認してください。
⇒ fx-5800P / fx-9860GII プログラムライブラリ - キーコード取得
上のコードに、Getkey で取得したキーコードが 74 の時、メニュー変数 M に 4 を代入する処理を追加します。
-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
単に、赤文字の部分を最後に追加するだけでOKです。
条件分岐ブロックへの計算式表示処理の追加
プログラム TC7 から、If 文を使った条件分岐ブロックを抜き出します。
Locate 1,4," " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd
変数 M が、1~3 の時の条件分岐で、If 文を青文字で示しました。M が 4 の時の処理を追加(追加部分は赤文字)すると、以下のようになります。:IfEnd が追加されることに留意してください。
Locate 1,4," " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"
Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"
Locate 11,4,"<EXIT>"
<[EXIT] キーが押されるまで、ここで処理を止める>
IfEnd:IfEnd
IfEnd:IfEnd
計算式の表示の前に Cls で画面消去を行い、続く4つの Locate コマンドで表示します。
C | = | 5 | ( | F | - | 3 | 2 | ) | ÷ | 9 | |||||||
F | = | ( | 9 | ÷ | 5 | ) | C | + | 3 | 2 | |||||||
K | = | C | + | 2 | 7 | 8 | . | 1 | 5 | ||||||||
< | E | X | I | T | > |
なお、追加部分には、1→A を含みません。この部分は単なる表示に過ぎないので、フラグA を変更しては問題になります。
フラグ A については、Casio Basic入門41 で説明しているので、忘れてしまった場合は、もう一度参照してください。
フラグ A の目的は、各変数 C、F、K が正しく計算されたかどうかを示します。プログラム起動直後は これら変数は一度も計算されていないので、不定な初期値が入っています。このときは フラグ A は 0 です。一度でも正しく計算されたら フラグ A を 1 にします。
変数の初期値が不定、つまりどんな値が入っているかどうか分からない時(フラグ A が 0 の時)は、これらの変数を表示させるとおかしなことになるので、変数表示を行いません。一回でも温度変数を計算すれば(フラグ A が 1 となる)、正しい値が入るので、フラグ A が 0 でない時だけ、温度変数を表示させるようにしています。
計算式表示を行っても、これら温度変数の計算を行わないので、温度変数は不定かも知れません。だから、フラグ A を 1 にしてはいけません。計算式を表示する時、既に温度変数が正しくなっていることもあるので、その場合は温度変数を表示します。要するに、計算式を表示する時に、フラグ A を触ってはいけません。
上のコードに書いた <[EXIT] キーが押されるまで、ここで処理を止める>の部分は、以下で検討します。
[EXIT] キーでメイン画面に戻す処理の追加
[EXIT] キーが押されるまで、処理を止めるには、Getkey とループを組み合わせて実現します。
While Getkey≠73
WhileEnd
このようにわずか2行で実現できます。汎用性の高い方法なので、覚えておくと便利です。
≠ の入力方法
[FUNCTION] [3] (3:PROG) [▼] [2] (2:≠)
さて、[EXIT] キーのキーコードは、73 です。
While ループは、While と WhileEnd の間を繰り返す時使い、以下の書式になります。
While [ループを継続する条件]
WhileEnd
[ループを継続する条件] として、今回は、Getkey≠73 を指定しています。Getkey で取得するキーコードが 73 でないならば、ループを継続する、と言う動作を行います。つまり、[EXIT] キーが押されない限り、While ループが継続し、プログラムは下へ進みません。そして、[EXIT] キーが押された時は、ループ動作は継続されず、プログラムの実行が WhileEnd より下へ進みます。
⇒ Casio Basic コマンドリファレンス - While ~ WhileEnd
似たような処理は、Do ~ LpWhile ループを使っても実現できます。
Do
LpWhile Getkey≠73
似たような処理ですが、While ループとは少し動作が異なります。
While ループは、ループに入った時、つまりループの入口でループを継続するかどうかを判定します。Do ループはループの終わりつまり ループの出口で継続するかどうかの判定を行います。
その結果、While ループは、条件によってはループを一度も回さないことが有るのに対して、Do ループは必ず最低一回はループを回します。
今回のプログラムでは、ループが一度も回らずに下へ抜けても良いので、このような場合は Do ループだと不要なループ動作を行うことになり、無駄な動作になります。従って、While ループを採用します。
Locate 1,4," " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"
Locate 3,2,"F = (9÷5)C+32"
Locate 4,3,"K = C+273.15"
Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd
IfEnd:IfEnd
IfEnd:IfEnd
(追加部分を赤文字で示した)
以上で、最初の方針通りにプログラムを変更しました。
以上をまとめ、プログラム名変更して、TC8 とします。
温度換算プログラム TC8
0→A
Lbl 0
Cls
"1: °C" (スペース11個)
"2: °F" (スペース11個)
"3: K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"MENU N°?"
Locate 11,4,"<FMLA>"
-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
Locate 1,4," " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"
Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"
Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd
IfEnd:IfEnd
IfEnd:IfEnd
Goto 0
(今回変更部分を赤文字で示す)
私が普段使っている温度換算プログラムは、TC8 と少し違っています。
以前は、プログラムの終了に [AC] キーを使うようにしていました。と言うのも、[AC] キーで終了させるためには、特にプログラムを書く必要が無いからです。Chapter 7 と Chapter 8 でも、これまでのところ [AC] キーで終了するようにしています。
特に、fx-5800P の場合は、2つあるプログラムの起動方法のうち、COMPモードで [FILE] キーからプログラムを呼びだして使う場合は、[AC] キーによる強制終了でも全く問題ありません。一方、もう1つの起動方法として、PROGモードで、Prgram Menu からプログラムを呼びだす時は、[AC] キーによる強制終了を行うと、プログラム編集画面に移動してしまいます。ここで、意図せず誤ってキーを押すと、プログラムを改変してしまい、知らないうちにバグが入り込む危険性があります。
fx-9860GII でも Caso Basic でプログラムを作っていますが、この機種は PROGモードからしかプログラムを起動できません。従って [AC] キーによる強制終了には、上記の fx-5800P と同じ危険性が常にあります。fx-9860GII でプログラムを作るようになって、[AC] キーによる強制終了が果たして本当に良い方法なのか、疑問を感じています(以前は、[AC] でプログラム終了にする方法が最適だと考えていました)。
そんなことから、最近作るプログラムは、fx-5800P でも [AC] キーでない終了方法を実装するようにしています。今のところは、[EXIT] キーを押したら、BYE! と表示してプログラムを正常終了させるようにし、fx-5800P と fx-9860GII 両方でこの方法を採用しています。
正常終了させると、PROGモードで起動しても、Prog List 画面が表示されるだけで、プログラム編修画面は表示されないので安全です。
そこで次回は、[EXIT] キーで正常終了させる方法を盛り込んで、完成バージョンとする予定です。次回までに、挑戦してみてください。
つづく...
⇒ Casio Basic入門47 / 目次
応援クリックをお願いします。励みになるので...
- 関連記事
-
-
Casio Basic入門G04 2015/07/18
-
Casio Basic入門50 2015/04/24
-
Casio Basic入門46 2015/03/25
-
Casio Basic入門45 2015/03/20
-
Casio Basic入門43 2015/03/16
-