Casio Basic入門47

Casio Basic入門
<目次>

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

修正:2016/12/24


 4. CasioBasicを使ってみる(続き)

Chapter 8 - 初級

前回: Casio Basic入門46 を見る


◆ Chapter 8 の目標: Basic コマンドを使ってみる

メニュー選択や入力にBasic コマンドたけを使って、温度の単位変換プログラムを作りました。出力には、プログラムの冒頭では簡単なため、旧来の " "(出力)命令をまだ併用しています。


温度換算プログラム 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



プログラム全体の流れをまとめてみます。プログラムは上から下へ順に処理が進んでゆくものだと理解することがとても重要です。そして、特定のコマンド、例えば If 文Do 文While 文Break コマンド 或いは ⇒ (条件ジャンプ)命令などがある時のみ例外的に処理の順序を変える、と理解することが基本になります。そして、今回のプログラムを機能ごとにまとめると、以下のような流れになっています。

プログラム全体は、Lbl 0Goto 0 により無限ループになっています。
その中では、[表示] を行うブロック、[メニュー選択とメニュー番号取得] を行うブロック、そして [温度入力と換算] を行うブロックに分けられます。

ここで、是非注目してもらいたいのは、これらの機能別の処理ブロックは、上から下へ順に処理が流れていることです。このように、各処理ブロックが上から下へ順に流れるようにプログラムを作ると、プログラムが分かりやすくなります。こうしておくと、機能変更や機能追加は、特定の処理ブロックに集中して行えば良くなり、結果的に修正、機能追加、バグ潰しが楽になります。

このように、機能ごとにまとめた処理ブロックが上から下へ流れてゆくような構造のプログラムを作る手法を構造化プログラミングと言って、一般に推奨される考え方です。Casio Basic は構造化プログラミングが出来るのです。


プログラムの構造

Lbl 0

 [表示]

 [メニュー選択とメニュー番号取得]

 [温度入力と換算]

Goto 0



さて、fx-5800P のような電卓でのプログラムは、プログラムを強制終する [AC] キーが備わっているので、プログラム終了に [AC] キーを使えば、終了のためのコードを書く必要が無いので、プログラミングは楽になります。
 
この方法が良いと思ってきたのですが、最近ちょっと考えが変わってきて、プログラムを正常終了させた方が良いのではないかと、思い始めています。その理由は前回書いていますが、どちらが正しいと言うことは無いと思います。好みの問題であり、ポリシーの問題でもあります。

どちらが正しいかは横に置いておいて、正常終了させるプログラムも作れることを紹介します。

そこで今回は、[EXIT] キーで正常終了させる方法を盛り込みます。



Chapter 8-6
[EXIT] キーで正常終了させる

プログラムのメイン画面を以下のようにします。

TC9-Main 

そして、[EXIT] キーを押したらプログラムが終了します。

まず方針を決めます。

[EXIT] キーが押されたことを検出するには、Getkey を使います。既に、計算式表示からメイン画面に戻る時に、[EXIT] キーを利用しているので、具体的には同様のコードを適用します。 

次に、どうやってプログラムを正常終了させるのか? プログラムの処理が一番下、つまりプログラムコードの最後までたどり着いたら、正常終了します。

一方で、今のプログラム TC8 は、Lbl 0Goto 0 の間を無限に繰り返す(無限ループ)構造です。そこで、[EXIT] キーで正常終了させるには、[EXIT] キーが押されたら無限ループから脱出して、プログラムの一番下に処理が進むようにします。都合の良いことに、Caso Basic には、他の Basic と同様に ループから脱出するための Break コマンドが用意されているので、それを使います。

Break コマンドは、以下のループなら、そこからから抜け出せます。
 ・While ループ
 ・Do ループ
 ・For ループ


しかし、LblGoto によるループでは、Break コマンドで脱出できません。これは、Break コマンドの仕様です。

 ⇒ Casio Baisc コマンドリファレンス - Break


そこで、現在の Lbl / Goto ループを While / WhileEnd を使った無限ループに変更します。結論から言えば、

Lbl 0
・・・
Goto 0




While 1
・・・
WhileEnd


に置き換えます。


While 文の書式
While [ループ継続条件]
[処理]
WhileEnd


While / WhileEnd ループを無限ループにするには、[ループ継続条件] が必ず成り立つ、つまり常に「真」となるようにします。

実は、0「偽」で、0 以外「真」と言うのが、プログラミング言語では標準で、Casio Basic もこれに従っています(取扱説明書には書かれていませんが...)。

そこで、

While 1
[処理]
WhileEnd


としたら、無限ループになるわけです。


次に、[EXIT] キーを検出したら Break を実行するように修正します。ここで、[メニュー選択とメニュー番号取得] のブロックを以下に抜き出します。

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M


[EXIT] キーのキーコードは 73 なので、L73 になった時に Break を実行すれば、一気に While 1 / WhileEnd ループから脱出します。これを実現するには、

L=73⇒Break

を上のブロックの一番下に追加します。


最後に、メイン画面の一番下の行(4行目)の表示を忘れずに変更します。

Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"




以上をまとめて、プログラム TEMP CONV とします。

先ず、プログラム TC8 のファイル名を TEMP CONV に変更します。プログラムの修正とプログラム名の変更の具体的な操作方法は、Chapter 7Chapter 8 でこれまでに説明しているので、割愛します。

温度換算プログラム TEMP CONV
0→A
While 1


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,"<EXIT>"
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
K=73⇒Break

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

WhileEnd



では、これを実行してみます。

[EXIT] キーを2回押して Program Manu 画面へ戻り、

TC7-ProgMenu 

[2]
(2:RUN)Prog List 画面に切り替え、 

TC9-PROG_ProgList 

TEMP CONV にカーソルがあるので、そのまま [EXE] キーでプログラムを起動します。

TC9_Main 

ここで、[EXIT] を押すと、プログラムは終了するはずです。

TC9-Quit_Done 

右下に Done と表示があり、プログラムが正常終了したことが分かります。

ここで、[EXIT][EXE][AC] のいずれかを押せば、Prog List 画面に戻ります。


さて、最後の仕上げを行います。右下の Done 表示だけでは、プログラム終了を示すには控えめな気がするので、終了時には以下のような画面にしようと思います。

TC9-Quit_Bye 


そこで、
WhileEnd の下に、画面消去コマンド Cls と Locate 7,2,"BYE!" を追加することにします。

!の入力方法
[FUNCTION] [1] (1:MATH) [5] (5:X!)

Cls は画面消去を行います。 



温度換算プログラム TEMP CONV
0→A
While 1


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,"<EXIT>"
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
K=73⇒Break

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

WhileEnd
Cls
Locate 7,2,"BYE!" 



もう一度、動作確認します。

TEMP CONV を起動すると、

TC9_Main 

[FMLA] を押して、計算式を表示、

TC9-Formula 

ここで、[EXIT] 押すと、

TC9-Quit_Bye 

メイン画面に戻らず、プログラムが終了してしまいます。

計算式が表示されている時、[EXIT] を素早く叩いて、できるだけ短い時間だけ押すと、メイン画面に戻ることもありますが、

TC9_Main 

チョット油断すると、プログラムが終了していまいます。

その理由を考えてみます。

メイン画面から正常終了する時にも [EXIT] キーを押すので、計算式表示画面で [EXIT] キーを押す時間が少しでも長いと、メイン画面に戻っても [EXIT] キーが押されたことになるので、すぐに終了するわけです。

計算式画面からメイン画面に戻る時のキーと、正常終了するキーを、別のものにすれば、この問題は解決します。しかし、それでは面白くないので、今回は両方とも [EXIT] キーを使うことにして、問題を解決します。実は、定番の方法があります。

作戦は以下の通り;

1) 計算式画面表示中は、[EXIT] キーが押されるまで While ループが回っている

2) [EXIT] キーが押されたら、この While ループから脱出 

3) [EXIT] キーが押された状態では、プログラムが先へ進まないように、 次のループに入る

4) [EXIT] キーが離されたら、そのループから脱出する

5) メイン画面に戻るが、[EXIT] キーは押されていないことが確実なので、改めて [EXIT] キーを押さない限り終了しない


要するに、3) を実現すれば良いのですが、以下のように赤文字の2行を追加するだけです。

While Getkey≠73
WhileEnd

While Getkey
WhileEnd


緑色の上2行は、[EXIT] キーが押されるまで回り続けるループで、1) と 2) を実現しています。
赤色の下2行は、[EXIT] を含めて何かキーが離されるまで回り続けるループで、3) を実現しています。

Getkey は、それが実行された時に何もキーが押されていない時は、0 になります(0 を返す、と言います)。何かキーが押されていると、2桁のキーコードを返すので、Getkey は2桁の数値、つまり 0 以外の値を持っています。

While [ループ継続条件] 
WhileEnd

という書式で、[ループ継続条件] が 0以外 つまり「真」の時は、ループが回り続けます。[EXIT] キーがまだ押されている状態では、Getkey73 、つまり 0 以外(=「真」) なので、ループは回り続けます。

[EXIT] キーが離されたら、Getkey0 になるので、[ループ継続条件]0 (=「偽」になるので、ループから脱出します。

この2行の赤文字While ループは、キーが離されるまでプログラムの実行が先へ進まないようにする関所の役割を果たしています。

ちなみに、

While Getkey
WhileEnd




While Getkey≠0
WhileEnd


は、全く同じ動作をします。これは、Getkey が戻り値を返すと言う性質を利用しています(詳細は前回説明しています)。
そして、≠0 が無い方が動作は速くなるので、上の表記を用いるほうが良いでしょう。


以上のように、Getkey と ループを使いこなすことで、キー操作をうまく制御することができ、Casio Basic を含めた Basic プログラミング習得のための重要ポイントです。そのようなわけで、Casio Basic入門の最初の Chapter 1 では、GetkeyLocate コマンドを使いこなすことを目標にしているわけです。

 ⇒ Casio Basic入門3 Chapter 1 - Getkey と Locate を使いこなす



ここまでをまとめます。

温度換算プログラム TEMP CONV
0→A
While 1


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,"<EXIT>"
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
K=73⇒Break

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
While Getkey
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"



プログラム修正が終わったら、[EXIT] キーを2回押して、Program Menu 画面に戻ります。

TC7-ProgMenu 

[2] (2:RUN) で、Prrog List を表示さると、TEMP CONV にカーソルが合っているので、

TC9-PROG_ProgList 

そのまま [EXE] キーを押せば、TEMP CONV が起動します。

TC9_Main 

[FMLA] キーで計算式画面を表示

TC9-Formula 

[EXIT] キーを押したままにしてみると、何も変化は起こらず、

TC9-Formula 

[EXIT] キーを離すと、画面が切り替わり

TC9-Main 

メイン画面に戻ります。つまり、[EXIT] キーを離したら先に進むようにプログラムを書いたので、その通りの動作になっていることが確認できまし。計算式表示画面で、普通に [EXIT] キーをポンッと叩けば、違和感無くメイン画面に戻ると思います。

メイン画面で、改めて [EXIT] を押すと正常終了します。

TC9-Quit_Bye 

ここで、[EXIT]、[EXE][AC] のいずれかのキーを押せば、Prog List 画面に戻ります。

TC9-PROG_ProgList 

[EXE] で再び起動します。

TC9-Main 


ところで、バナナを液体窒素に漬けて凍らせると、釘が打てる...と言うのを見たことがあると思います。液体窒素はとても低温で、絶対温度で77度です。そこで、絶対温度77Kは、摂氏何度か? 調べて見ましょう。

[3] キーを押すと、入力ボックスが現れるので、

TC9-Press_Menu3 

ここで、77 と入力し、

TC9_Press_77K 

インジケータ <EXE>:ENTER に従って、[EXE] を押すと、入力が確定され、

TC9_result_77K 

摂氏と華氏の換算温度が表示されます。液体窒素温度は、-196.15℃ なのですね。



これで温度換算プログラム TEMP CONV が完成です。完成したプログラムは、COMP モードから実行することをお勧めします。COMP モードから実行すると、強制終了した時に、うっかりプログラムを触ってしまう危険性が無いからです。

但し、TEMP CONV は強制終了ではなくて、正常終了するようにしていますので、この心配はありません。念のため、COMP モードからプログラムを起動してみます。

[MODE] [1] (1:COMP)COMPモードに戻ります。

[FILE] キーを押して、Prog List を表示

TC9-COMP_ProgList_TimeZone 

[▼] [▲] キーで TEMP CONV にカーソルを合わせ

TC9-COMP_ProgList_TempConv 

[EXE] キーで TEMP CONV を起動します。

TC9-Main 

色々と操作してから、[EXIT] キーで終了させます。

TC9-Quit_Bye 

さて、本当に終了させるには、ここで [AC] キーを押す。

[EXIT] キーを押しても、何も変化はありません。

ここで [EXE] を押すと、再び TEMP CONV が起動します。これは以前も紹介している COMP モードでの特徴ですね。

プログラム終了時は、PROGモードで起動したか、COMPモードで起動したかで、多少異なることが確認できました。



温度換算プログラムを Chapter 7 では、 旧来の?(入力)命令を使って作り、それを Capter 8 では、Basic コマンドに置き換えました。

既に Basic を使いこなしている人には、Chapter 8 の内容は簡単だと思います。そして 構造化プログラミングが可能な 新世代Casio Basic の能力を再認識できたと思います。

プログラミング経験の少ない人には、Chapter 8 の内容は慣れない部分もあると思います。ループを使いこなすことはプログラミング習得の第一歩です。Casio Basic で習得すれば、次に パソコンなどで Basic プログラミングを行う時にそのまま役立ちます。


さて、新世代 Casio Basic は fx-5800P だけでなく、他のグラフ関数電卓にも搭載されています。そこで、次回は ここまで作った温度換算プログラムを fx-9860GII に移植することにします。





つづく...

Casio Basic入門48 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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



関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR