Casio Basic入門49

Casio Basic入門
<目次>

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

2015/04/17
修正 2017/08/16

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

Chapter 8 - 初級

前回: Casio Basic入門48 を見る


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

前回で、fx-9860GII 専用入力ボックスの準備が整いました。今回は、残りの移植作業を進めます。

移植前の fx-5800P 用プログラムを再掲載します。変更する部分を赤文字で示しています。

fx-5800P:温度換算プログラム 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
WileEnd
IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"



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

Chapter 8-8
fx-9860GII へプログラムを移植する


新世代 Casio Basic は、機種間の互換性は高いのですが、移植するにあたって、幾つかの制限があります。

fx-5800P から fx-9860GII への移植時に互換性の無いもの

出力" "(出力命令詳細動作がかなり異なる
(出力)命令fx-9860GII では -DISP- 表示にブロックされる
Cls コマンドfx-9860GII では ClrText コマンドに置き換える
入力(入力)命令fx-9860GII では ?A と言う記法が使えない
Getkey コマンドキーコードが全く異なる
変数配列変数fx-9860GII では 配列変数が無い
行列記法が異なる
その他キー同じキーが必ずしも無い
関数記法が異なることがある
プログラム名fx-9860GII では 8文字以下

" " (出力)命令は、表示行の全てを上書きします。同じ行に 先に Locate コマンドで表示してあると、それを上書き消去してしまいます。表示行を " " 命令だけで表示する場合のみ、互換性があります。

(出力)命令
-DISP- と言う表示で1行占有される。先にLocate コマンドで表示された1行が -DISP- で完全に上書きされ、画面設計が潰されます。

?(入力)命令
?A と言う記法が使えず、?→A のみが使えます。?A と書くと、変数 A に入っている値を表示した上で、そのままで良ければ[EXE] で確定できる付加機能が得られ、使いやすいプログラムが作れます。fx-9860GII ではこの機能を使えず、?→A を書くしかありません。

Cls
fx-9860GII では ClrText と書き換えます。機能は全く同じなので書き換えるだけで使えます。
[2017/08/16 修正] fx-9860GII の Cls は グラフィックス画面の消去のみを行います。というのも、グラフィックス画面の消去コマンドには ClrGraph もありますが、これは同時に座標系をデフォルトの論理座標系に変更します。Cls は座標系の変更は行わずにグラフィックス画面の消去のみを実行します。

Getkey
キーコードが全く異なるので、キーコードを変更します。Getkeyコマンド自体の動作は全く同じです。

配列変数
fx-9860GII には無いので、行列に置き換えれば使えます。

行列
扱う際の書式が一部異なるので、そこを修正すれば使えます。

キー
同じキーが無いことがあります。

関数
関数の記法が一部異なります。

ファイル名
fx-5800P は12文字以内、fx-9860GII は 8文字以内。


旧来の命令は、Basicコマンドほど互換性が高くなく、どうやっても同じ動作を実現できないことがあります。詳しくは、下記を参照してください。
 ⇒ fx-9860GIi への移植 - 厄介な旧来の命令
 ⇒ fx-9860GII への移植 - 素因数分解
 ⇒ fx-9860GII への移植 - ピタゴラス数

一方、Basic コマンドは、適切な変更を行えば、100%の移植が可能です。


温度換算プログラム TEMP CONV について言えば、

 ・ Getkey使用の際して、キーコードを変更する。
 ・ ClsClrText に変更する。
 ・[FMLA] キーが無いので、他のキーに変更する。
 ・ ファイル名 TEMP CONV を8文字以内に変更する。

先ずはこの程度の変更で、同じ動作を行うプログラムとして移植できます。上のプログラムコードで赤文字で示した部分が、移植に際して変更が必要です。

なお、Chapter 7 で作ったプログラムは、?命令の機能が異なるので、100%同じ動作をさせる移植は不可能です。fx-9860GII などのグラフ関数電卓への将来の移植を考える場合は、旧来の命令はできるだけ使うべきではありません。



キーコードの変更

TEMP CONV で使うキーコードについて、fx-5800P と fx-9860GII の違いをまとめます。

キーコード
キーfx-5800Pfx-9860GII
[1]3572
[2]3662
[3]3752
[EXIT]7347
[FMLA]74---
[VARS]---58

計算式を表示させるためにfx-5800P では [FMLA] キーを利用しましたが、fx-9860GII にはこのキーは無いので、変わりに [VARS] キーを使うことにします。

TC10-9860GII 

[VARS] キーは [EXIT] キーの左上にあって、互いに近いので、使いやすいと思います。


Cls → ClrText の変更

単に書き換えるだけでOK.。


ファイル名の変更

TEMP CONV は9文字なので、8文字以内にするためにスペースを取って TEMPCONV に変更する。



以上の変更を反映させると、以下のプログラムになります。

fx-9860GII:温度換算プログラム TEMPCONV
0→A
While 1


ClrText
"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,"<VARS>"

-1→M
Do
Getkey→L
LpWhile L=0
L=72⇒1→M
L=62⇒2→M
L=52⇒3→M
L=58⇒4→M
K=47⇒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
ClrText
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≠47
WhileEnd
While Getkey
WileEnd
IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"




これを実行してみます。

fx-9860GII の電源を入れ、[MENU] キーで MAIN MENU 画面を表示;

TC10-MainManu_1 

矢印キーで PRGM アイコンを選択;

TC10-MainMenu_2 

そして [EXE] キーを押すと Program List が表示されます。

ProgramList 

矢印キーでカーソルを移動させ、TEMPCONV を選択

TC10-ProgramList 

[EXE] キーか [F1] (EXE) を押すと、プログラムが起動します。

TC10-Main 

なんだか間の抜けた感じですね。後で、それらしくなるように表示を変更することにします。先ずは動作確認をします。

[1] キーで、入力ボックス起動

TC10-[1] 

摂氏 -40 を入力し、

TC10-Input-40 

[EXE] で入力確定すると、換算結果が表示されます。

TC10-Converted 

換算は正常のようですね。では、[VARS] キーを押して計算式を表示させてみます。

TC10-Dormula_1 

では、[EXIT] キーでメイン画面へ戻ります。念のため、[EXIT] キーを押っ放しにしてみてください。

何も画面変化がなければ正常です。では [EXIT] キーを離してみると、

TC10-Converted 

メイン画面に戻りました。

プログラムを終了させるために、[EXIT] キーを押すと、

TC10-Quit_Bye 

正常終了の画面が現れます。ここで、[EXIT][AC][EXE] のいずれのキーを押しても、Program List 画面に戻ります。

TC10-ProgramList 


これで、機能面では正常であることが確認できました。



さて、間抜けな感じの表示をなんとかしたいと思います。

fx-9860GII 用の画面をどのようにするかは、それぞれ好みがあると思いますが、ここでは以下のような画面にしようと思います。

TC10-Main_2 

TC10-Formula\2 

TC10-Quit_Bye_2 

先ずは、画面表示変更に挑戦してみてください。次回は、この画面に変更する方法を紹介します。







つづく...

Casio Basic入門50 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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




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

Casio Basic入門48

Casio Basic入門
<目次>

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

2015/04/10
修正 2017/08/16

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

Chapter 8 - 初級

前回: Casio Basic入門47 を見る


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

fx-5800P 用に 温度換算プログラムを作りました。

fx-5800P:温度換算プログラム 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
WileEnd
IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"


fx-9860GII への移植で変更するところを赤文字で示しています。



Chapter 8-7
fx-9860GII 用入力ボックスを準備する

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

新世代 Casio Basic は、機種間の互換性は高いのですが、移植するにあたって、幾つかの制限があります。

fx-5800P から fx-9860GII への移植時に互換性の無いもの

出力" "(出力命令詳細動作がかなり異なる
(出力)命令fx-9860GII では -DISP- 表示にブロックされる
Cls コマンドfx-9860GII では ClrText コマンドに置き換える
入力(入力)命令fx-9860GII では ?A と言う記法が使えない
Getkey コマンドキーコードが全く異なる
変数配列変数fx-9860GII では 配列変数が無い
行列記法が異なる
その他キー同じキーが必ずしも無い
関数記法が異なることがある
プログラム名fx-9860GII では 8文字以下

" " (出力)命令は、表示行の全てを上書きします。同じ行に 先に Locate コマンドで表示してあると、それを上書き消去してしまいます。表示行を " " 命令だけで表示する場合のみ、互換性があります。

(出力)命令
-DISPー と言う表示で1行占有れ、Locate コマンドによる画面設計を潰されます。

?(入力)命令
?A と言う記法が使えず、?→A のみが使えます。

Cls
fx-9860GII では ClrText と書き換えます。機能は全く同じなので書き換えるだけで使えます。
[2017/08/16 修正] fx-9860GII での Cls はグラフィックス画面の消去のみを行います。ちなみに ClrGraph もグラフィック画面の消去ですが、画面消去と同時に座標系を デフォルトに論理座標系に戻します。これに対して Cls は座標系は変更せずグラフィックス画面の消去のみを実行します。

Getkey
キーコードが全く異なるので、キーコードを変更します。Getkeyコマンド自体の動作は全く同じです。

配列変数
fx-9860GII には無いので、行列に置き換えれば使えます。

行列
扱う際の書式が一部異なるので、そこを修正すれば使えます。

キー
同じキーが無いことがあります。

関数
関数の記法が一部異なります。

ファイル名
fx-5800P は12文字以内、fx-9860GII は 8文字以内。


旧来の命令は、互換性が低く、移植時に思わぬ仕様違いから混乱するかも知れません。旧来の命令を使う限り、どうしても fx-5800P と同じ動作を実現できないこともあります。詳しくは、下記を参照してください。
 ⇒ fx-9860GIi への移植 - 厄介な旧来の命令
 ⇒ fx-9860GII への移植 - 素因数分解
 ⇒ fx-9860GII への移植 - ピタゴラス数

一方、Basic コマンドは、適切な変更を行えば、100%の移植が可能です。

さて、温度換算プログラム TEMP CONV では、e-Gadget オリジナルの入力ボックスを利用しています。先ずは、fx-5800P 用の入力ボックスではなくて、fx-9860GII を利用する必要がありまず。

今回は、その準備をします。



fx-5800P から fx-9860GII への入力ボックスの移植は、以下で紹介しています。
 ⇒ Casio Basic入門37

また、プログラムライブラリにも収録しています。
 ⇒ fx-9860GII プログラムライブラリ - 入力ボックス
 
fx-9860GII は、パソコンとのリンクができる点が、fx-5800P よりも便利な利点です。fx-9860GII をパソコンと繋ぎ、Casio Basic プログラムを 拡張子 g1m のファイルとして、パソコンに転送できますし、その逆もできます。

上記のプログラムライブラリから、入力ボックスをパソコンにダウンロードしてから、fx-9860GII へ転送できるので、自分で入力する必要はなく、入力間違いの危険性もありません。

今回の温度換算プログラムでは、IN 2.1G for fx-9860GII を使います。これをダウンロードしてください。プログラム名 IN です。

プログラム名は、fx-5800P と同じなので、入力ボックスが fx-9860GII に有れば、温度変換プログラムで 入力ボックスを使う部分は、変更なしで動作します。

念のために、以下のテストプログラムを入力して、転送した入力ボックス IN 2.1G for fx-9860GII の動作確認をしてみてください。

プログラム TEST
0→Z
"1:"
"2:"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
L=72⇒1→M
L=62⇒2→M

Locate 1,4,"           " 
(スペース21個)

If M=1:Then
3→X:1→Y:10→D:2→E
Prog "IN"
Else If M=2
Then
3→X:2→Y:9→D:1→E
IfEnd:IfEnd

Locate 1,4,"Z="
Locate 3,4,Z

WhileEnd


==========

正しく動作しますか?

fx-9860GII はCPUが速いので、より快適に入力ボックスを使えます。



さて、冒頭に記載したプログラムで、赤文字で示した部分が、fx-9860GII への移植の際に変更が必要なところです。

 ・ Getkey使用に際して、キーコードを変更する。
 ・ ClsClrText に変更する。
 ・[FMLA] キーが無いので、他のキーに変更する。
 ・ ファイル名 TEMP CONV を8文字以内に変更する。

これだけで、同じ動作を行うプログラムとして移植できます。

次回までに、移植を試してみてください。それほど難しくないと思います。




つづく...

Casio Basic入門49 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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




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

Casio Basic入門1

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現などは随時追記・修正します.
最終更新:2017/08/06


はしがき
[2014/11/03追記]

fx-5800P を買ってきてプログラムを作ってみようと思い、取扱説明書を見ると、プログラムが分かる人向けのヒントくらいしか書かれていません。

これはヒドイ!!(以前は良かったのに...このあたりは「1.はじめに」で紹介してます)

とりあえずプログラミングを始めたものの、細かいことは、色々と試行錯誤を繰り返さないと分かりません。こうして、取扱説明書には書かれていない詳しいことが、少しづつ分かってきました。

プログラムを作りながら色々と調べているうちに、fx-5800P に搭載されているプログラミング言語:Casio Basic は、かなり優れモノだと分かってきました。プログラミング経験者向けに Casio Basic の面白さを一言で紹介すると、「電卓で使える構造化BASIC 」 です。

なかなか優れている Casio Basic なのに、こんな取扱説明書では、さっぱり使いこなせない人が多いだろうし、経験者が取扱説明書を読むと、未だに古い Basic 風言語と変わらないと思うだろうし、良さを知らないままにプログラミングを諦める人も多いだろうと思うので非常にもったいないと思います。

新世代 Casio Basic が使える fx-5800P は、非力なプロセッサしか積んでいないにもかかわらず、まともな実用プログラムを作れます。さらに、fx-5800P はプログラムを呼び出して使う利便性が高く、高機能な fx-9860GII や fx-CG20 よりも便利なことは、あまり知られていないのではないでしょうか? 

自分の必要性に合わせて、いくつもの実用プログラムを作ってみて、分かったこと試してみたこと を含めて、取扱説明書では絶対にわからない Casio  Basic の使いこなしを整理したものが Casio Basic 入門 講座です。それと並行して、取扱説明書では絶対にわからない Casio Basic のコマンドリファレンス 、逆引き Casio Basic を公開しています。

「1.はじめに」 では、Casio Basic や fx-5800P の歴史や特徴を私見を交えて書いていますので、「2.プログラミングとは」まで飛ばしてもらって結構です。



1.はじめに [2015/01/04 修正]

私が初めて手にした電卓が、カシオのFX-502Pという関数電卓でした。手帳サイズでプログラミングできる画期的な製品で、世界中にカシオファンを増やした原動力となったようです。

fx-502P 
手帳タイプのソフトカバーが付属した FX-502P

私がFX-502P を入手した当時は、関数電卓として使っていて、プログラミングの「プ」の字も知りませんでした。その後プログラムに興味を持ち、生まれて初めて作ったのが、FXー502Pのプログラム「反射ゲーム」
画面表示が変化した直後に、どれだけ早く反応してキーを押せるか...そんなゲームでした。
 ⇒ FX-502P / 602P / 603P のプログラム

カシオはFX-502Pに続いて、プログラム互換性の高い後継機として、1981年にFX-602P、1990年にはfx-603Pを発売しました。
FX-602P には取扱説明書だけでなく、「プログラムライブラリー」と言う厚い本が付属していて、それには数多くの実用プログラムが掲載されていました。掲載されているプログラムを入力し、理解し、さらに自分なりに改造することで、プログラミングがどのようなものか、少し分かりました。きちんと動作するサンプルプログラムを参考にして、自分でプログラムを改造する作業が、プログラミングの学習には非常に有効だと実感しました。

これらのプログラム機能は、今思えばアセンブリ言語に近い感じで、電卓のメモリに直接あるいは間接的にアクセスして、ジャンプはインクリメント/デクリメントを行うことができるなど、工夫のしがいがある面白いもので、プログラミングの好きな人には楽しく遊べるものでした。

その後登場したプログラム互換のFX-602P や FX-603P は、アルファベット表示が可能になり、記憶容量が増えたことで、測量計算などの実用に耐えるプログラム関数電卓として不動の地位を得てきました。プログラム言語としての完成度、ハードウェアとしての使いやすさがユーザーに支持された結果でしょう。


プログラミング言語仕様から読み解く Casio Basicの開発史

カシオは、プログラム関数電卓とグラフ関数電卓、そしてポケットコンピュータの3系統で、搭載言語の開発を進めている時期がありました。ポケットコンピュータはPCの高機能化、小型化、低価格化により市場からその姿を消しました。プログラム関数電卓では、fx-4850P を最後にプログラミング言語のバージョンアップを止め、新製品が出なくなりました。そして、唯一グラフ関数電卓が搭載言語とともに進化してゆきました。

プログラム関数電卓 fx-4000番台の製品に搭載された言語は、使いにくく、中途半端な仕様のまま成功せずに終わったと感じています。私見ですが、fx-4000番台では、2行表示の液晶ディスプレイを使って構造化プログラミングを実現しようとして、うまくいかなかったのではないかと、その跡が感じられます。

一方で、グラフ関数電卓での搭載言語は着実な進化を見せました。fx-7400シリーズでは、一応 構造化Basic といえる形にまで進化しました。そして、2005年に登場した CFX-9580GC PLUS の Casio Basic では、ついに GetkeyLocate コマンドが搭載され、現在の世代のCasio Basic に近づきました。但し制御構文の改行ができないので、もう一歩という感じです。しかし、これは Casio Basic の歴史上極めて重要な一歩だと言って良いと思います。GetkeyLocate が、Casio Basic の実用性を格段に向上させているからです。

翌年の 2006年に登場した fx-5800P は、基本的に CFX-9850GC PLUS の Casio Basic をベースに制御構文の改行を許すように改造され、さらにグラフィックス関連とI/O関連のコマンドを取り去り、あとはほぼ同じ構成で実装して、さらに使いやすく進化しました。

代表的な改良点を挙げてみます。

入力命令 ?A では、変数 A に既に入っている値を表示し、変更がなければ [EXE] キーを押すだけで確定できる機能が追加されました。一方、?→A とすれば、A の値を表示せずに新たに入力させます。この ?A の機能は、変更が無ければ [EXE] を押すだけで良いので、作成したプログラムの使い勝手が格段に向上します。現在のところ、この機能があるのは、fx-5800P と fx-FD10 Pro のみで、グラフ関数電卓にはこのような便利な機能はありません。

[FILE] キーでプログラムリストを表示し、そこからプログラムを実行できる機能も、fx-5800P の利便性を向上させる優れた改良だと思います。これが可能なのは、他には fx-FD10 Pro のみです。グラフ関数電卓では、一旦プログラムモードに入らないとプログラムを呼び出せません。

CFX-9850GC PLUS にあった グラフィックス関連とI/O関連のコマンドは、fx-5800P にはありません。fx-5800P をプログラム関数電卓に位置づけるなら、グラフィックス関連のコマンドは不要といっても良いと思いまが、I/O関連コマンドは残して欲しかったと思います。結果的に、fx-5800P の最大にして唯一の弱点はI/O関連だと思います。電卓とPCの間で、プログラムファイルをやりとりするPCリンク機能が無いのも fx-5800P の利便性を発揮しきれない仕様上の大きな弱点です。

このような弱点があるものの、fx-5800P は、グラフ機能の無いプログラム関数電卓として、極めて大きく進化した Casio Basic を搭載し、プログラム電卓としてバランスの取れた、そして関数電卓としても使いやすい優れた製品です。

プログラム関数電卓として大成功を納めた FX-502P や FX-602P の最終進化形 の FX-603P は、結果的に21世紀に入っても販売が続き、その製品寿命は10年以上の長きにわたりました。趣味ではなく仕事用に実用プログラムが使われ続け、ユーザーの大きな支持に答え続けた結果なのだと思います。FX-603P の実用品としての完成度の高さの証明でもあります。FX-603P に取って代わるプログラム関数電卓が永らく登場しませんでした。

※参考: プログラム関数電卓ノスタルジア(Casio fx-502P、fx-602P、fx-5800P)

さて、グラフ関数電卓で熟成してきた新世代 Casio Basic を機能制限して搭載した fx-5800P は、しばらく FX-603P と併売されていましたが、ついに FX-603P が生産中止となりました。fx-5800P が プログラム関数電卓 FX-603P の後継機となったわけです。

その後も Casio Basic の改良がグラフ関数電卓で続き、fx-9860GII で文字列処理コマンドが追加搭載され、ハードウェアとしては高精細カラー液晶搭載した fx-CG10/20 が登場しています。そして 2015年1月時点での最新機種、fx-FD10 Pro は、fx-5800P の利便性と最新の Casio Basic を搭載したハイブリッド機とでも言える、面白い性格を持っています (fx-FD10 Pro は Casio Basic専用機です。fx-9860GII とほぼ同じハードウェアを使いながらアドインが使えない設定にした判断は、販売戦略上のものなのでしょう)。

気がつけば、新世代プログラム関数電卓 fx-5800P は、2006年の登場から10年になろうとしており、その製品寿命を超える可能性も見えてきました。使用しているIC類などの部品調達の継続性を考えれば、FX-603P と同様に 10年を1つの区切りとすれば、2016 年には fx-5800P の後継機種が期待されるところです。

2014年12月に、スタンダード関数電卓の新シリーズ fx-JP500, fx-JP700, fx-JP900 (CLASSWIZ シリーズ) が発表され、順次発売が開始されました。高精細液晶の搭載、省電力でありながらCPUの大幅な処理速度向上、その他様々な改良が加えられ、死角が殆ど無い関数電卓と言えます。fx-JP900 のみに搭載された表計算機能 は、データ保存機能が無いので実用的とは言えないものの、実力をアピールする意味は十分にあります。この表計算が、操作性やユーザーインターフェースの面でグラフ関数電卓 fx-9860GII に似ていることは、大変興味深いのです。

高精細液晶と高速・省電力CPUと言う新しいハードウェアに加えて、グラフ関数電卓と酷似した表計算機能を新ハードウェアで走らせる機能のアピールは、発売開始から9年目の fx-5800P の後継機種がそろそろ現実性を帯びてきているのではないかと、大きな期待を寄せています。 

[2017/07/02 追記]:fx-CG50 が欧米で販売開始
2017年春に fx-CG10/20 の後継機として fx-CG50 が欧米で発売開始されました。残念ながら日本国内では発売開始の情報はありません。fx-CG50 は fx-CG10/20 とほぼ同じ仕様で、アドインプログラムも使え、さらに処理速度が1.5倍程度速くなっているようです。そのデザインは fx-JP900 と極めて似通ったものになっています。アメリカで fx-CG10 PRIZM が発売されてから1年後に 日本で fx-CG20 として発売開始されたので、fx-CG50 の国内販売が行われるとしても1年程度遅れる可能性がありそうです。

最新のグラフ関数電卓 fx-CG50 (2017) 

カシオは、プログラム電卓については欧米ならびに中国市場を中心に考えているののが残念なところですが、シャープがプログラム電卓開発から事実上撤退している状況で、日本企業として唯一カシオがプログラム電卓の開発を続けていることは、歓迎したいと思います。

このような状況下で、fx-5800P の後継機種の動向が気になります。fx-JP900 と fx-CG50 と同様のデザインで、これらの中間サイズの グラフィック機能を割愛したプログラム関数電卓が fx-5800P の後継として登場すれば面白いと思います。

===== 追記おわり ====




fx-5800Pの特徴

最新の Casio Basic から見れば、fx-5800P 搭載の Casio Basic はサブセット版と言えますが、プログラム関数電卓として不要な機能を省略しただけで、新世代 Casio Basic 搭載機としては、低価格で使い勝手の良い絶妙なバランスの製品です。

上て述べたように、fx-5800P の最大にして唯一の欠点が、作ったプログラムをPCにバックアップすることが出来ない点で、なんとも中途半端な仕様になっています。非常にもったいない。なぜこんな中途半端な仕様にしたのか?機会があれば、是非ともカシオに話を聞きたいところです。

fx-5800P で作ったプログラムは、もう1台の fx-5800Pへ転送することはでき、そのための通信ケーブルがオプションで用意されています。バックアップしたいなら「もう1台買って下さい」と言うわけです。 ここを参照

ところで、この通信ケーブル(3pinシリアルケーブル)は、fx-9860GII や fx-CG20 にUSBケーブルと共に標準添付されているものです。

fx-5800P の後継機種では、同様に3PシリアルケーブルとUSBケーブルを標準添付してPCリンク機能を実現してもらいたいものです。これがあれば、fx-5800P のプログラムも PCにバックアップ可能になるからです。

なお、私は作ったプログラムをエクセルに転記して、バックアップをしています。
[2014/09/30 追記] バックアップ用に、専用通信ケーブルと2台目のfx-5800P を購入してしまいました。但し、エクセルへのソースコードの記録は続けています。→ ここを参照


fx-502P&fx-5800P 
fx-502P と fx-5800P (写真は「プログラム関数電卓ノスタルジア(fx-502P、fx-602P、fx-5800P)」掲載のもの)

My ProgCalcs 20170806 
※ 管理人所有のプログラム電卓


fx-5800P は、薄型、軽量で上着の内ポケットに十分入る大きさです。そして、4行x16桁の液晶ディスプレイを搭載し、加えて新世代 Casio Basic が搭載されています。 高機能グラフ関数電卓 fx-9860GII も入手し、fx-5800P と比較していますが、改めて fx-5800P のバランスの良さを再認識しています。新世代 Casio Basic は、実用プログラムに加えて、ちょっとしたアクションゲームを作れるレベルの構造化Basic です(本ブログでも、いくつか紹介しています)。さらに、fx-5800Pは実売で6000円台前半なので圧倒的に購入しやすいのです。

カシオプログラム関数電卓 FX-5800P-Nカシオプログラム関数電卓 FX-5800P-N
(2006/09/22)
CASIO(カシオ)

商品詳細を見る


さて、新世代 Casio Basicを搭載した fx-5800P の取扱説明書では、プグラミングが分かっている人しか分からない程度の記述しかありません。その上、プログラム事例は殆ど紹介されていません。カシオは、紙のプログラムライブラリーやウェブでの情報も国内では用意するつもりはなさそうです。

2014/1/21 追記: fx-CG20の簡単なプログラミングの紹介を見つけました。申し訳ない言い方ですが、とりあえずやっつけたといった内容に感じられ、電卓の使い方の導入で終わっています。それが目的ならば敢えて申し上げることはありませんが、プログラミング入門としては、あまり力を入れているとは思われません。→ここ

一方で、海外では、カシオのホームページで動画による様々な説明(Webinar)が紹介されています。但し全て英語なので、明らかに日本人向けではありません。日本メーカーであるカシオ製品のサポートが、日本で積極的に行われないのは、非常に残念です。

Webinarの一例

そこで新世代 Casio Basic の良さを共有したいと考え、私なりの「Casio Basic入門」を公開することにしました。fx-5800P のプログラミングのしきいを下げてみよう、という試みです。合わせて、プログラミング経験者、特に長らく Casio プログラム電卓でプログラムを作ったことのある方には、新世代 Caso Basic が大きく進化していることを伝えたいという気持ちもあります。

[2017/08/06 追記]
この連載を始めた当初は、fx-5800P しか持っておらず、その後 fx-9860GII、fx-9860GII SD、fx-CG20、fx-CG50 を入手し、それらの Casio Basic でプログラムを作っています。その結果 これらの Casio Basic は互いに一定レベルの互換性が保たれるように考慮されていることが分かっています。fx-5800P で Casio Basic を使いこなせるようになれば、fx-9860GII シリーズや カラー高精細液晶の fx-CG20 / fx-CG50 でも問題無く使えるということです。



2. プログラミングとは
[fx-5800P] [fx-9860GII (SD) / fx-CG20 / fx-CG50]

プログラムの「プ」の字も知らない方のために、最初にあらかじめ知っておいて頂きたい基本的な事柄を紹介します。


プログラムって何だ?

プログラムと言うのは、「手順書」です。そして予め用意された単語と文法を使って、手順を書くことをプログラミングと言います。
手順を書くために使う言葉を「プログラミング言語」と言います。

そして、その単語と文法が分かればプログラムを書けるようになるわけです。

プログラムを読む相手は電子回路ですから、そこには情緒も感性も不要です。むしろ曖昧さがは有ってはなりません。厳密に一通りにしか解釈できないように書くために、単語や文法が考えられています。

言葉に動詞や文型があるように、プログラミング言語にもコマンド(命令)やステートメント(文)があります。これらの単語を覚え、文法を覚えるのは難しくありません。普通の外国語に比べると覚えることはとても少ないのです。Casio Basic については、覚えるべき事柄が非常に少ないので、さらに楽です。



プログラミング言語とは?

プログラムは手順書なので、基本的にはコマンド(動詞)と必要な名詞(目的語)をステートメントの規則(文型)に従って書きます。

「~をしなさい」  「~に~をしなさい」

といった短い文の組合せと繰返しで、プログラムは構成されます。


プログラミング言語には、多くの種類があります。C言語、java、BASIC、FORTRAN などを見聞きしたことは有りませんか?これらは最もよく用いられる代表的な言語です。これらの言語に一般的な優劣は有りませんが、それぞれ得意とするものが異なっています。

なお、これらの多くはアメリカで発明されたので、英単語から派生した単語を使い、語順は英文法に近くなっています。「O に V しなさい」 は、「V O」 といった語順になります。「ピアノを弾きなさい」「Play piano」 となるのと同じです(動詞 + 目的語)。

fx-5800P や fx-9860GII などのカシオのプログラム電卓には、BASIC が内蔵されています。但し、カシオが作った BASIC なので、Casio Basic と呼ばれています(特に海外のサイトでは、この表現をよく見ます)。基本的な単語や文型はパソコンで使う BASIC とほぼ同じです。

一部カシオ独自のものがありますが、古くからのユーザーのために残しているとのことです。古くから採用されていた独自のものは、当ブログでは旧来の命令と読んでいますが、使い勝手が良いので残っていても良いと思います。

ちなみに、Casio Basic で検索すると、おかげさまで当ブログがヒットしますが、CASIO Basic はカシオ時計のブランドだというのが分かります。



プログラムで計算

プログラムを書く時に、計算をさせることもできます。

1234 x 5678

とプログラムに書けば、電子回路が計算してくれます。プログラムを書く時に計算結果を知る必要はありません。

但し、上の計算結果を知るためにわざわざプログラムを書く人はいないでしょう。電卓のキーをチョイチョイと叩けば答えが出ますね。

上のように決まった数でなくて、色々と異なった数のかけ算をしたい時、プログラムが役立ちます。

A = 1234
B = 5678

としておいて、

C = A x B
Print C


とプログラムを書くと、かけ算の結果を画面に表示します。この書き方はパソコンで使う一般的なBASICの書き方です。

A x B は、A や B に色々と異なった数を入れると、異なった答えを出してくれます。これを Casio Basic で書くと、

1234→A
5678→B
AxB→C


正確に、このように3行のプログラムを書いて、それを実行させると、画面には 7006652 と計算結果が表示されます。


前置きが長くなりましたが、ポイントは以下の6項目です。

1) パソコンのプログラミングは、こんなに簡単ではありません
プログラム電卓ならではの簡便さです。

2) A や B は変数
変数は、数を入れておく容器です。A や B は容器の名前です。
予め、容器Aに数1234を入れ、容器Bに5678を入れておきます。
そして、AxB は、容器の中身の数のかけ算をしなさい、と言うプログラムです。
このように、プログラムでは頻繁に「変数」を使います。

fx-5800P や fx-9860GII などのプログラム電卓で使える変数は、アルファベットの A~Zの26文字です。但し、配列変数 (fx-5800P) や 行列 (fx-5800P や fx-9860GII など) という変数を必要に応じて追加して使うことができます。配列変数や行列については、その使い方を含めて、後で説明します。今は忘れてもらって結構です。

3) → は代入命令
変数Aに 1234を入れることを、「変数Aに1234を代入する」と言います。
そして、Casio Basic では、代入をしなさいと言う「代入命令」を 「」と言う右矢印の記号で表現します。

の左のものを、右へ代入すると決められています。
1234→A
のように、数字を変数に代入するだけでなく、変数を変数に代入できます。

例えば、

1234→A
5678→B
A→B


とすると、変数Bの中身は、5678でなくて、1234 に変化します。

CasioBasicコマンドリファレンス: → (代入命令)

パソコンの Basic では、変数 A に 1234 を代入するとき、

A = 1234

と書きます。代入命令については、Casio Basic は独特なものですが、 記号は代入の方向を示しているので、却って分かりやすいと思います。



4) は出力命令

これも Casio Basic 独特の命令です。◢ は出力、つまり画面表示するだけでなく、併せて一時停止の機能があります。

上の3行のプログラムは、上から下へ順に実行されます。

AxB

は、AxBの結果を表示して、そこでプログラムの実行を一時停止しなさい、という命令です。そして、[EXE] キーを押すと一時停止が解除されます。これも命令に含まれる機能です。

CasioBasicコマンドリファレンス: (出力命令)


5) ?は入力命令
変数Aと代入命令を併せて使って、

?→A

と書くと、画面表示が、

?

となり、そこでプログラムが一旦停止します。

の表示は、キー入力をしてください、と言う意味です。そして、プログラムが一時停止し、何かキー入力を待ちます。[EXE] キーを押すと入力内容が確定され変数Aに代入され、プログラムの一時停止が解除されます。これも Casio Basic 特有の命令です。

実はここには、Casio Basic 特有のおもしろい面があります。
画面に

?

と表示され、入力が促されている時に、例えば

9999÷3

と入力して[EXE] キーを押すと、この計算結果が変数Aに代入されます。

fx-5800P は関数電卓なので、様々な関数機能が内蔵されています。そこで、? が表示されて入力待ちの状態で、sin(30) と入力して[EXE]キーを押すと、計算結果の 0.5 が変数 A に代入されます(DEGモードの時)。関数電卓特有の機能を活かした入力命令になっていることが分かります。

"A="?→A

と書くと、画面には" と "で括られた文字

A= ?

のように表示され、入力待ちになります。

"A="?→A
5678→B
AxB


は、キー入力した数字を変数Aに代入して、AxBを計算した結果を表示するプログラムです。様々な数値や計算結果に5678を掛け算した結果を表示します。

CasioBasicコマンドリファレンス: ? (入力命令)


6) プログラムは上から下へ連続実行
プログラムは、上から下へ連続的に実行されます。

そして、出力命令や入力命令は、一旦停止の機能があるので、そこで実行が一旦停止します。この一旦停止は特別な例です。さらに、実行の流れを変えるコマンドや文があり、これらを使えば上から下への実行順序を変えることができます。

このような明示的なコマンドや文が無い限り、プログラムは上から下へ連続的に実行され、プログラムの一番下の行で、完全に実行が停止します。

プログラムは上から下へ実行される原則は、当たり前のように感じられるでしょう。しかし、これを忘れるとプログラムの動作が分からなくなるものです。とても重要な原則なので、必ず覚えてください。


関連記事:
- プログラム関数電卓でプログラミング
- fx-5800P【プログラミング入門】:プログラム作成から実行までの操作



*****


次からは、実際にプログラムを作りながら、プログラムの単語や文型をみてゆきます。


つづく...

⇒ CasioBasic入門2 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ



  


keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門54

Casio Basic入門
<目次>

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

修正 2016/07/18
追記: 2017/07/02


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

Chapter 9 - 初級

前回: Casio Basic入門53 を見る


◆ Chapter 9 の目標: 簡単な換算プログラム - 入力ボックスの活用


Chapter 9-4 
fx-5800P での3桁区切り表示を改良する

前々回(Casio Basic入門52 - Chapter 9-2)で作ったものは、3桁区切りがパラパラと表示されます。


前回(Casio Basic入門53 - Chapter 9-3)で改良したものは、3桁区切り表示が高速化しました。

ところが、いずれも表示する桁数が1行以内に収まらない時はエラーが発生します。これを放置していたのですが、ここでエラーが出ないように手を入れてから、fx-9860GII へ移植することにします。

fx-5800P用パラパラ表示版

・サブルーチン: 3DIGIT
・メインルーチン: COMPINT2

ファイル名: 3DIGIT

Z=0⇒Retuen
Int(log(Z))+1→D
D-3Int(D÷3)→F

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next



ファイル名: COMPINT2
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"



fx-5800P用高速表示版

・サブルーチン: 3DIGIT2
・メインルーチン: COMPINT3

ファイル名: 3DIGIT2

Z=0⇒Return
Int(log(Z))+1→K
(LK4)+(K≥7)+(K≥10)→I
Frac(Z÷1
x103)×1x103→U
Int(Frac(Z÷1x106)×1x103)→V
Int(Frac(Z÷1x109)×1x103)→W
Int(Z÷1x109)→D

If K≤8:Than
Locate X,Y,1x108×W+1x104×V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
Locate X+3+2×(I≥3),Y,1x107+1x104×V+W
Locate X+0,Y,1x104×D+W
Locate X+K-2+(I≥3),Y,","
Locate X+K-6+(I≥3),Y,","
I≥3⇒Locate X+1,Y,","
IfEnd



変数の説明
入力値: Z
X座標: X
Y座標: Y


ワーク変数 U:下3桁
ワーク変数 V:中3桁
ワーク変数 W:上3桁
ワーク変数 D:最上位1桁
ワーク変数 K:数値の桁数
ワーク変数 I:三桁区切り文字の数


ファイル名: COMPINT3
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT2"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT2"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT2"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"





1行の桁数を超えた表示の際のエラーを抑制

このエラーは、3桁区切りを行うと ,(コンマ)が追加されるから発生します。そこで、3桁区切りの桁数を調べ、それが1行の桁数を超える時は、3桁区切り無しで表示させるようにします。

元の桁数と3桁区切り表示の桁数は以下のようになります。

表1 桁数の一覧
元の数値例元の桁数3桁区切り表示コンマの数3桁区切り表示の桁数
11101
1221202
123312303
123441,23415
12345512,34516
1234566123,45617
123456771,234,56729
12345678812,345,678210
1234567899123,456,789211
1234567890101,234,567,890313
123456789011112,345,678,901314
12345678901212123,456,789,012315
1234567890123131,234,567,890,123417
123456789012341412,345,678,901,234418

これを見れば、

[3桁区切り表示の桁数] = [元の桁数] + [コンマの数]

だと分かります。

元の数値は、変数Z に格納してから、サブルーチン 3DIGIT3DIGIT2 が起動されるので、このサブルーチンの中で、

3DIGIT
Int(log(Z))+1→D [元の桁数]


3DIGIT2
Int(logZ))+1→K [元の桁数]

のように、求められています。

=====

次に、[コンマの数] を求めると、[3桁区切り表示の桁数] を計算できます。

上の表1を見ると、[元の桁数] を3で割った時の商 が [コンマの数] になることが分かります。

[コンマの数] = Int([元の数] ÷ 3) 

従って、

[3桁区切り表示の桁数] = [元の数] + Int([元の数] ÷ 3])

となります。


あるいは、もう一つ [コンマの数] を求める面白い方法があります。これは、既に sentaro様が提案された 3DIGIT2 で使われています。

Int(log(Z))+1→K [L: 元の桁数]
(K≥4)+(K≥7)+(K≥10)→I 
[I: コンマの数]


[2017/07/02 追記]
2行目が何故コンマの数を示すのか、説明を加えます。
最初の (K≥4) をみてみます。Kが4以上の時 K≥4 の値が 1 になる性質を利用しています。
詳しく見てゆきます。 は論理演算を行い、K≥4 が正しければ(つまり真ならば)1を返します。正しくなければ(偽ならば)0を返します。これは Casio Basic を含む多くの高級言語で採用されている仕様です。
(K≥4) 自体が値を持つわけです。
Kが5ならば、(K≥4)(K≥7)(K≥10)0 になるので、I1 となり、コンマの数になります。
Kが8ならば、(K≥4)(K≥7)1 になり、(K≥10)0 になるので、I2 となり、コンマお数になります。
=== 追記おわり ===

従って、

[3桁区切り表示の桁数] = [元の数] + I

となります。

=====

3桁区切り表示を始める桁は、変数 X に入れた直後にサブルーチン 3DIGIT あるいは 3DIGIT2 が呼び出されるので、このサブルーチンが起動した時、変数 X が表示を始める桁数になっています。

すると、3桁区切り表示を行う行に [表示される全ての桁数] は、

[表示される全ての桁数] = X + [3桁区切り表示の桁数] - 1

となります。

fx-5800P では、Locate コマンドで [表示される全ての桁数] は16桁で、これを超えるとエラーになります。このエラーが発生する条件は、

[表示される全ての桁数] > 16

つまり、

X + [3桁区切り表示の桁数] - 1 > 16

この式を整理すると、

X + [3桁区切り表示の桁数] > 17

となります。

====

この条件を満たすとき、どうするかを決めます。

1) 何もしないで、サブルーチンを終了させる

2) エラーにならない換わりに、例えば -------- を表示をする

3) 3桁区切り表示ではなくて、元の数を表示する

といった処理を行えば良いですね。

今回は、「3) 3桁区切り表示ではなくて、元の数を表示する」 を採用することにします。

====

以上をまとめると、

If X+[3桁区切りの桁数]>17
Then
Locate X,Y,Z
Retuen
IfEnd


とすれば、表示が1桁に収まらない時のエラーを回避でき、3桁区切り無しで見づらいが数値が表示されます。

具体的に、3DIGIT と 3DIGIT2 に追加するプログラムコードは以下のようになります。

3DIGITへの追加分
Int(log(Z))+1→D [既にあるコード]

If X+D+Int(D÷3)>17
Then
Locate X,Y,Z
Return
IfEnd



3DIGIT2への追加分
Int(log(Z))+1→K [既にあるコード]
(L≥4)+(L≥7)+(L≥10)→I [既にあるコード]

If X+K+I>17
Then
Locate X,Y,Z
Return
IfEnd




fx-5800P用パラパラ表示版

・サブルーチン: 3DIGIT
・メインルーチン: COMPINT2

ファイル名: 3DIGIT

Z=0⇒Retuen
Int(log(Z))+1→D
D-3Int(D÷3)→F
If X+D+Int(D÷3)>17
Then
Locate X,Y,Z
Return
IfEnd


For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next



ファイル名: COMPINT2 (変更なし)
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"




fx-5800P用高速表示版

・サブルーチン: 3DIGIT2
・メインルーチン: COMPINT3

ファイル名: 3DIGIT2

Z=0⇒Return
Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I

If X+K+I>17
Then
Locate X,Y,Z
Return
IfEnd


Frac(Z÷1x103)×1x103→U
Int(Frac(Z÷1x106)×1x103)→V
Int(Frac(Z÷1x109)×1x103)→W
Int(Z÷1x109)→D

If K≤8:Than
Locate X,Y,1x108×W+1x104×V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
Locate X+3+2×(I≥3),Y,1x107+1x104×V+W
Locate X+0,Y,1x104×D+W
Locate X+K-2+(I≥3),Y,","
Locate X+K-6+(I≥3),Y,","
I≥3⇒Locate X+1,Y,","
IfEnd



ファイル名: COMPINT3 (変更なし)
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Locate X,Y,"      " (スペース11個)
Prog "3DIGIT2"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT2"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT2"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"




fx-5800P 用の2つのバージョン、パラパラ表示版と高速表示版を、ここで完成とします。



つづく...

⇒ Casio Basic入門55 / Casio Basic入門G01 / 目次




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ




  



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

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




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

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、入力ボックス, プログラミング入門プログラム関数電卓

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



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

Casio Basic入門44

Casio Basic入門
<目次>

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

2015/03/15
2016/12/24 修正

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

Chapter 8 - 初級

前回: Casio Basic入門43 を見る


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

前回作ったプログラム TC6 では、温度入力画面と温度出力画面が異なる画面構成となっています。

例えば、以下のような温度出力画面になっているとします。

TC5 6 

ここで、摂氏温度を 20℃ に変更したらどうなるかを見るためには、一旦以下のような入力画面で入力します。

TC6 4 

入力を確定すると、以下の出力画面になります。

TC6 5 

これでもプログラムとして全く問題ないのですが、出力画面のまま、摂氏表示ののところで、別の値を入力したいと思うわけです。

と言うのも、スマホやパソコンのプログラムではそうなっているので、電卓プログラムでの同様の機能を実現できないだろうか?と言うのが今回のテーマです。



Casio Basic には、位置を指定して、そこで入力させるようなコマンドが用意されていません。そこで、この機能を実現させるために、入力ボックス を作りました。

 ⇒ fx-5800P プログラムライブラリ - 入力ボックス

 ⇒ fx-9860GII プログラムライブラリ - 入力ボックス

入力ボックスは、汎用サブルーチンとして作っていて、他のプログラムから呼びだして使うことを前提にしています。従って、Basic コマンドとは少し使い方が異なります。

Basic コマンドの使い方は、

[コマンド] [設定1],[設定2],[設定3], ...

といった使い方になります。

入力ボックスはサブルーチンです。サブルーチンを呼びだす時に色々な設定を一緒に指定することができません。そこで、

[入力ボックスの設定]
Prog "入力ボックス"
[結果の受け取り]


といった書式になります。

今回は、温度換算プログラムで、入力ボックスを使ってみようと思います。



Chapter 8-2
入力ボックスを使ってみる

入力ボックスには、使い勝手を考えて複数のバージョンがあります。

入力する数値の種類応答性が速い
バージョン(Ver2.0)
キーリピート抑制が
バージョン(Ver2.1)
プログラム名
0以上の整数(INPI Ver2.0)INPI Ver2.1INPI
0以上の小数と政数INP Ver2.0(INP Ver2.1)INP
正負の小数と整数IN Ver2.0(IN Ver2.1)IN

入力ボックスには、fx-5800P で使うために、大きく Ver 2.0Ver 2.1 の2種類があります。fx-5800P はCasio Basic プログラムの実行速度が比較的遅いので、できるだけキー入力の応答性を高める必要があり、その目的で作ったのがVer 2.0 で、応答性を高めるために、キーを押したままにするとその数字が繰り返し入力される(キーリピートが発生する)仕様になっています。

一方、キーリピートを抑制したものが Ver2.1 です。

Ver 2.0 / Ver 2.1 それぞれについて、入力する数値の種類に応じて3つのバージョン、INPI、INP、IN を用意しています(上の表参照)。

実際に使用してみると、Ver 2.0INPI の処理が軽いのでキーリピートが発生しやすいと思います。そこで INPI を使う場合はキーリピートを抑制した Ver 2.1 をお勧めします。

INPIN については、INPI に比べて相対的に処理が少し重く、キーリピートがあまり問題になりません。むしろキーリピートを抑制すると応答性の悪化を感じるので、Ver 2.0 の利用を勧めます。

上の表で赤文字で示したように、INPI Ver2.1INP Ver2.0IN Ver2.0 を使えば、間違いないと思います。なお、今回、温度換算プログラムで利用する場合は、温度値は正負の小数と整数なので IN Ver2.0 を使うことにします。


IN Ver2.0 の準備

fx-5800P は、パソコンとのリンク機能がないので、プログラムをパソコンから転送することが出来ません。最初は面倒でもプログラムをキー入力する必要があります。

fx-5800P に入力ボックス IN Ver 2.0 が保存されていない場合
もし、あなたの fx-5800P に入力ボックスが保存されていない場合は、面倒でも最初はキー入力する必要があります。
入力するソースコードは、fx-5800P プログラムライブラリ - 入力ボックス の プログラム- IN Ver2.0: プログラム名 IN に掲載していますので、間違えないように入力してください。

fx-5800P に入力ボックスが保存されている場合
入力ボックスは、既に Casio Basic入門で扱っているので、既にプログラムが保存されているかも知れません。今回は、正負小数対応の IN を使います。もし、バージョンに応じて異なったファイル名で保存している場合は、今回使う IN Ver2.0 のファイル名を IN にしてください。

先ずは、fx-5800P で入力ボックスを導入して温度換算プログラムを作りますが、後で fx-9860GII へ移植する予定です。そこで、fx-9860GII で入力ボックスを準備する方法も書いておきます。fx-9860GII はPCリンク機能を使ってプログラムを簡単に転送できるので、準備が楽です。

fx-9860GII で入力ボックスを準備する場合
もし、fx-9860GII をお使いの場合は、fx-9860GII 専用入力ボックス Ver 2.1GG1M ファイルをダウンロードできるようにしています。このファイルを一旦パソコンにダウンロードすれば、専用リンクソフトを使って fx-9860GII へ転送できるので、入力の手間はありません。
 ⇒ e-Gadget アーカイブ - Archaive ページ - fx-9860GII Casio Basic から IN.G1M をダウンロード  
あるいは、
 ⇒ ここ から IN.G1M をダウンロード



入力ボックス IN 2.0 の使い方

入力ボックスは、汎用サブルーチンです。サブルーチンを呼びだすには、Prog コマンドを使い、呼びだすプログラム名を " " で括ります。正負小数に対応した IN を使うので、

Prog "IN"

と書きます。

ちなみに、Prog の入力は、[SHIFT] [FILE] です。

入力ボックスを呼びだす前に、以下の4つの変数の設定を行います。

・ 入力ボックスを表示する桁(X座標): 変数X
・ 入力ボックスを表示する行(Y座標): 変数Y
・ 入力ボックスの桁数: 変数D
・ 入力ボックスの確定インジケータの種類の設定:
変数E

具体的には、以下の書式で使います。

入力ボックスの書式
△→X:△→Y:△→D:△→E (入力ボックスの設定)
Prog "IN"          (入力ボックスの呼出し)
Z→▽              
(入力値の受け取り)


は任意の数、は任意の変数、但し使用機種の画面範囲内に収まるように設定する。
  参考 fx-5800P: 1≦X≦16、1≦Y≦4、X+D≦16

- X: 入力ボックス表示開始桁
- Y: 入力ボックス表示開始行
- D: 入力ボックス桁数
- E: 入力ボックスインジケータの選択
   E=2: 画面右下に <EXE>:ENTER と表示
   E=1: 画面右下に ▶E と表示
   E=(上記以外): インジケータ非表示
- Z: 入力ボックスで確定した数値が代入される



入力ボックスの動作確認
入力ボックス IN をキー入力した場合は、入力ミスの可能性もあるので、テストプログラムで入力ボックスの動作テストを行います。併せて、入力ボックスの使い方を紹介します。

以下のテストプログラムを使います。

プログラム TEST
0→Z
"1:"
"2:"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
L=35⇒1→M
L=36⇒2→M

Locate 1,4,"        " (スペース16個)

If M=1:Then
3→X:1→Y:10→D:2→E
Prog "IN"
Else If M=2
Then
3→X:2→Y:6→D:1→E
IfEnd:IfEnd

Locate 1,4,"Z="

Locate 3,4,Z

WhileEnd


==========

<裏技>

代入命令 → を入力する良い方法を紹介します。

4→X を速く入力する方法
[4] キー
[SHIFT] [RCL] キーで が入力され、この時 アルファベット入力モードになる
[0] キー を押すと、アルファベットモードなので X が入力される

入力ボックスを使う書式では、代入命令を多く使うので、この方法を知っていると入力が楽になります。

ちなみに、Prog の入力は、[SHIFT] [FILE] です。

==========

では、テストプログラム TEST 作成の操作です。

[MODE] [5] (5:PROG]Program Menu を表示

IB-ProgramMenu 

新たにプログラム TEST を作るので、[1] (1:NEW) を押し、File Name 入力画面へ...

IB-FileName 

ここで、プログラム名 TEST を入力し、[EXE] で確定。File Mode 設定画面が現れる。

IB-FileMode 

[1] (1:COMP) を選択すると、プログラム入力画面に切り替わります。

ここで、プログラム TEST を入力します。

入力が終わったら、[EXIT] を押して、Program Menu 画面に戻ります。

IB-ProgramMenu 

では、プログラム TEST を実行してみます。

[2] (2:RUN) を押して、Prog List を表示させ、

IB-ProgList  

[EXE] キーで、プログラム TEST を実行します。

TEST-1 

[1] キーを押すと、1: の右に10桁の入力ボックスが表示されます。

TEST-2 

入力ボックス表示の左端は3桁目(X座標が3)、1行目(Y座標が1)で、桁数は10です。つまり、X に 3、Y に 1 、D に 10 を指定しています。さらに右下に、<EXE>:ENTER と表示されていますが、これがインジケータで、E に 2 を指定するとこの表示になります。

つまり、

3→X:1→Y:10→D:2→E
Prog "IN"


と書いておき、これが実行されると、上のような入力ボックスが表示され、入力モードになります。

ここで、項目1 に、-12.345678 を入力すると、以下のようになります。

TEST-3 

右下のインジケータは、入力モードにあることを示し、[EXE] キーを押して確定することを示す操作案内です。
入力モード中に [DEL] キーを押せば入力した数字が削除され、内容を編集できます。

[EXE] で入力確定すると、変数 Z に 確定した値が格納されてから、入力ボックスが終了します。

TEST-4 

一番下の行で変数 Z の値を表示しています。
これは、プログラム TEST の以下のコードによるものです。

Locate 1,4,"Z="
Locate 4,4,Z


このように、希望の位置に希望の桁数で入力させることができます。色々な入力を試して、Z の値が正しいことを確認します。


さて、次に項目2に、入力してみます。[2] を押すと、以下のようになります。

TEST-5 

入力ボックスの左端は、3桁目(X=3)、2行目(Y=2)で、桁数が6(D=6)です。そして、インジケータは簡略化した表示(E=1)です。

プログラムに書く場合は、以下のようにします。

3→X:2→Y:6→D:1→E
Prog "IN"


ここで、-9.876 と入力すると、

TEST-6 

正しい位置に入力中の内容が表示されています。[DEL] で削除できて、入力内容の編集ができます。
右下のインジケータ ▶E は、[EXE] で確定、との操作方法を示しています。

[EXE] で確定すると、変数 Z に入力値が代入され、入力ボックスが終了します。

TEST-7 

Locate 1,4,"Z="
Loxate 3,4,Z


によって、4行目に、Z の値を表示しています。


では、ここで [1] を押して、再び入力ボックスを表示させ、

TEST-8 

このまま、[EXE] を押す、つまり何も入力しないで確定すると、変数 Z には 0 が代入され、入力ボックスが終了するので、

TEST-9 

このように表示されます。

テスト用プログラムをもう一度掲載しますが、赤文字で示した部分、つまり入力ボックスの桁数とインジケータの種類を変更してみて、色々と試してみてください。

プログラム TEST
0→Z
"1:"
"2:"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
L=35⇒1→M
L=36⇒2→M

Locate 1,4,"        " (スペース16個)

If M=1:Then
3→X:1→Y:10→D:2→E
Prog "IN"
Else If M=2
Then
3→X:2→Y:6→D:1→E
Prog "IN"  [2016/12/24] 追加修正
IfEnd:IfEnd

Locate 1,4,"Z="

Locate 3,4,Z

WhileEnd




今回は、入力ボックスを使う準備と、使い方を紹介しました。

次回は、温度換算プログラムに入力ボックスを導入してゆきます。






つづく...

Casio Basic入門45 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ


 


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

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



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

Casio Basic入門3

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終修正:2016/12/17


4. CasioBasicを使ってみる


これまでのプログラミングの経験(無しを含む)に合わせて、最適な読み進め方が分かるかも知れないので、<目次>に目を通しておくと良いと思います。


Chapter 1 - 初級
GetkeyLocate コマンドを使いこなす

◆ 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モード(通常に関数電卓として使えるモード)にする

Compモード 

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

Setup_Menu 

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

Setup_Menu2 

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

ENG_Menu 

5) 2:EngOff を選択 ([2] を押す)

COMPモードの画面に戻ります。

もし、ENGモードが ON になっていると、画面上部に ENG サインが現れます。

ENG_ON 

今回は、ENGモードを OFF にしますので、COMPモードで画面上部に ENG サインが無いことを確認してください。


プログラムの入力

では、2行の簡単な例題プログラムを作ります。

COMPモード(通常の電卓画面)で [MODE] キーを押して、モード選択画面にします。

ch1-ModeSelect 

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

IB-ProgramMenu 

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

ch1-FileName_blank 

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

これから作るプログラムの名前を CH1-1 とします。
アルファベットモードで、 CH と入力し、アルファベットモードを解除して、1-1 を入力しましょう。

ch1-FileName 

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

IB-FileMode 

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

Progra編修_Blank 

まだ何も入力していないので、カーソルが点滅しているだけです。

ここで、次の2行のプログラムを入力しましょう。

Getkey→K
Locate 1,1,K


ch1-Program  

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 画面が表示されます。

ch1-ProgEdit 

もし、[EXE] キーを押せば、プログラム編修画面に戻ります。

ここでは、[EXIT] キーを押して、Progman Menu 画面に戻ってください。

TC7-ProgMenu 



プログラムの実行

では、今作ったプログラムを実行してみましょう。

[2] (2:RUN) を選択すると Program List が現れます。

ch1-ProgList 

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

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でも同様です。

横方向が軸で、座標の値は、1番左が1、右にゆくほど大きくなります。
縦方向が軸で、座標の値は、1番上が1、下に行くほど大きくなります。

特に縦方向は慣れるまで違和感があるかも知れません。この原点と座標の決め方は CasioBasicに限らず、パソコンで使うプログラミング言語にほぼ共通したものです。

Casio Basic では、原点の座標:(x,y) = (1,1)となっています。

16桁 x 4行のディスプレイ
 1 2 3 4 5 6 7 8 910111213141516
 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 があふれてしまいます。
                            12
                 
 
 

この場合、X座標の値(桁数)が範囲内 (1~16) なので、エラーにはなりません。

さて、上のプログラムでは、Locateコマンドの第3引数の[出力内容]に、変数Kを指定しています。この場合は、K に代入されている値が表示されます。Kに47が代入されているので、表示は 47 となります。

K=47 の時に Locate 1,1,K を実行した時の表示
47                            
                 
 
 

第3引数に、K ではなくて 47 を指定した場合、

Locate 1,1,47 を実行した時の表示
47                            
                 
 
 

座標(1, 1)に 4 が、座標(2, 1)に 7 が表示され、これらは同じ結果になります。


第3引数には、文字や文字列も指定できます。文字や文字列は、頭とお尻に "String" のようにタブルクォーテーションで挟みます(ちなみにStringは文字列という意味です)。

Locate 4,3,"STRING" を実行したときの表示
                 
 
      STRING            
 

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 の表示結果
             
                
                
                
16桁x4行のディスプレイ


次に、K=0 の時の Locate 1,1,K の表示結果
             
                
                
                
16桁x4行のディスプレイ

左端だけ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 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ


カシオプログラム関数電卓 FX-5800P-Nカシオプログラム関数電卓 FX-5800P-N
(2006/09/22)
CASIO(カシオ)

商品詳細を見る


keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門 -目次-

Casio Basic入門

新しい記事の公開に合わせて随時追記・修正します
最終: 2016/10/09


目 次

        - 1.はじめに: [1]

        - 2.プログラミングとは: [1]  

        - 3.fx-5800PのCasio Basicコマンド一覧: [2] 

        - 4.Casio Basicを使ってみる
            - Chapter 0 - プログラム作成・実行のポイント: [2] 
            - Chapter 1 - Getkey と Locate を使いこなす: [3] [4] [5] [6] [7] [8] 
            - Chapter 2 - 動きのあるプログラムを作る: [9] [10][11][12][13][14] 
            - Chapter 3 - 自由自在に入力する(入力ボックス): [15][16][17][18] 
            - Chapter 4 - 換算プログラムを作る: [19][20][21][22] 
            - Chapter 5 - サブルーチンを使いこなす: [23] [24] [25] [26] [27] [28] [29] [30] [31] 
            - Chapter 6 - プログラムを速くする(入力ボックス) [32] [33] [34] [35] [36] [37]  
            - Chapter 7 - 超入門 - ゼロからのプログラム作成と機能追加: [38] [39] [40] [41] [42]
            - Chapter 8 - Basic 命令を活用してみる: [43] [44] [45] [46] [47] [48] [49] [50]
            - Chapter 9 - 簡単な換算プログラム - 入力ボックスの活用: [51] [52] [53] [54] [55] 

        - 5.Casio Basicでグラフィックス / 目次
            - Chapter G01 - LCDと3つの座標系: [G01] 
            - Chapter G02 - グラフィックス画面の設定と描画: [G02] 
            - Chapter G03 - ClrGraphViewWindow[G03] 
            - Chapter G04 - Plot コマンド: [G04] 
            - Chapter G05 - Plot と ViewWindow: [G05] 
            - Chapter G06 - F-Line と線のスタイル設定: [G06] 
            - Chapter G07 - 点線とViewWindow: [G07]
            - Chapter G08 - ViewWindow の有効活用 / RclPict と RclCapt の違い: [G08] 
            - Chapter G09 - ViewWindow と設定変数: [G09] 
            - Chapter G10 - Circle コマンド: [G10] 
            - Chapter G11 - PxlOn コマンド: [G11]
            - Chapter G12 - PxlOff コマンド: [G12]
            - Chapter G13 - PxlChgコマンド: [G13] 
            - Chapter G14 - PxlTest( ) コマンド: [G14] 

            - Chapter G15 - 
            - Chapter G16 - 
            - Chapter G17 -
            - Chapter G18 -

詳細な目次へ



Casio Basic入門の概要

CasioBasic入門では、最初から順に読むことを前提に書いています。最初は基本的な部分から丁寧な説明を心がけていますが、進むにつれて同じ説明を省略するようになります。CasioBasicの命令やコマンドの説明だけでなく、プログラミングの考え方、手法、知っておくと役立つ数学的な話題なども、折に触れ紹介しています。

当初、fx-5800P 使用を前提にして始めましたが、「4. Casio Basic を使ってみる」 で取り上げているプログラムは、簡単な変更で fx-9860GII への移植も可能です。具体的に fx-5800P から fx-9860GII への移植も取り上げています。

fx-CG20 については、fx-9860GII の Casio Basic プログラムファイルからの移植性が非常に高いので、物理座標系で動くグラフィックスコマンド(PxlOnPxlOffPxlChgPxlTest など)を使っていないプログラムファイルは、fx-CG20 に転送するだけで、ほぼ正常動作します。

Casio Basic - 機種別の互換性

fx-9860GII への移植 - 厄介な旧来の命令


「5. Casio Basic でグラフィックス」 では、グラフィックス機能を持たない fx-5800P ではなく、fx-9860GII を前提にしています。fx-CG20 / fx-CG10 は、カラー対応の部分を除き、fx-9860GII から比較的楽に移植できます。fx-9860GII と fx-CG20 で互換性のないコマンドの紹介を順次追加してゆきます。


Casio Basic入門の読み方

PCなどでの構造化Basic や他の構造化高級言語でのプログラミング経験者には、最初から順に読み進めて頂ければ、Casio Basic が構造化Basicで、割と使える言語であることに気付かれると思います。

昔の古い電卓での行番号付きのBASIC(非構造化BASIC)などでのプログラミング経験しか無い方、およびプログラミング未経験者の方は、以下の順序で読み進めると良いと思います。

構造化高級言語によるプログラミング経験の少ない方、プログラミング初心者向けの進め方

2. プログラミングとは
   
4. Casio Basicを使ってみる [fx-5800P 向け、fx-9860GII にも移植可能]
   
 ・Chapter 0 (プログラム作成・実行のポイント)
   
 ・Chapter 7 (超入門:ゼロからのプログラム作成と機能追加) ※1
   
 ・Chapter 8 (Basic コマンドを使ってみる) ※2
   
 ・Chapter 1 (Getkey と Locate コマンドを使いこなす)
   
 ・Chapter 2 (動きのあるプログラムを作る)
   
 ・Chapter 3 ~ Chapter 6 / Chapter 9 ~
   
5. Casio Basic でグラフィックス [fx-9860GII 他、グラフ関数電卓向け]

※1 fx-5800P プログラミング(超)入門
Chapter 7 (超入門:ゼロからのプログラム作成と機能追加) は、fx-5800P を始めて使うプログラミング未経験者を想定したものです。Chapter 8 へ繋がります。 ⇒ Chapter 7

※2 新世代 Casio Basic への導入
Chapter 8 は、カシオのプログラム電卓で古くから使われてきた命令から、新世代 Casio Basic への導入を目的にしています。古いプログラム電卓を使いこなしているが、新しい Casio Basic にはなじみの無い方向けです。 ⇒ Chapter 8

※3 PCなどでの高級言語プログラミングの経験者には...
管理人自身がこのカテゴリーに入ります。高級言語、特に構造化Basicでのプログラミング経験者は、当ブログで公開している Hit & Blow ( ここここ や ここ )、もぐら叩き (ここ) を見て、実際に fx-5800P で実行して頂ければ、Casio Basic の能力が分かると思います。さらに、改造や改善してみると Casio Basic がさらに分かると思います。

記事中で、Casio Basic コマンドリファレンスの個別項目へのリンクも入れています。このコマンドリファレンスは、管理人オリジナルのもので、取扱説明書に書かれていない多くの情報を提供しています。


新世代 Casio Basicについて

2006年発売の fx-5800P に搭載されたプログラミング言語は、カシオ自身が Basic-Like プログラミング言語と言っています。機能やコマンドが限定されているので、厳密にはその通りです。しかし実際に使ってみると、使えるコマンドに着目すれば、構造化プログラミングができる Basic であり、実用的な電卓プログラムが作れることに気がつきました。構造化プログラミングには諸説ありますが、当ブログでは「ブロック構造による分かりやすいプログラムを作ること」 が構造化プログラミングだ、との立場です。例外処理やエラー処理のために Goto で処理を一カ所に集中させるのは、プログラムが分かりやすくなるので良いものとして考え、それ以外は極力 Goto なしでプログラムを書くという考え方です。実際に多くの高級言語では、例外処理には内部的に Goto と同様に特定アドレスへの強制ジャンプをしています。

ここでは、カシオ製 プログラム関数電卓とグラフ関数電卓をひとくくりにして、プログラム電卓と呼ぶことにします。2006年に 発売された fx-5800P 以降のプログラム電卓に搭載されている Casio Basic は、構造化プログラミングが可能である点で、それ以前のものとは大きく異なることが分かっています。

そこで、fx-5800P 以降の機種に搭載されている新しい Casio Basic を 当ブログでは、新世代 Casio Basic と呼んでいます。これらに共有しているのは、構造化プログラミングが可能なだけでなく、テンキーだけでなく全てのキー([AC]キー除く)押下の検出が可能な Getkey コマンド、そして柔軟な Locate コマンドを搭載し、条件判定を 0で偽、0以外を真できることです。なお、プログラム関数電卓として販売されている fx-71F や fx-72F に搭載されている言語は、ここでいう新世代 Casio Basic ではありません。

<新世代Casio Basic搭載機>
  - fx-5800P
  - fx-9860G (OS ver 2.以降推奨)
  - fx-9860GII (OS ver 2 以降推奨)
  - fx-CG10 (OS ver 1 以降)
  - fx-CG20 (OS ver 1 以降)
  - fx-FD10 Pro
  ※ OS は最新バージョンへアップグレードできます

初級・中級の表記について
  初級 - Casio Basic の命令/コマンドの使い方を覚えるレベル
  中級 - プログラムの構造やロジック、変数の使い方を工夫するレベル
  中級者で十分使いこなせるので、上級と言う表記はありません

Casio Basic でのグラフィックス プログラミングを取り上げています。先ずは グラフィックスコマンドを徹底的に調べている段階なので、別系統で連載します。これまでの「Casio Basicを使ってみる」の連載は、継続予定です。
 ⇒ Casio Basicでグラフィックス



詳細な目次

1. はじめに
      ⇒ Casio Basic入門1

2. プログラミングとは
      ⇒ Casio Basic入門1

3. fx-5800P CasioBasicのコマンド一覧
      ⇒ Casio Basic入門2

4. CasioBasicを使ってみる
[fx-5800P 向け、fx-9860GII (OS2.04)にも移植可]

Chapter 0

プログラム作成・実行の操作ポイント

      - プログラム新規作成
      - プログラム編集
      - プログラム実行
      - →命令 (代入命令)
      - ?命令 (入力命令)
      - 命令 (出力命令)

      ⇒ Casio Basic入門2

Chapter 1 - 初級
Getkey と Locate コマンドを使いこなす
キーコード取得プログラム - GET KEYCODE を作る 

      - Locate
      - Getkey
      - Doループ
      - Whileループ
      - Isz命令 (インクリメント・ジャンプ命令)
      - " " 出力命令
      - EngOn / EngOff
      - If 文
      - ⇒命令 (条件ジャンプ命令)


      ⇒ Casio Basic入門3
             - Chapter 1-1: Getkey、Locate
             - Chapter 1-2: Goto / Lbl ループ、EngモードとLocate

      Casio Basic入門4
             - Chapter 1-3: 繰り返し処理 Doループ

     Casio Basic入門5
             - Chapter 1-4: Locateコマンドと出力命令" "の違い
             - 
Chapter 1-5: 思い込みの罠 - Locateの表示桁数
             - Chapter 1-6: プログラム完成
             - Chapter 1-7: 思い込みの罠(補足) - 1桁のキーコード

      ⇒ Casio Basic入門6
             - Chapter 1-8: DoループとWhileループ再び

      Casio Basic入門7
             - Chapter 1-9: Locateコマンドで陥るバグ
             - Chapter 1-10: 利用価値の高い⇒命令(条件ジャンプ)を使ってみる

      ⇒ Casio Basic入門8
             - Chapter 1-11: ダイナミックな表示機能の実装
             - Chapter 1-12: プログラムのバックアップ


Chapter 2 - 初級
動きのあるプログラムを作る
反射ゲーム - REACT を作る

      - Lbl / Goto ループ
      - Dsz命令 (ディクリメント・ジャンプ命令)
      - Int( ) / Frac( ) 関数
      - Break コマンド
      - 例外処理 / 例外フラグ
      - 複数条件分岐 - Else If
      - ブロック構造 (構造化プログラミングの勧め)
      - アルファベット小文字の表示
      - For~To~Next
      - Progコマンド(サブルーチン)

      ⇒ Casio Basic入門9
             - Chapter 2-0: Lbl / Gotoループを使う
             - Chapter 2-1: 回る羽根を作る

      ⇒ Casio Basic入門10
             - Chapter 2-2: ランダム関数を使う
             - Chapter 2-3: 再びGetkeyとDoループでカウンタ計測
             - Chapter 2-4: 例外処理・例外フラグ・Breakコマンド

      ⇒ Casio Basic入門11
             - Chapter 2-5: プログラム制御
             - Chapter 2-6: 複数条件分岐の記法

      ⇒ Casio Basic入門12
             - Chapter 2-7: ゲーム終了条件の実装

      ⇒ Casio Basic入門13
             - Chapter 2-8: ゲーム進行に変化を付ける
             - Chapter 2-9: ゲームの仕上げ - 構造化プログラミング

      ⇒ Casip Basic入門14
              - Chapter 2-10: For文とProgコマンドを使ってみる


Chapter 3 - 中級
自由自在に入力する
入力ボックス - INPI を作る

      - 配列変数
      - 論理演算コマンド
      - For~To~Next
      - Progコマンド(サブルーチン)
      - サブルーチンの使い方
      - アルファベット小文字の表示
      - デバッグ方法
      - ド・モルガンの法則
      - 変数の使い方 - 予約変数と使捨て変数
      - 変数の適用範囲

      ⇒ Casio Basic入門15
             - Chapter 3-0: 動作確認用メインルーチンを作る

      ⇒ Casio Basic入門16
             - Chapter 3-0(続き): 「入力ボックス」を作る - 論理演算をする

      ⇒ Casio Basic入門17
             - Chapter 3-1: 「入力ボックス」プログラムの改造

      ⇒ Casio Basic入門18
             - Chapter 3-2: 入力ボックス - 末尾文字の削除機能を追加する
                デバッグ方法、ド・モルガンの法則、変数の適用範囲を理解する


Chapter 4 - 中級
換算プログラムを作る
和暦・西暦変換プログラム - YEAR CONV を作る

      - Progコマンド (サブルーチン)
      - サブルーチンの使い方
      - 変数の使い方 - 予約変数と使い捨て変数

      ⇒ Casio Basic入門19
             - Chapter 4-0: 和暦・西暦換算プログラム - 完成状態の紹介
             - Chapter 4-1: 最初にプログラム構造を考える
             - Chapter 4-2: 和暦・西暦換算プログラムを実装する

      ⇒ Casio Basic入門20
             - Chapter 4-3: オマケ機能の追加 - 数の桁数の求め方

      ⇒ Casio Basic入門21
             - Chapter 4-4: キー長押しによるメニュー選択

      ⇒ Casio Basic入門22
             - Chapter 4-5: キー長押しの処理を作る
             - Chapter 4-6: サブルーチンを使いこなす


Chapter 5 - 中級
サブルーチンを使いこなす

世界時間換算プログラム - TIME ZONE を作る

      - 入力ボックスを使う
      - サブルーチンを活用した効率的な機能追加
      - 変数の使い方 - 予約変数と使捨て変数
      - キー長押しの活用
      - 矢印キーによる循環項目選択

      ⇒ Casio Basic入門23
            - Chapter 5-0: プログラムの仕様
            - Chapter 5-1: TIME ZONE プッログラムの完成形

      ⇒ Casio Basic入門24
            - Chapter 5-2 Getkey、入力ボックス、Locate の活用

      ⇒ Casio Basic入門25
            - Chapter 5-3: 同様の機能を追加する

      ⇒ Casio basic入門26
            - Chapter 5-4: 少し異なるルーチンを、分かりやすく追加する

      ⇒ Casio Basic入門27
            - Chapter 5-5: 少し異なるルーチンを、分かりやすく追加する(2)

      ⇒ Casio Basic入門28
            - Chapter 5-6: キー長押しによる機能呼び出し

      ⇒ Casio Basic入門29
            - Chapter 5-7: 矢印キーの活用

      ⇒ Casio Basic入門30
     - Chapter 5-8: 類似処理による機能追加

      ⇒ Casio Basic入門31
     - Chapter 5-9 キー長押しによる別機能の呼び出し


Chapter 6 - 中級
プログラムを速くする
入力ボックスの高速化と拡張 - 入力ボックス 2.0 を作る

      - 処理速度の遅いコマンド/命令を見極める
      - プログラムロジックの見直し

      ⇒ Casio Basic入門32
     - Chapter 6-0: コマンドや命令の処理速度を比較する
     - Chapter 6-1: 具体的に対処する遅い処理を見つける

      ⇒ Casio Basic入門33
     - Chapter 6-2: ロジックの見直しでプログラムを高速化する

  ⇒ Casio Basic入門34
     - Chapter 6-3: 処理速度を意識して機能拡張する

  ⇒ Casio Basic入門35
     - Chapter 6-4: 処理速度を意識して機能拡張する

  ⇒ Casio Basic入門36
     - Chapter 6-5: キーリピートを抑制する

  ⇒ Casio Basic入門37
     - Chapter 6-6: fx-5800P から fx-9860GII へ移植する


Chapter 7 - 超初級
ゼロからのプログラム作成と機能追加
温度換算プログラム- TEMP CONV を作る

      - 初めての fx-5800P プログラミング
      - プログラム作成の手順
      - プログラムの実行方法
      - ?(入力)命令

  ⇒ Casio Basic入門38
     - Chapter 7-1: 最もシンプルなプログラム

  ⇒ Casio Basic入門39
     - Chapter 7-2: 同様の機能を追加する

  ⇒ Casio Basic入門40
     - Chapter 7-3: 選択肢3つの換算プログラムに拡張する

  ⇒ Casio Basic入門41
     - Chapter 7-4: バグの原因と対処 - フラグの利用

  ⇒ Casio Basic入門42    
     - Chapter 7-5: プログラムの効率化


Chapter 8 - 初級
Basic 命令を使ってみる
温度換算プログラム - TEMP CONV を作る

   - ?(入力)命令を Baisc コマンでに置き換える
     ・ Getkey と Do ループ の使い方
     ・ 入力ボックスの使い方
   - ⇒(条件分岐)命令のメリット
   - キー入力制御
     ・ Getkey と While ループの使い方

  ⇒ Casio Basic入門43
     - Chapter 8-1: メニュー選択に Getkey を使う

  ⇒ Casio Basic入門44
     - Chapter 8-2: 入力ボックスを使ってみる

  ⇒ Casio Basic入門45
     - Chapter 8-3: 換算プログラムの入力ボックスを実装する

  ⇒ Casio Basic入門46
     - Chapter 8-4: テンキー以外のキー入力を利用する

  ⇒ Casio Basic入門47
     - Chapter 8-5: [EXIT] キーで正常終了させる

  ⇒ Casio Basic入門48
     - Chapter 8-6: fx9860GII 用入力ボックスを準備する

  ⇒ Casio Basic入門49
     - Chapter 8-7: fx-9860GII へプログラムを移植する

  ⇒ Casio Basic入門50
     - Chapter 8-8: fx-9860GII 用に表示を最適化する


Chapter 9 - 初級
簡単な換算プログラム - 入力ボックスの活用
福利計算プログラム - CompInt を作る

   - Getkey と Do ループ の使い方
   - 入力ボックスの使い方
   - 数値の3桁区切り表示をサブルーチンで実装
   - 3桁区切りのロジックを改善(高速化)
   - 

  ⇒ Casio Basic入門51
     - Chapter 9-1: fx-5800P で複利計算プログラムを作る

  ⇒ Casio Basic入門52
     - Chapter 9-2: fx-5800P で3桁区切り表示をする

  ⇒ Casio Basic入門53
     - Chapter 9-3: fx-5800P での3桁区切り表示を高速化する

  ⇒ Casio Basic入門54
     - Chapter 9-4: fx-5800P での3桁区切り表示を改良する


5. Casio Basicでグラフィックス [fx-9860G (OS2.04) 向け]

Casio Basicでグラフィックス
グラフィックスコマンドの仕様や特徴

  ⇒ Casio Basic入門G01
     - Chapter G01: LCDと3つの座標系

  ⇒ Casio Basic入門G02
     - Chapter G02:  グラフィックス画面の設定と描画

  ⇒ Casio Basic入門G03
     - Chapter G03: ClrGraphViewWindow

  ⇒ Casio Basic入門G04
     - Chapter G04: Plot コマンド

  ⇒ Casio Basic入門G05
     - Chapter G05: PlotViwWindow

  ⇒ Casio Basic入門G06
     - Chapter G06: F-Line と 線のスタイル設定

  ⇒ Casio Basic入門G07
     - Chapter G07: 点線と ViewWindow

  ⇒ Casio Basic入門G08
     - Chapter G08: ViewWindow (直交座標系) の有効活用 / RclPictRclCapt の違い

  ⇒ Casio Basic入門G09
     - Chapter G09: ViewWindow と設定変数

  ⇒ Casio Basic入門G10
     - Chapter G10: Circle コマンド

  ⇒ Casio Basic入門G11
     - Chapter G11: PxlOn コマンド

  ⇒ Casio Basic入門G12
     - Chapter G12: PxlOff コマンド

  ⇒ Casio Basic入門G13
     - Chapter G13: PxlChg コマンド

  ⇒ Casio Basic入門G14
     - Chapter G14: PxlTest() コマンド

  ⇒ Casio Basic入門G15
     - Chapter G15: 



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ




  


keywords: fx-5800Pfx-9860GIICasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門53

Casio Basic入門
<目次>

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

追記修正 2016/07/17

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

Chapter 9 - 初級

前回: Casio Basic入門52 を見る


◆ Chapter 9 の目標: 簡単な換算プログラム - 入力ボックスの活用


Chapter 9-3 
fx-5800P での3桁区切り表示を高速化する

前回、3桁区切りできる複利計算プログラムを再掲します。

・サブルーチン: 3DIGIT
・メインルーチン: COMPINT2

ファイル名: 3DIGIT

Z=0⇒Retuen
Int(log(Z))+1→D
D-3Int(D÷3)→F

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next



ファイル名: COMPINT2
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"

IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"





前回のプログラムと高速化の試み

以下のように、3桁区切りで表示ができましたが、

8digit_input 

左から右へ、パラパラと表示されて時間がかかります。

今回のプログラムで一番動作時間がかかるのは、Locate コマンドです。そして、For ループで Locate が何度も実行されているので、表示に時間がかかると考えています。このプログラムでは、例えば 12345678 を表示するには Locate を10回実行しています。

そこで、表示を高速化するには、Locate が実行される回数を減らせば良いことになります。

私が最初に考えたのは、例えば 1234567812,345,678 として表示するために Locate を使って、

1) 12 を表示
2) ,(コンマ)を表示
3) 345 を表示
4) ,(コンマ)を表示
5) 678 を表示


つまり、Locate 実行の回数が10回から5回へ半減しますので、良さそうです。実際に作ってみると、問題がありました。

それは、例えば 139096 を3桁区切りにすると 139,096 となるべきところ、そうはならないバグです。このバグはコーデイングのバグではなくて、fx-5800P Casio Basic の限定的な機能が関係した本質的な問題でした。

上の考え方だと

1) 139 を表示⇒問題なし
2) ,(コンマ)を表示⇒問題なし
3) 096 を表示⇒
問題発生


Locate コマンドで 数値 096 を表示すると 96 になってしまいます。
つまり、3桁区切りの表示が 139,96 と妙なことになります。

fx-5800P Casio Basic では文字列を扱うコマンドが無いので、096 を一旦文字列に変換して Locate で表示することができません。
ただし、この問題は簡単に解決できます。096 は、3桁でなくて2桁なので、3桁未満の時は文字 "0" を先に表示してから3桁未満の数値を表示すれば良いだけです。

あるいは、先に文字列 "000" を表示した上に 必要な桁から2桁か2桁の数値を上書きする方法もあります。 
過去の Casio Basic 入門でも、この方法は使っています。

但しこれらの方法では、ある所定の数値の場合に Locate の実行回数を減らすことができずい、本質的な解決策とはならない中途半端な方法だと考えました。

そんなわけで、表示に時間がかかるものの、ロジックとしては素直でコンパクトな前回のプログラムを紹介したわけです。




3桁表示の高速化

sentaro 様から面白いロジックをご提案頂き、それを紹介したいと思います。これは、3桁区切りをチョット巧妙に実現するものです。そのロジックやプログラムの実装方法は初級というよりも中級に入るかも知れません。

例えば 12345678 を表示する前に、コンマが入るところに 0 を入れた数値を作って、

1203450678

として、一旦この数値を Locate で表示します。

次に、コンマが入るところの 0,(コンマ)で上書きして(Locate コマンド使用)、

12,345,678

とすれば良い...といった考え方です。私には思いつかなかった面白いものです。

この8桁の数値を3桁区切り表示する時の Locate 実行回数は3回になって、激減します(前回のプログラムだと10回実行)。

このロジックだと、上で問題が発生した 139096 の場合は、一旦 1390096 に変換して、この数値を Locate で表示。続いてコンマが入るべき 0 の位置に Locate, (コンマ)を上書きするので、

139,096

と正しく表示されます。

なかなかよく考えられたロジックですね。

前回作ったプログラムでは、Locate を7回実行するところ、2回で済むので、表示が大いに高速化されます。




新ロジックの実装

そこで、3桁区切り表示を行うサブルーチン 3DIGIT3DIGIT2 とします。
メインルーチンは、COMPINT2COMPINT3 にします。


プログラムを以下に示します。

・サブルーチン: 3DIGIT2
・メインルーチン: COMPINT3

ファイル名: 3DIGIT2

Z=0⇒Retuen
Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I
Frac(Z÷1
x103)×1x103→U
Int(Frac(Z÷1x106)×1x103)→V
Int(Frac(Z÷1x109)×1x103)→W
Int(Z÷1x109)→D

If L≤8:Than
Locate X,Y,1x108×W+1x104×V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
Locate X+3+2×(I≥3),Y,1x107+1x104×V+W
Locate X+0,Y,1x104×D+W
Locate X+K-2+(I≥3),Y,","
Locate X+K-6+(I≥3),Y,","
I≥3⇒Locate X+1,Y,","
IfEnd



変数の説明

入力値: Z
X座標: X
Y座標: Y


ワーク変数 U:下3桁
ワーク変数 V:中3桁
ワーク変数 W:上3桁
ワーク変数 D:最上位1桁
ワーク変数 K数値の桁数
ワーク変数 I:三桁区切り文字の数



ここで、解説を2つだけ...


青文字の( ) の部分

この ( ) は、0か1かの値になります。( ) の中が正しいなら(真ならば)1、正しくなければ(偽ならば)0になります。この性質をうまく使って計算式に中で利用しています。


赤文字 x104 の表記

これは [x10x] キーを押して入力します。


メインルーチンは、呼び出すサブルーチン名を変更するだけ...

ファイル名: COMPINT3
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT2"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT2"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT2"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"



3桁区切りでの表示が劇的に速くなりました。
コードを眺めて、プログラムの巧妙さを楽しんでください。



fx-5800P の Casio Basic には文字列処理の機能がありませんが、工夫次第で色々と実現できるわけで、逆に言えば Casio Basic がそれだけ高機能だとも言えますね。



つづく...

Casio Basic入門54Casio Basic入門G01 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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




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

Casio Basic入門52

Casio Basic入門
<目次>

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

 修正 2016/07/17

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

Chapter 9 - 初級

前回: Casio Basic入門51 を見る


◆ Chapter 9 の目標: 簡単な換算プログラム - 入力ボックスの活用


Chapter 9-2 
fx-5800P で3桁区切り表示をする

前回作った複利計算プログラムですが、金額の桁数が多い時、どうも見づらいので、金額を3桁区切りで表示するようにしてみます。

例えば、1234567812,345,678 とコンマで3桁区切りすると見やすくなりますね。

金額を格納している変数は、B、T、M の3つです。そこで、これらを表示するコードをサブルーチン 3DIGIT に置き換えることにして、今回はこのサブルーチンを作ってみます。


先ずは、前回作ったプログラムです。

ファイル名: COMPINT
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:9→D:1→E
Prog "INP":Z→B
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース9個)
Locate 7,3,T
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース9個)
Locate 7,4,M
IfEnd

LpWhile 1
Cls
Locate 7,2,"BYE!"



青文字で示した Prog "INP" は、このサブルーチンを実行するだけで値が表示されるので、敢えて Locate X,Y,B を書く必要がありません。しかし、

Prog "INP":Z→B 

の下に、Locate X,Y,B  を追加しても何も変わらず問題ないので、取りあえずこれを追加しておきます。

上のプログラムでは、赤文字で示した Locate コマンドが2カ所あります。

そこで、一旦下のように変更しておきます。ファイル名を COMPINT2 に変更しておきます。


ファイル名: COMPINT2
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:9→D:1→E
Prog "INP":Z→B
Locate X,Y,B
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース9個)
Locate 7,3,T
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース9個)
Locate 7,4,M
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"



これでも問題なくプログラムは動作します。。


その上で、これら赤文字の3つの Locate コマンドを、Prog "3DIGIT" に置き換えることにして、先に サブルーチン 3DIGIT を作ることにしましょう。



サブルーチン 3DIGIT 使い方の方針を決める

このサブルーチンを目的通りに動かすには、3桁区切りで表示する数値、表示位置 X, Y の3つの要素が必要です。
そこで、表示する数値を 変数 X、表示位置を X と Y と決めて、

例えば、金額 B (元本) を3桁区切りで表示させるため、

Locate X,Y,B

の代わりに、

B→Z:5→X:1→Y
Prog "3DIGIT"


と記述することにします。(この場合は、X と Y は既に指定されているので、特に必要ないが、念のため...)

Casio Basic の変数は、全てのプログラムファイルで共有されるので、サブルーチンの直前で変数を設定すれば、その変数をサブルーチンで使えるわけですね。




3DIGIT のロジックを考える

数値 Z を使って、どのようにしてコンマ記号で3桁区切りを行うのか、色々な方法があると思います。
ここでは、分かり安い方法の1つとして、数値の各桁を、左から順に1桁づつ表示を行い、途中で必要なところにコンマ , を表示する作戦にしてみます。

変数 Z に 12345678 が格納されているとして、X 桁目、Y列目から表示するとします。
左から、1桁づつ数字を拾って、変数 C に一旦格納し、Locate X,Y,C で表示.... X を1つ増やしながら、これを繰り返す作戦にします。途中でコンマが必要なら、Locate X,Y,"," を実行すれば良いですね。

コンマの表示は後回しにして、先ずは数字だけを表示するルーチンを作ることにします。ここでは、以下のような方法を採用することにします。


概略の方針を決める

1) 1234567810 で何回か割り算して、1.2345678 にしてから、小数部を取り除く、つまり Int(1.2345678) を実行すれば、1 になりますね。
2) 取り出した1桁の数字を Locate コマンドで表示します。
3) 次に、12345678 の一番左の 1 を取って、2345678 にして、手続き 5) と 手続き 6) で使います。
4) この数字の次に3桁区切り文字(コンマ)が必要な時だけ、続いて Locate コマンドでコンマを表示します。

5) 234567810 で何回か割り算して、2.345678 にしてから、Int(2.345678) を実行すれば、2 になります。
6) 取り出した1桁の数字を Locate コマンドて表示します。
7) 続いて、2345678 の一番左の 2 を取って、345678 にして、後で一番左の 3 を取り出すのに使います。
8) この数字の次に3 桁区切り文字(コンマ)が必要な時だけ、続いて Locate コマンドでコンマを表示します。

1回目の 1) ~ 4) の手続きと 2回目の 5) ~ 8) の手津付きは同じなので、これを 12345678 の桁数と同じ回数だけ繰り返せば、3桁区切りした数値が表示できますね。

これで方針が決まったので、少し具体的な方法へ展開してゆきます。


方針をプログラムコードに変えてゆく - 3桁区切りなし

繰り返し処理で、同じ手続きを所定の回数繰り返す方針ですが、回数を変数 I で管理することにします。1回目は I=1、2回目は I=2 です。

12345678 は8桁なので、桁数の変数を D として、D8 を格納しておきます。Dは計算できます(後で紹介)。すると、繰り返し処理は、D回行えば良いですね。

例に挙げている 12345678 は変数 Z に格納されてます。サブルチン 3DIGIT を実行する前に、3桁区切りで表示する数値は変数 Z に、表示する位置(桁と行)を XY に指定することにしていますね。

すると、手続き 1) ~ 4) では、I=1 です。

手続き 1)
12345678 (=Z)は8桁(D=()なので、10 で7回割り算すれば 1.2345678 になりますね。つまり、12345678 の桁数が D なので、10(D-1) 回割り算すれば良いことになります。10(D-I)回割り算するのは、10(D-I) で割れば良いですね。
そして、Int( ) コマンドで小数部を取り除いて得られる1桁の数を変数 C に格納することにします。これをプログラムで表現すると、

Int(Z÷10^(D-I))→C

となります。ここで、I=1 になっています。


手続き 2)
手続き 1) で得られた C (=1)Locate コマンドで表示します。ここで表示する位置は X桁、Y行なので、

Locate X,Y,C

となりますが、繰り返し処理を考えると、2回目や3回目でも通用する書き方が必要です。そこで、I を用いて、以下のようになります。

Locate X+I-1,Y,C


手続き 3)
12345678 (=Z) の一番左の数字 1 が算出され、変数 C (=1) に格納されています。
この手続きでは、一番左の数字を取って、2345678 にするために、12345678 - C x 10000000 (8桁)を計算すれば良いです。10000000 (8桁)は、108 ですね。今は、D-I = 8 なので、108 = 10(D-I) です。
ここで得られる 2345678 は、変数 Z に再度格納して、手続き 5) 以降で使います。

以上をプログラムで表現すると、

Z-C10^(D-I)→Z

となります。



手続き 4)
必要ならコンマを表示する...これは後で考えます。


これまでのところをまとめ、手続き 1) から 4) を、繰り返すには、


For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
[必要ならコンマを表示]
Next

で良いはずです。

さて、変数 A に格納されている数値の桁数、、例えば 12345678 の桁数を知る方法は、当ブログの逆引きCasio Basic で紹介しています。
具体的には、整数の桁数を求めたい - 逆引きCasio Basic にあります。

A に格納されている整数の桁数 D を得るには、以下のプログラムになります。

Int(log(A))+1→D

この1行を、上の For 文の前に書く必要があります。


Int(log(Z))+1→D

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
[必要ならコンマを表示]
Next

では、このロジックが正しいかどうかを 手続き 5) から 8) で検証してみましょう。

手続き 5)
繰り返し2回目なので、I=2 になっています。そして、Z=2345678です。
Z は7桁なので、10 で6回割り算すれば、つまり 10(D-I) で割れば、2.345678 になり、これから小数を取り除くと 2 になります。

Int(Z÷10^(D-I))→C

が実行されると、C=2 になって、正しいことが分かります。


手続き 6)
手続き 5) で得られた C を表示するには、

Locate X+I-1,Y,C

で問題ないでしょうか
今は、繰り返し2回目なので、I=2 なので、手続き 2) で表示した隣に桁に C が表示されますね。
これで正しいことが分かります。


手続き 7)
2345678 から頭の 2 を取って 345678 を求めて、改めて変数 Z に代入します。

Z-C10^(D-I)→Z

で正しいでしょうか

今、Z=2345678C=2D=8I=2 なので、
Z-C10^(D-I) を計算すると、

2345678 - 2 x 10(8-2)
= 2345678 - 2000000 = 345678


となり、正しいことが分かります。


手続き 8)
必要なら、コンマを表示する...これは後で考えます。


これで問題なさそうです。繰り返しの最後がどうなるか確認してみます。

最後の繰り返しが始まる時は、I=8、A=8、C=7、D=8 となっています。

Int(Z÷10^(D-I)→C

は、Int(8÷10^(8-8)) つまり、Int(8-10^(0)) です。100 = 1  (ゼロ乗は1)なので、

C8 が代入され、正しいことが分かります。

次に、Locate コマンドの表示は、

Locate X+I-1,Y,CLocate X+7,Y,C なので、これも正しいですね。これは単に右隣に表示させるだけなので、特に確認も不要かも知れません。

これで、必要な処理は終わりですが、プログラム上は、

Z-C10^(D-I)→Z

があります。ここで求めた Z はこれ以上使わないので、これがエラーにならなければOKです。そこで、具体的に数値を当てはめると、

8 - 8 x 10^(8-8) = 8- 8x 10^(0) = 8 - 8 = 0

となり、エラーにはならないことが確認できました。

以上をまとめておくと、

Int(log(Z))+1→D

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
[必要ならコンマを表示]
Next


3桁区切り文字を追加表示する

3桁区切り文字であるコンマは、基本的には3桁ごとですが、最初だけ違います。
例えば、12345678 は、12,345,678 となるので、最初の 12 の2桁の後コンマを追加する必要があります。その後は3桁ごとです。

今回は、繰り返しが何回目がを示す変数 I をうまく使ってみます。

12345678 の場合、最初にコンマを追加すべきかどうかは、この数値の桁数、つまり8桁を3で割った余りで判別できそうです。
8を3で割った余りは2です。つまり、頭から2桁まで表示したら、つまり繰り返しが2回目の時、コンマを追加すれば良いですね。
次にコンマを打つべきタイミングは、残りの桁数を3で割って余りが2の時、つまり5回目の繰り返しの時です。

I を3で割った時の余りを計算するには、

fx-5800P で Mod を使いたい - 逆引きCasio Basic を参照してください。Mod 関数は fx-9860GII のCasio Basic に備わっている「余りを求める」関数ですが、fx-5800P にはありません。

I を3で割った時の余りは、

I-3Int(I÷3)

で得られます。

なお、最初に Z の値、例として 12345678 を3で割った余りを計算して、変数 F に入れておくことにします。繰り返し処理のたびに、I を3で割った余りが F と同じなら、コンマを追加すれば良いですね。

変数 F を計算するコードは、

D-3Int(D÷3)→F

です。これを繰り返しの For 文の前に置いておく必要があります。

その上で、必要に応じてコンマを追加表示するプログラムは、

If I-3Int(I÷3)=F
Then
Isz X
Locate X+I-1,Y,","
IfEnd


です。

これを [必要ならコンマを表示] を置き換えれば、うまくゆきそうです。

ここで、Isz X は、X を1つ増やすという Casio Basic 旧来の命令です。
X+1→X 
でも問題ありませんが、Isz X の方が実行速度が速いので、これを採用します。
これを追加したのは、コンマを表示すれば、その後の表示桁 X+i-1 が全て右に1個ずれるので、X 自体を1個増やしておけば良いという意味です。

繰り返し処理は、最後の繰り返しでエラーにならないか、期待しない動作をする可能性を確認することが、大切です。上でも最後の繰り返しを確認しました。コンマの表示部分も、最後の繰り返しの時を検証してみます。

繰り返しの最後は、I=8 になっているので、I を3で割った余りが2になります。F は2なので、等しくなります。
すると、

If I-3Int(I÷3)=F 

は、If の条件を満たすので、コンマを追加表示します。

これで良いでしょうか?

最後にコンマを追加すると、

12,345,678,

となって問題があります。そこで、繰り返しの最後だけは Locate コマンドでコンマを表示しないようにしたいですね。逆に言えば、繰り返し回数が 桁数 D より小さい時だけ Locate コマンドでコンマを表示すれば良いわけです。
具体的には、以下のようにします。

I<D⇒Locate X+I-1,Y,","

とします。

⇒ は旧来の命令です。これについては、以下のコマンドリファレンスを参照してください。

Casio Basic コマンドリファレンス - ⇒命令


なお、⇒ 命令を使った表記は、

If I<D
Then Locate X+I-1,Y,","
IfEnd


といしても良いのですが、この場合は ⇒命令の方が動作が速く、記述も簡便で見やすいので、こちらを採用します。

コンマを表示するために追加した部分を赤文字で示すと、プログラムは以下のようになります。


ファイル名: 3DIGIT
Int(log(Z))+1→D
D-3Int(D÷3)→F

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd

Next



サブルーチンの動作を確認する

このサブルーチン 3DIGIT は、予め以下のような使い方を決めています。

=====
例えば、金額 B (元本) を3桁区切りで表示させるため(X=5, Y=1と指定されているとして)、

Locate X,Y,B

の代わりに、

B→Z:5→X:1→Y
Prog "3DIGIT"


と記述する。
=====

サブルーチンの動作確認のために、わざわざメインルーチンから呼び出すのも良いですが、サブルーチンだけで確認した方が良いと思います。

そこで、メインルーチンで予め設定される変数を、サブルーチンの一番最初で設定して、サブルーチンだけを動作すれば動作確認ができますね。

今回は、動作確認のために、予め設定される変数 Z、X、Y を設定するために、以下のように赤文字のコードを追加しておきます。


ファイル名: 3DIGIT
12345678→Z
5→X
1→Y
""
Int(log(Z))+1→D
D-3Int(D÷3)→F

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next



ここで、"" ("" を続けて2回入力)が必要な理由ですが、"" 無しで上のプログラムを実行すると、3桁区切りの数値が表示されるところが一瞬見え、それが消えて、0 (ゼロ)と表示されますね。Casio Basic の仕様として、プログラム終了直前に計算された値がプログラム終了時に表示されます。もしプログラム終了直前に Locate コマンドが実行されるなら、その表示のまま終了します。

上のプログラムでは、プログラム終了直前に A-C10^(D-I)→A が実行されるので、その計算結果 0 が終了時に表示されるわけです。そして、この 0 の表示は、Casio Basic の内部カーソル行の右端に表示される仕様で、入力命令 " " や出力命令 ◢ が実行されると、内部カーソル行は1行づつ下に下がり、最下行に至れば、そのまま最下行のままになります。

つまり、"" は、何も出力せず、内部カーソル行を1行下げる仕事をしています。

"" を付けて、上のプログラムを実行すると、

12,345,678
        0


と表示されます。終了直前の計算値 0 が1行さがって表示されていますね。
そして、肝心の動作確認ですが、問題ありません。

12345678→Z

で、色々と異なった値を A に代入して、動作確認してみてください。

動作確認で問題なさそうなので、頭に追加した4行を消しておきましょう。


3桁区切り表示サブルーチン

ファイル名: 3DIGIT

Int(log(Z))+1→D
D-3Int(D÷3)→F

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next






メインルーチンからサブルーチンを呼び出す

それでは、完成したサブルーチン 3DIGIT を使うために、少し変更して準備していたメインルーチン COMINT2 をもう一度示します。
サブルーチンに呼び出し Prog "3DIGIT" に置き換える予定の3カ所の Locate コマンドを赤文字にしてあります。


ファイル名: COMPINT2

Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:9→D:1→E
Prog "INP":Z→B
Locate X,Y,B
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース9個)
Locate 7,3,T
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース9個)
Locate 7,4,M
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"



1つめのLocateの置き換え

Locate X,Y,B

を置き換えるには、
直前に変数 X、Y、Z が設定されているので、3DIGIT を呼び出すだけでOKですね。
従って、Locate X,Y,B を以下で置き換えます。

Prog "3DIGIT"


2つめのLocateの置き換え

Locate 7,3,T

を置き換えるには、Z、X、Y を設定した後 3DIGIT を呼び出します。

T→Z:7→X:3→Y
Prog "3DIGIT"



3つめのLocateの置き換え

Locate 7,4,M

を置き換えるには、同様に

M→Z:7→X:4→Y
Prog "3DIGIT"



完成に近づいたプログラムをまとめます。

ファイル名: COMPINT2
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:9→D:1→E
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース9個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース9個)
M→Z:7→X:4→Y
Prog "3DIGIT"

IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"



完成にはもう一息です。実際に実行してみると、表示に問題が出てきます。




表示の不備を修正

入力桁数と出力桁数が違う

コンマが追加されるのて、3桁区切りの出力桁数は必ず入力桁数以上になります。
そこで、サブルーチン 3DIGIT により3桁区切りを行う前に一旦空白で消去する必要があります。

1-C: の右の入力については、以下のように空白で画面の右端まで消去します。

If K=35
Then
5→X:1→Y:9→D:1→E

Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"



TOTALMONTH の右の入力については、Prog "3DIGIT" の前で空白で消去すれば良いですね。

Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→X:7→X:3→Y
Prog "3DIGIT"

Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"




ここまでに作ったプログラムを示します。

ファイル名: COMPINT2
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:9→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"

IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"





最後の仕上げ - エラーの修正

プログラムを実行してみましょう。

1-C: の右には、最大9桁まで入力可能なので、123456789 を入力してみあす。

9digit_input1 

そして、[EXE] キーで入力を確定すると、3桁表示されますが...

9digit_input2 

一番右の桁の 9 がビジーマーカーに半分隠れてしまって、見づらくなっています。

それだけなら良いのですが、2-R: と 3-Y に値を入力すると、エラーになってしまいます。

Argument_ERROR 

123456789 を3桁区切りで表示すると

TOTAL 123,456,789

となり、この行は17文字になります。1行は16桁しかなく、16桁を超える表示を Locate で行うとエラーになるのが仕様です。


そこで、1-C: の右の入力桁を最大8桁に修正します。


[2016/07/16] 追加修正

1-C: の右に入力する際、[1] キーを押し、そのまま何も入力せず [EXE] キーを押すとエラーになります。
何も入力しないで [EXE] キーを押すと、サブルーチン INP が終了する際に変数 Z0(ゼロ)が入ります。 すると、続いて実行されるサブルーチン 3DIGIT で、上から2行目にある Int(log(Z))+1→D でエラーになります。

というのは、Int(log(Z))+1→Dlog(Z) でエラーとなります(log( ) の仕様です)。

従って、サブルーチン 3DIGIT の冒頭で、Z0(ゼロ)ならばスグにサブルーチンを終了させるように変更するために、冒頭に

Z=0⇒Return

を追加します。

ファイル名: 3DIGIT
Z=0⇒Retuen
Int(log(Z))+1→D
D-3Int(D÷3)→F

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next


===== 追加修正はここまで =====


今回は、ここで完成とsます。



ファイル名: COMPINT2
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"

IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"



ただし、1-C: の右に、例えば 87654321 と8桁を入力して、TOTALMONTH を表示させると、2-R:3-Y: の値がそれほど大きくなくても、上と同じ理由で Argument ERROR が発生します。エラーを完全に封じ込めるには、1-C: の入力桁数を7桁や6桁に制限すれば良いのですが、ここで元本として 6千万円程度までなら殆ど問題無いので、ここでは桁数を減らすことはしないでおきます。



3桁区切り表示用のサブルーチンについて、sentaro様から表示が速くなるロジックを提案頂きました。次回は、これを紹介致します。



つづく...

Casio Basic入門53Casio Basic入門G01 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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




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

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

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR