Casio Basic入門46

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

修正: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] キーを押したら計算式が表示されるようにしています。

TC8-1 

計算式は英語で Formula で、fx-5800P には計算式を保存して使う機能の [FMLA] キーがあるので、まさにこのキーが計算式呼び出しにピッタリです。

「計算式表示には [FMLA] キーを押す」、と操作案内をするためにメイン画面の右下に <FMLA> と言う表示を追加しています。そのため、上の写真にあるように INPUT MENU N°? と言う表示を切り詰めて、MENU N°? に変更しています。

次に、[FMLA] キーを押した時の計算式表示は、以下のようにします。

TC8-2 

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

さらに、fx-5800P では、[EXIT] キーと [FMLA] キーが隣り合っているので操作しやすそうです。

Keys-2 

自作プログラムとはいえ、久しぶりに使う時に忘れていることもあるので、分かり易くするために、操作に必要なキーをキー示すようにしています。


プログラム変更の方針

具体的には、以下の方針で機能追加します。

・ 表示の変更: 一番下の行(4行目)の表示を下記のように変更する;
 MENU N°?   <FMLA>


・ [1][3] のテンキー入力の判定に [FMLA] キーの判定を追加して、[FMLA] キーが押された時はメニュー番号を4(変数 M4 を格納する)として、If 文による条件分岐のブロックに、 変数 M4 の時の処理を追加することにします。

・ If 文による条件分岐ブロックで、M4 の時に計算式を表示するようにします。

・ If 文による条件分岐ブロックで、計算式表示の処理の後ろに、[EXIT] キーが押されるまでプログラムの進行を止めて、[EXIT] キーが押されたらプログラムを先に進める処理を追加します。これで、メイン画面に戻れるはずです。

では、以下で実際のコードを作ってゆきます。

表示の変更

4行目を左端から右端まで16桁全て使って、MENU N°?  <FMLA> と表示させることにします。
つまり、以下のような配置にします。
1:          °C  
2:









°F

3:










K

MENU
N°?

<FMLA>

16桁一杯に使っても、MENU N°?<FMLA> の間はスーペース2つしかありません。スペース1つだと区切りが狭い感じなので、スペース2つの方が区切りがはっきりして見やすいので、16桁全てを使って表示することにします。

この4行目を表示させるために、" "(出力)命令を使って、以下のようにしてみます。

"MENU N°? <FMLA>"

やってみると分かりますが、表示全体が1行上にスクロールしてしまい、画面構成が壊れます。

TC8-3 

これは、" "(出力)命令 の仕様なので、しかたありません。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-32)÷9    
 F = (9÷5)C+32    
 K = C+278.15     
          <EXIT>

なお、追加部分には、1→A を含みません。この部分は単なる表示に過ぎないので、フラグA を変更しては問題になります。

フラグ A については、Casio Basic入門41 で説明しているので、忘れてしまった場合は、もう一度参照してください。

フラグ A の目的は、各変数 C、F、K が正しく計算されたかどうかを示します。プログラム起動直後は これら変数は一度も計算されていないので、不定な初期値が入っています。このときは フラグ A0 です。一度でも正しく計算されたら フラグ A1 にします。

変数の初期値が不定、つまりどんな値が入っているかどうか分からない時(フラグ A0 の時)は、これらの変数を表示させるとおかしなことになるので、変数表示を行いません。一回でも温度変数を計算すれば(フラグ A1 となる)、正しい値が入るので、フラグ A0 でない時だけ、温度変数を表示させるようにしています。

計算式表示を行っても、これら温度変数の計算を行わないので、温度変数は不定かも知れません。だから、フラグ A1 にしてはいけません。計算式を表示する時、既に温度変数が正しくなっていることもあるので、その場合は温度変数を表示します。要するに、計算式を表示する時に、フラグ A を触ってはいけません。

上のコードに書いた <[EXIT] キーが押されるまで、ここで処理を止める>の部分は、以下で検討します。



[EXIT] キーでメイン画面に戻す処理の追加

[EXIT] キーが押されるまで、処理を止めるには、Getkey とループを組み合わせて実現します。

While Getkey≠73
WhileEnd


このようにわずか2行で実現できます。汎用性の高い方法なので、覚えておくと便利です。

≠ の入力方法
[FUNCTION] [3] (3:PROG) [▼] [2] (2:≠)


さて、[EXIT] キーのキーコードは、73 です。

While ループは、WhileWhileEnd の間を繰り返す時使い、以下の書式になります。

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 7Chapter 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 / 目次




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ



 


keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ




関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを作って、使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR