多桁円周率の計算(1)

akatuki様が管理人をされているプログ 「高機能電卓の情報」 で、HP の Prime という機種搭載の言語で、円周率を1000桁まで計算してみた、というエントリーがあります。

HP Prime で円周率を計算してみたよ


HP Prime だけでなく、様々なプログラム電卓に移植する試みがゆっくりと進んでいます。

ここで採用した計算方法は、オイラーによる arctan(X) の展開式で、X=1 の時の式を使って、以下のように変形したものを使っています。

π = 2 + 1/3( 2 + 2/5( 2 + 3/7( 2 + ・・・ ( 2 + k/(2k+1)( 2 + ・・・)))・・・))

そして、この式を計算するために、Spigot アルゴリズムを使用したプログラムが akatuki様により HP Prime 用に移植されました。
Spigot アルゴリズムは、多倍長変数計算をせずに、計算結果を頭から順次得てゆく方法です。


当該プログで akatuki様が移植されたプログラムから、sentaro様が Casio Basic へ移植されました。それに私も少しお手伝いして出来たのが以下のプログラムです。


fx-5800P CasioBasic
ファイル名: PICALC

0→DimZ
"DIGITS"?→X
"BASE"?→K
Int(X÷K)+1→A
10^(K)→D
X+1→DimZ
X÷log(2)→N
"EXE TO GO"◢

Cls
For Int(N)→F To 1 Step -1
Locate 2,1," "  // スペース2つ
Locate 1,1,F

0→C
For A→I To 1 Step -1
Z[I]F+C→W
Int(W÷D)→C
W-CD→Z[I]
Next

2F+1→G
0→C
For 1→I To A
CD+Z[I]→T
Int(T÷G)→W
T-WG→C
W→Z[I]
Next

Z[1]+2→Z[1]
Next

For 1→I To A
Z[I]◢
Next

0→DimZ
"END"


fx-5800P用ソースコードのダウンロードは、こちら から。

このプログラムは、メモリ消費量を抑える工夫がされています。

ちなみに、fx-5800P で BASE (結果変数1つあたりの桁数) を 10 として、100桁の円周率を計算させると、10分56秒かかりました。


プログラムを起動すると、桁数 (DIGITS) と 結果変数1つあたりの桁数 (BASE) を聞いてくるので、それぞれ 100 と 10 を入力します。

PICALC_settings 

すると計算が始まり、しばらく(11分弱) 待つと、結果が表示されます。[EXE] キーを押すたびに、10桁の計算結果が表示されます。

小数点以下、30桁 (10桁 x3) が表示されたところ、

PICALC_result_1 

さらに、続く 4桁を表示させると、

PICALC_result_2 

さらに、続き計算結果を表示させると、

PICALC_result_3 

最後に END が表示されたら終わりです。

この画面の1番上の行は、6から始まる9桁です。これは6の前に0があるのですが、数値の最大桁が0の場合は、その0は表示されないので、このようになっています。この行は、0628620899 と読み替えます。

これで、円周率の小数点以下100桁が求まりました。


fx-5800P で条件を色々と変えて遊ぶには時間がかかりすぎるので、fx-9860GII Casio Basic へ移植しました。

fx-9860GII Casio Basic版
ファイル名: PICALC


ClrMat Z
"Digit"?→X
"Base"?→K
Int (X÷K)+1→A
10^K→D
{X+1,1}→Dim Mat Z
X÷log 2→N
"EXE To Go"◢

ClrText
Locate 2+Int log N,1,"/"
Locate 3+Int log N,1,Int N

For Int N→F To 1 Step -1
Locate 2,1," "  // スペース2つ
Locate 1,1,F

0→C
For A→I To 1 Step -1
Mat Z[I,1]F+C→W
Int (W÷D)→C
W-CD→Mat Z[I,1]
Next

2F+1→G
0→C
For 1→I To A
CD+Mat Z[I,1]→T
Int (T÷G)→W
T-WG→C
W→Mat Z[I,1]
Next

Mat Z[1,1]+2→Mat Z[1,1]
Next

For 1→I To A
Mat Z[I,1]◢
Next

ClrMat Z
"End"


PC経由で fx-9860GII へ転送できる g1m ファイル のダウンロードは、こちら


Base 10で、100桁の計算を行ったら、fx-9860GII ノーマルクロック(29MHz) で 2分37秒、オーバークロック(280MHz)では 24秒でした。

移植先には、上記の他に、sentaro様により、fx-CG10 / 20 の Casio Basic (fx-9860GIIと同じでOK)、fx-9860 と fx-0860GII の Add-in、TI Nspire CX CAS の BASIC とCネイティブ整数版と実数版、...と色々な移植による速度比較が公開されています。



なお、e-Gadget としては、fx-5800P で、もう少し高速化ができないか?に興味があります。今のところ、10分50秒くらいかかっていたのが、7分50秒くらいまで高速化出来ています。

もう少し検討してから次回紹介しようと思います。




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


 


keywords: fx-5800Pfx-9860GIICasioBasicプログラム関数電卓多桁円周率

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





関連記事

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

Casio Basic入門46

Casio Basic入門
<目次>

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

修正:2015/04/12


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

Chapter 8 - 初級

前回: Casio Basic入門45 を見る


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


前回は、入力ボックスを実装し、TC7 を作りました。

温度換算プログラム TC7
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°?"

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

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C

C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F

5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K

K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd

Goto 0


赤文字は、前回修正した部分)


前回までの検討で Chapter 7 で使った旧来の?(入力)命令を Basic コマンドである Getkey を中心としたコードに置き換えることができました。

?(入力)命令は、Chapter 7 で紹介したように多彩な機能を内蔵していて簡単に使えます。その反面 Chapter 8 で見てきたように、柔軟性がありません。

Chapter 8 では、メニュー選択については Basic コマンドで置き換えられることを紹介しました。さらに、Basic コマンドとして用意されていない機能も、Basic コマンドを使ったサブルーチン(入力ボックス)を使って実現しました。ここに新世代 Casio Basic の柔軟性を見て取れ、その能力もお分かりでしょう。そして、新世代 Casio Basic を使いこなせるようになれば、その知識と経験はパソコンなどで使える Basic のプログラミングで役立ちます。


いずれにせよ、これまでのところ Basic コマンドを使えば、旧来の?(入力)命令を置き換えられることを、実際に体験してもらいました。今回は、?(入力)命令でできないことを Basic コマンドで実現します。

?(入力)命令 
は、入力確定の [EXE] キーとテンキーや関数キーなど、入力できるキーが限られます。矢印キーや [DEL] キーなどの制御関連のキーは受け付けません。一方、Basic コマンドである Getkey は、[AC] 以外の全てのキー入力を検出できます。これを利用すれば、より柔軟で実用的なプログラムを作れます。



Chapter 8-4
テンキー以外のキー入力を利用する

ここまで作ってきた温度換算プログラムですが、私が普段使う際、摂氏温度、華氏温度、絶対温度の換算式を簡単に確認したくなることがあります。そこで、私の手元のプログラムでは、これらの計算式を表示させる機能を追加しています。

具体的には、メイン画面で、[FMLA] キーを押したら計算式が表示されるようにしています。

TC8-1 

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

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

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

TC8-2 

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

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

Keys-2 

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


プログラム変更の方針

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

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


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

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

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

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

表示の変更

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









°F

3:










K

MENU
N°?

<FMLA>

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

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

"MENU N°? <FMLA>"

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

TC8-3 

これは、" "(出力)命令 の仕様なので、しかたありません。1行の桁数を目一杯使う表示を " "(出力)命令で実行すると、このように改行してしまいます。" " は便利な命令ですが、限界があります。

そこで、Locate コマンドを使います。

Locate 1,4,"MENU N°?"
Locate 11,4,"<FMLA>"


Locate コマンドは、1行を目一杯使う表示でも改行して画面が上にスクロールするようなことはありません。


[FMLA] キー判定とメニュー番号取得

前回作ったプログラム TC7 から、キー入力判定とメニュー番号取得のブロックを以下に抜き出します。

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


[FMLA] キーのキーコードは、74 です。fx-5800P の取扱説明書で確認するか、キーコードを調べるプログラム GET KEYCODE で確認してください。
 ⇒ fx-5800P / fx-9860GII プログラムライブラリ - キーコード取得

上のコードに、Getkey で取得したキーコードが 74 の時、メニュー変数 M に 4 を代入する処理を追加します。

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


単に、赤文字の部分を最後に追加するだけでOKです。



条件分岐ブロックへの計算式表示処理の追加

プログラム TC7 から、If 文を使った条件分岐ブロックを抜き出します。

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd




変数 M が、1~3 の時の条件分岐で、If 文を青文字で示しました。M が 4 の時の処理を追加(追加部分は赤文字)すると、以下のようになります。:IfEnd が追加されることに留意してください。


Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"

Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
<[EXIT] キーが押されるまで、ここで処理を止める>

IfEnd:IfEnd
IfEnd
:IfEnd


計算式の表示の前に Cls で画面消去を行い、続く4つの Locate コマンドで表示します。

 C = 5(F-32)÷9    
 F = (9÷5)C+32    
 K = C+278.15     
          <EXIT>

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

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

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

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

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

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



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

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

While Getkey≠73
WhileEnd


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

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


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

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

While [ループを継続する条件]
WhileEnd



[ループを継続する条件] として、今回は、Getkey≠73 を指定しています。Getkey で取得するキーコードが 73 でないならば、ループを継続する、と言う動作を行います。つまり、[EXIT] キーが押されない限り、While ループが継続し、プログラムは下へ進みません。そして、[EXIT] キーが押された時は、ループ動作は継続されず、プログラムの実行が WhileEnd より下へ進みます。

 ⇒ Casio Basic コマンドリファレンス - While ~ WhileEnd


似たような処理は、Do ~ LpWhile ループを使っても実現できます。

Do
LpWhile Getkey≠73


似たような処理ですが、While ループとは少し動作が異なります。
While ループは、ループに入った時、つまりループの入口でループを継続するかどうかを判定します。Do ループはループの終わりつまり ループの出口で継続するかどうかの判定を行います。

その結果、While ループは、条件によってはループを一度も回さないことが有るのに対して、Do ループは必ず最低一回はループを回します。

今回のプログラムでは、ループが一度も回らずに下へ抜けても良いので、このような場合は Do ループだと不要なループ動作を行うことになり、無駄な動作になります。従って、While ループを採用します。


Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 3,2,"F = (9÷5)C+32"

Locate 4,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd


(追加部分を赤文字で示した)


以上で、最初の方針通りにプログラムを変更しました。



以上をまとめ、プログラム名変更して、TC8 とします。

温度換算プログラム TC8
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"MENU N°?"
Locate 11,4,"<FMLA>"


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

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"

Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

Goto 0


(今回変更部分を赤文字で示す)



私が普段使っている温度換算プログラムは、TC8 と少し違っています。

以前は、プログラムの終了に [AC] キーを使うようにしていました。と言うのも、[AC] キーで終了させるためには、特にプログラムを書く必要が無いからです。Chapter 7Chapter 8 でも、これまでのところ [AC] キーで終了するようにしています。

特に、fx-5800P の場合は、2つあるプログラムの起動方法のうち、COMPモードで [FILE] キーからプログラムを呼びだして使う場合は、[AC] キーによる強制終了でも全く問題ありません。一方、もう1つの起動方法として、PROGモードで、Prgram Menu からプログラムを呼びだす時は、[AC] キーによる強制終了を行うと、プログラム編集画面に移動してしまいます。ここで、意図せず誤ってキーを押すと、プログラムを改変してしまい、知らないうちにバグが入り込む危険性があります。

fx-9860GII でも Caso Basic でプログラムを作っていますが、この機種は PROGモードからしかプログラムを起動できません。従って [AC] キーによる強制終了には、上記の fx-5800P と同じ危険性が常にあります。fx-9860GII でプログラムを作るようになって、[AC] キーによる強制終了が果たして本当に良い方法なのか、疑問を感じています(以前は、[AC] でプログラム終了にする方法が最適だと考えていました)。

そんなことから、最近作るプログラムは、fx-5800P でも [AC] キーでない終了方法を実装するようにしています。今のところは、[EXIT] キーを押したら、BYE! と表示してプログラムを正常終了させるようにし、fx-5800P と fx-9860GII 両方でこの方法を採用しています。

正常終了させると、PROGモードで起動しても、Prog List 画面が表示されるだけで、プログラム編修画面は表示されないので安全です。

そこで次回は、[EXIT] キーで正常終了させる方法を盛り込んで、完成バージョンとする予定です。次回までに、挑戦してみてください。





つづく...

Casio Basic入門47 / 目次




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


 



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

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




関連記事

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

プログラミング初めの一歩


皆さんが初めてプログラミングを体験した時の言語は、何でしょうか? Basic と言う人は多いと思います。
N88-BASIC だと言う人は、それなりの年代ですね。

私のプログラミングの最初の一歩は、CASIO の FX-502P と言うプログラム電卓で作るものでした。
なにか面白そうだと感じたものの、使いこなせないまま、時間だけが流れました。

その後10年程度してから始めてパソコンでのプログラミングに興味を持って、NECのPC-9801シリーズのパソコンでMS-DOS上で走る DOS BASIC でプログラミングを覚えました。
その後、C言語を覚えて Microsoft C (MSC) で結構色々なプログラムを作って楽しみました。Windows プログラミング最初の一歩は、Windows 3.1 の頃の Quick C で、Windowsのバージョンアップに合わせて Visual C++, Visual Basic, C# と色々さわってきました。下手の横好きですがプログラミングの楽しさを満喫しています。

2013年に Casio プログラム電卓 fx-5800P に出会い、Casio Basic の面白さにハマり、当ブログを始めることになりました。
プログラム電卓でプログラミングを楽しむ人は、プログラミング経験者が多いように感じていますが、プログラム電卓がプログラミング最初の一歩だという人はどの程度いらっしゃるものか、興味があります。


2010年にリリースされた Microsoft の small Basic も面白そうです。
Casio Basic とよく似ていて、変数はグローバル変数のみ、デフォルトでは14のキーワードしかなく、エディタでプログラムを書いて、スグに実行できます。そして構造化プログラミングができます。VB.NET のサブセット版の位置づけです。Windows XP、VISTA、7 で動くとされています。Windows 8 以降の対応については明記されていません。

とにかく小さいことを追求し、憶えることを極力減らし、直感的に使えることを目指しているとアナウンスされています。私が Casio Basic が Basic 修得に向いていると言う考えに限りなく近いコンセプトです
 ⇒ small Basic のFAQページ


もう一つ、極端な最初の一歩として、IchigoJam を紹介しようと思います。
子供(小学生やそれ以下)が Basic プログラミングを始めるためのもの、との位置づけだそうです。スティーブ・ジョブスが発売した Apple や昔の NEC PC8001 のように BASIC が OS で、電源を入れたらスグに BASIC でプログラムを書けるコンピュータです。

ネット接続機能がなく子供が余計なコンテンツにアクセスする心配がなく、BASIC プログラミングのみが可能な究極の単一目的ハードウェアです。ハードウェア的には、プログラム電卓に近いですね。但し、一世代前の行番号付きの BASIC が走ります。面白いのは組立キットで販売されていて、なんと¥1500円程度なのです。お父さんがちびっ子に格好いいところを見せるのにも、お財布に優しくて良いですね。色々なイベントで子供達にプログラミングの楽しさを教える活動をしているのも、とても素晴らしいと思います。
 ⇒ こどもパソコン IchigoJam


皆さんのプログラミング初めの一歩は何でしょうか?




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


 



keywords: CasioBasicプログラミング入門プログラム関数電卓

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


関連記事

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

Casio fx-5800P で Basic を覚えても無駄ですか?

Q) fx-5800P でプログラミングを覚えても無駄だと聞いたのですが?


Q&Aサイトで、fx-5800P で Basic を覚えても他では使えないし、そもそも Basic は古い技術だから学習に値しないと言う回答を見かけます。

1. プログラム電卓搭載の言語
 電卓内蔵のプログラミング言語はその機種専用なので、せっかく覚えても応用が利かないと言うのは一般論としては間違っていません。少なくとも 2005年以前のプログラム電卓については、正しいと思います。しかし、2006年 以降に発売された 新世代 Casio Basic を搭載したプログラム電卓に関してなら、間違っています。

2. 新世代 Casio Basic 搭機種とは?
 ・ fx-5800P
 ・ fx-9860G (OS Ver 2 以降)
 ・ fx-9860GII
 ・ PRIZM fx-CG10
 ・ fx-CG20
 ・ fx-FD10 Pro
 ・fx-CG50
 ・fx-9860GIII
 ・fx-9750GIII

これ以外の Casio のプログラム電卓(例えば fx-71F や fx-72Fなど)や国産の他社のプログラム電卓は、Basicでなかったり、Basic風でしかない言語です。日本メーカーの新製品として購入できる範囲と言う条件が付きますが...

HP や TI などの海外製品については、Basic 搭載機がありますが、それらについてはよく知らないので、選択肢には含めていません。

さらに、20年以上前に販売されていたポケコンと呼ばれるものには Basic 搭載のものがあります。これで Basic を習得するのは無駄ではないでしょうが、私が知る範囲では、これらの言語は1世代古い Basic (行番号付き Basic) なので、上記の新世代 Casio Basic のようにはいかないと思います。なお現在新品として唯一販売されている(但し学校技術教育用として一般販売はされていない)機種は「パソコンライク BASIC」と称しています(SHARP PV-G850VS)。行番号付きの Basic なので構造化プログラミング風のコーディングは難しそうです(POKE COM様のページ)。私自身は触ったことがありません。


3. BASIC は覚える価値が無い?
BASIC はダートマス大学で初めて開発されてから50年を超えましたので、確かに古い技術です。
BASIC は進化していて、コマンド自体は細かな方言の違いがあるものの大した違いではありません。むしろ BASIC を名乗っていても開発スタイルが大幅に異なる Visual Basic などは以前の BASIC とは別物で、Visual Basic と C# は共に microsoft の .NET環境で括られ、同じライブラリを使いつつ表現の違う言語の位置づけです)。Basic は覚える価値が無いというのは、かなり偏った話といえます。

 誕生から50年を迎えたプログラム言語BASICの歴史、その精神とは
 BASIC 50周年

既に BASIC を使いこなせるなら、fx-5800P や他の新世代 Casio Basic 搭載機種でスグにプログラミングが出来ると思います。取扱説明書には簡単な説明しか掲載されていないので、細かいところは実際に使って調べるしかありませんが、経験者なら難しいことではありません。(当ブログでは、取扱説明書に書いていない Casio Basic の仕様や使いこなしを多く紹介しています。)

Visual Basic を使いこなすような経験者が、fx-5800P の Casio Basic など使い物にならないと言われるのなら、その根拠を聞きたいと思います。もしパソコンと同じことをさせる前提でそう言っているのなら、電卓なと使わずパソコンでプログラミングすべきです。実用性を考えた場合、電源ONでプログラムがスグに使えるといった、電卓ならではの役立つプログラムやゲームを、同ブログで多く紹介しています。適材適所です。

十把一絡げにプログラム電卓は使えないという人が居れば、電卓でプログラミングの経験が少ないのだろうと思います。少なくとも新世代 Casio Basic を知らないか、使いこなせないのでしょう。

プログラミングを知らない、あるいは未経験の人が、BASIC を習得してみようと考えている場合、そして手元に fx-5800P やこれ以降に発売された Casio のプログラム電卓 (但し、上記の新世代 Casio Basic 搭載機に限る)を持っていれば、プログラムを習得したり楽しむには十分だと思います。fx-5800P や上記の機種の Casio Basic で習得したことは、決して無駄にはなりません。少なくとも当ブログでは、無駄にならないようなプログラミングを紹介しています。


上記の推奨プログラム電卓の中では fx-5800P が安価に入手できます。同等価格で fx-9750GIII を amazon USAから直接購入できますが、日本語マニュアルが無いので敷居が高いと感実方は多いかも知れません(fx-9860GII の日本語マニュアルがほぼ適用できそうですが...)。

fx-5800P の操作法を含めて初めてプログラムを作る時は、Casio Basic入門38 から Casio Basic入門42 を読んでみてください。
Casio Basic の Basic コマンド、特にポイントとなる Getkey と Locate の使いこなしから始める場合は、上記の後に Casio Basic入門2 に目を通してから Casio Basic入門3 から読み進めてみてください。



e-Gadget は、Casio Basic プログラミングを応援しています。 



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


 



keywords: CasioBasicプログラミング入門プログラム関数電卓

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

関連記事

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

プログラム電卓でプログラムを覚えたいのですが?

Q) 関数電卓を買って使っています。プログラムを作れるようなので、作り方を教えてください。

2015/03/21 更新


Q&Aサイトで、このような質問を見かけます。

電卓には、100均で買える安いものから、1万円を超える高価なものまであります。Casioの電卓で言えば、6千円台からプログラムを作れるプログラム関数電卓があり、高価なものだとグラフ関数電卓があります。ここでは、これらをひとくくりにしてプログラム電卓と言うことにします。

今店頭で売られている国産のプログラム電卓の中で、fx-5800P、fx-9860GII、fx-CG20、fx-CG50、fx-FD10 Pro を買ったのならば、プログラムを覚えるには良い選択です。これらの製品には、Casio Basic と言うプログラミング言語が搭載されていて、ゼロからプログラミングを覚えるにはとても向いていると思います。これらの製品を使って、Casio Basic を使えるようになると、パソコンで使う Basic 言語の導入として役立ちます。

もし、Casio の fx-72F やCasioのホームページに載っていない古い機種、あるいは国産の他社の製品ならば、Basic プログラミングを覚えるにはあまり向いていないでしょう。確かにプログラムを作ることは出来ますが、残念ながら覚えたことはその機種では役立ちますが、Basic 習得にはあまり役立たないからです。

上記で薦めるCasio Basic 搭載機では、電卓の電源を入れたら、キーを数回押すだけで、スグにプログラムを入力でき、作ったプログラムをスグに実行できます。チョットした操作を覚える必要がありますが、たかだか数回のキー入力ですから、スグに覚えられます。

Casio Basic には、Basic言語として最低限必要な機能が全て揃っています。これを覚えれば、他の Baisc 言語、例えば Visual Basic などで、そのまま応用できます。あとは、Casio Basic にないコマンド類を覚える必要がありますが、Casio Basic で覚えたことは殆ど無駄になりません。

新しいことを覚えるには、覚えることが少ない方が良いに決まっています。何か実現させたい動作に対して、色々なプログラムの書き方があります。機能が豊富であればあるほど選択肢が増えるので、プログラミングに慣れていないうちは、高機能な言語を使うと苦労します。Casio Basic は、最低限の機能が備わっていると書きましたが、そのおかげで選択肢が少ないので、プログラムの書き方の選択に悩むことが低減されます。


上記の推奨プログラム電卓の中では fx-5800P が最も安価なので、これから買うのなら、fx-5800P が良いと思います。

fx-5800P の操作法を含めて初めてプログラムを作る時は、Casio Basic入門38 から Casio Basic入門42 を読んでみてください。
Casio Basic の Basic コマンド、特にポイントとなる Getkey と Locate の使いこなしから始める場合は、上記の後に Casio Basic入門2 に目を通してから Casio Basic入門3 から読み進めてみてください。



e-Gadget は、Casio Basic プログラミングを応援しています。 



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


 



keywords: CasioBasicプログラミング入門プログラム関数電卓

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



関連記事

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

Casio Basic入門45

Casio Basic入門
<目次>

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

2015/04/12 修正


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

Chapter 8 - 初級

前回: Casio Basic入門44 を見る


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


前回は、e-Gadget オリジナルの入力ボックス利用の準備と使い方を紹介しました。

前々回作ったプログラム TC6 では、温度入力画面と温度出力画面が異なる画面構成となっています。
例えば、以下のような温度出力画面になっている時、

TC5 6 

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

TC6 4 

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

TC6 5 

これでもプログラムとして全く問題ないのですが、画面構成を変えずに、摂氏温度 20 と表示されている位置で入力できる入力ボックスを使えば、換算プログラムとして見やすく、使いやすくなると思います。



Chapter 8-3
換算プログラムに入力ボックスを実装する


今回は、温度換算プログラム TC6e-Gadget オリジナルの入力ボックスを導入します。先ずは、修正前の TC6 のソースコードを示します。

温度換算プログラム TC6
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°?"

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

Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd

Goto 0



今回は、上の赤文字の部分を、変更してゆきます。

入力ボックスは、元々ある画面構成を崩さずに、指定した位置と範囲にキー入力させるものです。

入力ボックスを使うには、

[入力ボックスの設定]
[入力ボックスの呼び出し]
[入力ボックスから、入力値の受け取り]


の順に、コードを書いてゆきます。


TC6 2 

このような画面構成で使うための、入力ボックスの設定を下記のようにします。


1) 摂氏温度の入力
"C"?C を以下に置き換える
置き換えるコード
  4→X:1→Y:9→D:2→E (入力ボックスの設定)
  Prog "IN"          (入力ボックスの呼び出し)
  Z→C
              (入力値の受け取り)

※ 入力ボックスの設定は、
  ・ 左端の桁(X座標): 4
  ・ 左端の行(Y座標): 1
  ・ 桁数:
  ・ インジケータ種別: 2 (
<EXE>:ENTER
※ 入力値の受け取りは、
  ・入力値格納変数: Z (この変数は固定)
  ・Z を摂氏温度格納変数 C に代入



2) 華氏温度の入力
"F"?F を以下に置き換える
置き換えるコード
  4→X:2→Y:9→D:2→E (入力ボックスの設定)
  Prog "IN"         (入力ボックスの呼び出し)
  Z→F
              (入力値の受け取り)

※ 入力ボックスの設定は、
  ・ 左端の桁(X座標): 4
  ・ 左端の行(Y座標): 2
  ・ 桁数: 9
  ・ インジケータ種別: 2 (<EXE>:ENTER
※ 入力値の受け取りは、
  ・入力値格納変数: Z (この変数は固定)
  ・Z を華氏温度変数 F に代入


3) 絶対温度の入力
"K"?K を以下に置き換える
置き換えるコード
  4→X:3→Y:9→D:2→E (入力ボックスの設定)
  Prog "IN"         (入力ボックスの呼び出し)
  Z→K
              (入力値の受け取り)

※ 入力ボックスの設定は、
  ・ 左端の桁(X座標): 4
  ・ 左端の行(Y座標): 3
  ・桁数: 9
  ・ インジケータ種別: 2 (<EXE>:ENTER
※ 入力値の受け取り
  ・入力値格納変数: Z (この変数は固定)
  ・Z を絶対温度変数 K に代入



入力ボックスでの入力値は、必ず変数 Z に格納される仕様です。従って、入力ボックスが終了した後は、直ちに Z の値を 適切な変数に代入しておく必要があります。

なお、例えば

Prog "IN"
Z→K


の2行は、Casio Basicでは、区切り文字 : を使って1行に書けるので、

Prog "IN":Z→K

と書いても良く、行数を節約することもできます。

以上、3カ所を書き換えてから、プログラムを実行してみます。


その前に、前回作ったプログラム TC6 のプログラム名を TC7 に変更しておきます。

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

TC7-ProgMenu 

先ず最初に、TC6 のファイル名を TC7 に変更し、その後で TC7 を変更することにします。

[3] (3:EDIT) で、Prog Edit 画面を表示し、TC6 にカーソルを合わせ、

TC7-ProgEdit 

[FUNCTION] キーで、File Commands 画面を開き、

TC7-FileCOmmands 

[2] (2:Rename) を選択すると、File Name? 画面が現れます。

TC7-FileName 

ここで、TC6TC7 に変更します。
この画面では、自動的にアルファベットモードに切り替わっているので、数字を入力するには、[ALPHA] キーを1回押してアルファベットモードを解除します。
ファイル名を変更したら、[EXE] キーで確定します。すると Prog Edit 画面に切り替わり、TC7 にカーソルが合っています。

TC7-ProgEdit_2 

ここで、[EXE] キーを押せば、プログラム編集画面に切り替わり、そこでプログラムの変更を行います。


では、上の3カ所を、実際に変更してください。


変更したプログラム TC7 を実行してみましょう。

[EXIT] キーを2回押すと、Program Menu 画面に戻ります。

Program Menu[2] (2:RUN) を選び、Prog List が表示されると、

TC7-ProgList 

TC7 にカーソルが合っているので、そのまま [EXE] キーで TC7 を起動します。


プログラムを起動すると、以下の表示になります。

TC7-1 

ここで、[1] キーを押すと、以下のようになります。

TC8-bug1 

本来以下のようにしたいので、明かにバグです。但し入力ボックスのバグではありません、念のため。

TC7-2 

バグの画面では、1行目の >>>>>>>>> と 4行目の <EXE>:ENTER が入力ボックスにより描画されています。本来は、他は入力ボックスが呼びだされる前の表示のままであることを期待していました。

上のプログラムソースで、If M=1:Then の直前で、Cls が実行されているのが、バグの原因です。逆に言えば、せっかく入力ボックスは必要なところだけ描画するのに、全部画面消去しては意味がありません。この Cls"C"?→C を使っていた時には必要でしたが、今は不要です。

そこで、プログラムを再度編修して、Cls を削除してから、プログラムを実行します。操作方法は上と同様です。

起動画面は、変わらず以下のようになります。

TC7-1 

ここで、[1] キーを押して入力ボックスを呼びだします。

TC8-bug2 

今度は、4行目の表示がおかしなことになっています。

入力ボックスは、できるだけ元の画面構成を壊さないことがコンセプトなので、必要なところしか描画しません。この例のように、インジケータ <EXE>:ENTER の部分のみ描画して、それ以外の表示は残しています。これは仕様通りの動作です。従って、4行目の INPUT と言う表示がそのまま残っています。

そこで、If M=1:Then を実行する前に、4行目の INPUT を消去すれば良いことが分かります。
そのためには、

If M=1:Then の前に Locate 1,4,"   " (スペース5個)を追加します。


では、この修正を行って、もう一度プログラムを起動して、動作確認します。

プログラムが起動したら、[1] キーを押してみます。
一瞬 INPUT の表示のみが消え、MENU N°? が残り、その後 <EXE>:ENTER が表示されます。チョット不自然な感じです。この状況は、是非実際に実行して確認してください。

この不自然な状況を改善するために、Locate 1,4,"   " (スペース5個) ではなくて、4行目全体を消去するように変更します。

つまり、

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

とすると、4行目の書き換えが自然な感じになります。

従って、上の ClsLocate 1,4,"        " (スペース16個) に置き換えるのが最適な変更です。

fx-5800P は全体的に動作が遅いので、INPUT の消去と MENU N°?<EXE>:ENTER で上書きする順序がそのまま見えてしまうことから、今回のような不自然さを視認できてしまいます。4行目全体を消去することで、上書きの工程が見えなくなるのが、不自然さ解消の理由です。


以上の修正は、以下のように言い換えることだできます。

If M=1:Then

の上にある Cls による全画面消去4行目だけ1行消去に変更すうために、この Cls

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

に置き換える。



ここまでの変更を反映させたプログラム TC7 を以下にまとめます。

温度換算プログラム TC7
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°?"

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

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C

C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F

5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K

K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd

Goto 0


(今回の変更部分を赤文字で示す。)


では、最後にもう一度動作確認しておきましょう。
修正が終わったら、プログラム編修画面が表示されている状態で [EXIT] キーを2回押して Program Menu に戻ります。

TC7-ProgMenu 

Program Menu[2] (2:RUN) を選び、Prog List が表示されると、

TC7-ProgList 

TC7 にカーソルが合っているので、そのまま [EXE] キーで TC7 を起動します。

TC7-1 

摂氏温度を入力するために、[1] を押すと、入力ボックスが現われ、

TC7-2 

ここで、20 を入力し、

TC7-3 

[EXE] で確定すると、

TC7-4 

入力した摂氏温度と共に、華氏温度と絶対温度の換算値が表示されます。

今度は、華氏温度を入力します。[2] を押すと、入力ボックスが現れ、

TC7-5 

華氏 -40 度 を調べるために、-40 を入力し、

TC7-6 

[EXE] で確定すると、

TC7-7 

入力した華氏温度に合わせて、換算された摂氏温度と絶対温度が表示されます。

画面構成が変わらず、数値のみが変わるので、色々な値を入力した時の換算値の変化を把握しやすいことが分かると思います。色々と触っているうちに、-40度は、摂氏でも華氏でも同じだということに気がつきました。



入力ボックスの作成については、Chapter 3 で紹介し、さらに実用的なキー応答速度にする方法を Chapter 6 で紹介しています。入力ボックスを作るのは初級レベルには難しいものの、使うのは難しくないと思います。如何でしょうか?

旧来の?(入力)命令は、入力待ちなどの多彩な機能を内蔵しているので、使うのは楽ですが、入力確定のワンアクションが必要で、好きな位置で入力を行えないなどの制限があります。今回は、入力ボックスを使っての制限を取り払うことができました。

さて、温度換算プログラムは、私も実際に使っています。但し、もう少し機能を追加しています。次回は、この機能追加を行って、温度換算プログラムを仕上げることにします。



つづく...

Casio Basic入門46 / 目次




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


 



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

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



関連記事

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

Casio Basic入門43

Casio Basic入門
<目次>

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

2015/03/07
2016/03/16 修正


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


前回: Casio Basic入門42

Chapter 8 - 初級

◆ Chapter 8 の目標: Basic命令を使ってみる

Chapter 7 では、旧来の命令をできるだけ利用し、その能力を見てきました。旧来の命令には多彩な機能が備わっていて、うまく活用すると、実用的なプログラムを作れることを紹介しました。

但し、旧来の命令は Casio 独自のものなので、せっかく覚えても Basic プログラミングの学習としては応用が利かず、一般的な Basic プログラミングには役立ちません。

2006年に登場した fx-5800P 以降の Casio のプログラム電卓(プログラム関数電卓とグラフ関数電卓)には、新世代 Basic Basic が搭載されていて、多くの Basic 言語との共通性が高く、実用的なプログラムを作れます。

?(入力)命令◢(出力)命令は、Basic コマンドを使って置き換えられます。そこで、Chapter 7 で作ったプログラムを Basic コマンドに置き換え、さらに旧来の命令ではできないことを実現してゆきます。




Chapter 7 で作った温度換算プログラムのプログラム TC5 のコードを示します。

温度換算プログラム TC5
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°"?→M

Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd

Goto 0


このプログラムは、COMPモードとPROGモードの両方から実行できます。具体的な操作方法は Chapter 7 でも紹介しています。

fx-5800P の電源を入れます。fx-5800P は、[MODE] キーか [FUNCTION] キーを押して表示されるメニューから様々な機能を呼び出せます。

PROGモードから 既に作った温度換算プログラム TC5 を呼びだして実行してみます。

[MODE] キーを押してモードメニューを表示させ、

TC5 Mode Menu 

[5] (5:PRG) を押して、PROGモードに入ると、Program Menu が表示されます。

TC5 Prog MenuTC5 Prog List 

プログラムを実行させるために [2] (2:RUN) を押すと、Prog List が表示されます。

TC5 1 

PROMモードからプログラムを起動したので、画面上端に小さく PROG と表示されています。
Prog List[▲] キーと [▼] キーで、カーソルを TC5 に合わせ、[EXE] キーで プログラムを起動します。

TC5 2 

温度換算プログラム TC5 が起動した時の画面です。


[1][2][3] のいずれかのキーを押してメニュー選択を行います。

ここで、摂氏温度を入力するために、[1] キーを押すと以下のようになります。

TC5 3 

画面が1行スクロールして上にずれます。そして一番下の行(4行目)に今入力した 1 が表示されています。
実は、このスクロールはチョット気に入らないのですが、?(入力)命令の仕様なのでしかたありません。

そして、この入力を確定するために [EXE] キーを押すと、以下の摂氏温度入力画面になります。

TC5 4 

ところで、1つ上のメニュー番号の入力で [EXE] キーで確定するのは、無駄な操作ではないでしょうか?
つまり、[EXE] キーで確定することなしに、[1][3] のテンキーを押したら、直ちに摂氏温度入力画面に切り替わって欲しいと思います。しかし、[EXE] で入力確定しなければならないのは、?(入力)命令を使う限り避けられない仕様です。

そこで今回は、[EXE] キーを押さずに、メニュー番号を入力したら直ちに温度値入力画面に切り替えるようにプログラムを変更してゆきます。これは、?(入力)命令の代わりに Basic の入力コマンド Getkey を使って実現できます。



Chapter 8-1
メニュー選択に Getkey を使う

上に示したコードで、赤文字で示した1行

"INPUT MENU N°"?→M

は、?(入力)命令を使って、入力した番号を 変数 M に格納しています。余計な [EXE] キーによる入力確定を行わないようにするには、この部分を?(入力)命令以外の方法でキー入力をさせるように変更します。

新世代 Casio Basic には、2つの入力方法があります。

 ・?(入力)命令
 ・Getkey コマンド


今回は、この1行を Getkey コマンドを用いたコードに置き換えます。



Getkey コマンド

先ずは、[1] キーが押されたことを検知する処理を Getkey を使って実現します。

何かキーが押されている時に Getkey コマンドが実行されると、そのキーに対応したキーコード(2桁のコードか0) が得られます。電卓の全てのキーにそれぞれ異なったキーコードが割り振られています。但し [AC] キーだけが例外的にキーコードが割り振られていません。キーコードを検出すれば、[AC] 以外の全てのキーを判別できます。

Getkey→L

と書くと、Getkey が取得したキーコードが変数 L に格納されます。この書き方は、Getkey が変数のように見えます。Getkey は取得したキーコードの値を保っていて、それを変数 L に代入する、と考えると良いわけです。

もし何もキーが押されていない場合は、Getkey0 になるので、変数 L0 が入ります。

Getkey2桁のキーコードや 0 を格納した変数のように振る舞う 時、Getkeyキーコードあるいは 0  を返す、と言います。これは、Casio Basic に限らず、ほぼ全てのプログラミング言語で使われている言い方です。「返す」は、リターン(return)とも言います。返された値を「戻り値 」と言います。

Casio Basic では、値を返すBasic コマンドは GetKey しかありません。Basic コマンド以外では、電卓に内蔵されている各種関数が値を返します。例えば、Int( )、Frac( )、log( )、sin( )、cos( )、などがあります。
  • Int( )  小数を切り捨てた整数部を返す
  • Frac( ) 整数を切り捨てた小数部を返す
  • log( )  対数関数
  • sin( )  三角関数
  • cos( )  三角関数

さて、プログラムは、上から下へ命令やコマンドが順次実行されます。条件分岐の If のように、実行順序を変更するコマンドが無い限り、上から下へ1行づつ順に実行されるのが、プログラムの大原則です。これは Casio Basic に限らず、全てのプログラミング言語に共通の、重要ポイントです。

※参考: イベントドリブン(イベント駆動)型と言われる Windowsプログラミングでも、Winidows自身が行っているメッセージループなどの全ての動作に対して(見えなくなっているだけで)、この大原則は当てはまり、少なくともプログラマが書く部分だけをみても、各関数やプロシージャ内ではこの大原則に支配されます。

?(入力)命令は、[EXE] キーで入力確定されるまで、プログラムの実行を止める機能を備えていることは、Chapter 7 で説明しました。一方、残念なことに Getkey コマンドには、実行を一時停止する機能が備わっていません。

すると、Getkey→L が実行されているその瞬間にキーが押されないと、キーの検出が出来ないことになります。しかし、この仕様のおかげで、リアルタイムでキー入力の検出が可能になります。
 ⇒ Casio Basic コマンドリファレンス - Getkey

Getkey の使いこなしについては、以下で詳しく説明しています。
 ⇒ Casio basic 入門3
 ⇒ Casio Basic 入門4



キー入力の取得方法

キー入力取得方法を紹介します。

Do
Getkey→L
LpWhile L=0


この3行で、[EXE] キーでの入力確定無しに、キー入力を取得できます。


Do は、LpWhile と組み合わせて、繰り返し処理を行います。
繰り返しを「ループ」とも言い、DoLpWhile で構成される繰り返し処理を Do ループと言います。
  1. プログラムは上から下へ順次実行されます。
  2. 上から下へ処理が進んでゆき、Do に出くわします。ここでは特に何もせず、次に進みます。
  3. 次は、Getkey→L です。これが実行された時に偶然何かキーが押されていれば、そのキーのキーコードを取得して変数 L に格納します。これが実行された時に残念ながらキーが押されていない場合は、変数 L0 が格納されます。そして、プログラムはさらに下へ進みます。
  4. その次の処理 LpWhile L=0 が実行されます。 この1行では、変数 L0 ならば Do へジャンプして、Do から下へ処理を繰り返します。L0 以外ならそのまま下へ実行が進み、この3行の繰り返し処理から脱出します。
この3行のコードにより、DoLpWhile L=0 の間を繰り返します。そして、L0 が入っている限り、この3行を延々と繰り返します。L0 が入っていると言うのは、押されたキーが検出され無いことですから、キーが押されたことを検出するまで、この3行が繰り返されます。

L=0 はキーが押されていないことなので、キーが押されない限りこのループが回り続け、その下の処理には移りません。言い換えればこのループは、キーが入力されるのを待っている処理になっています。

そして、キー入力が検出された時に、この3行の繰り返し(Do ループ)から解放され、プログラムは下へ進むことができます。下に進んだ時は、変数 L には押されたキーのキーコードが格納されています。

この3行は、キー入力待ちと入力キーのキーコードを取得する機能、つまり今欲しい機能を実現することが分かると思います。


以上を頭に入れて、改めて Do ~LpWhile がどういうものか、見てみましょう。
 ⇒ Casio Basic コマンドリファレンス - Do ~ LpWhile

Do は、LpWhile からジャンプする先を示す目印です。Goto に対する Lbl と同じようなものです。

LpWhile [繰り返し条件] は、[繰り返し条件] が満たされる時、厳密に言うと [繰り返し条件]「真」ならば、Do へジャンプします。

Do
Getkey→L
LpWhile L=0


この例では、繰り返し条件は、L=0 です。L0 である限り、この Do ループが繰り返されます。
L が 0 と言うことは、Getkey がキーコードを取得していないことなので、何かキーが押されるまでは、このループが回り続け、キーが押されたらそのキーコードを変数 L に入れて、ループが終わります。

この3行は、押されたキーの判別を行うためによく用いる方法です。



キーコード

Casio Basic では、電卓の [AC] キー以外の全てのキーに対して、異なる2桁のキーコードが割り振られています。
テンキー以外にも、例えば [DEL] キーや、[▼][▲][▶][◀] キーなどにも、それぞれ異なるキーコードが設定されています。つまり、Getkeyを使えば、全てのキーを判別できるので、Casio Basic ではかなり実用的なプログラムを作れます。

さて、[1] キーのキーコードは 35 です。今回のプログラムでは、[2][3] キーの取得も行います。[2] のキーコードは 36[3] のキーコードは 37 です。では、[4] のキーコードは、38 かと言えばそうではなくて、21 です。キーコードは、テンキーの数字との簡単な関係にはなく、ばらばらです。

キーコードについては、fx-5800P 取扱説明書の99ページを見るか、キーコード取得プログラム を使って、調べる必要があります。



メニュー番号取得

温度換算プログラム TC5 で、メニュー番号取得は以下の1行で行っています。

"INPUT MENU N°"?→M

この1行を、?(入力)命令を使わずに実現するのが、今回の目的です。


何かキーが押された時のキーコード取得は、上で検討したように、以下の3行で実現できます。

Do
Getkey→L
LpWhile L=0


[1], [2], [3] キーに対する、キーコードとメニュー番号は以下の関係です。

押されたキーキーコード:変数 Lメニュー番号: 変数 M
[1]351
[2]362
[3]373

そこで、キーコードを格納した変数 L から 対応するメニュー番号変数 M を If 文を使った条件分岐で対応付けることにします。

If L=35
Then 1→M
IfEnd
If L=36
Then 2→M
IfEnd
If L=37
Then 3→M
IfEnd


If 文については、コマンドリファレンスをご覧ください。
 ⇒ Casio Basic コマンドリファレンス - If 文



⇒(条件分岐)命令

条件分岐には、If 文以外に、Casio Basic には、⇒命令があります。これは、新世代 Casio Basic がリリースされる前から Casio のプログラム電卓に搭載されている Casio Basic 特有の命令です。

If [条件]
Then
[処理]
IfEnd


⇒命令を使って同じ処理を行えます。

[条件][処理]

と書けます。

Chapter 8 では、Casio Basic の旧来の命令を使わず、Basic コマンドを使うことをメインテーマにしているのに、何故ここで旧来の命令である⇒命令を取り上げるのか?という疑問が出てくると思います。

⇒命令には、他の旧来の命令にない、大きな特徴があります。If ~Then~IfEnd 文に比べて、圧倒的に処理速度が速い(2倍程度速い)と言う点です。特に、fx-5800P は全般的に処理速度の遅いハードウェアなので、2倍も速い命令の価値が出てきます。そして、シンプルに1行に書けるので、プログラムの可読性が向上するといった副次的なメリットもあります。

If L=35
Then 1→M
IfEnd
If L=36
Then 2→M
IfEnd
If L=37
Then 3→M
IfEnd


を ⇒(条件分岐)命令を使って書き直すと、以下のようになります。

L=35⇒1→M
L=36⇒2→M
L=37⇒3→M


どうでしょうか?圧倒的に読みやすいですね!そして処理速度が速いのです。

但し、If 文で Else を使う場合は、⇒ 命令への直接の置き換え(= 同じ論理構造での書き換え)はできません、
⇒命令には、If 文の Else に相当する機能が用意されていないからです。⇒(条件分岐)命令は、If 文を完全に置き換えるものでななくて、限定的に Else が無い時に有用、という点には留意が必要です。

以上の検討により、

TC5 のメニュー番号取得部分

"INPUT MENU N°"?→M

は、以下のように置き換えられます。

"INPUT MENU N°?"
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M




以上を反映させたプログラムを TC6 とします。今回変更した部分を赤文字で示します。

温度換算プログラム TC6
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°?"

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


Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd

Goto 0



ところで、赤文字部分の一番上の "INPUT MENU N°?" ですが、説明無しにいきなり出てきました。
Getkey コマンドは、単にキーコードを取得する機能しかないので、?(入力)命令のように表示機能が含まれていません。従って文字列表示を行う必要があります。

?(入力)命令で説明のための文字列を表示する時、その時の内部カーソル行に表示を行います。” ”(出力)命令も、その時の内部カーソル行に表示を行います。今回は同じ行に単に表示を行うために ” ”(出力)命令を使ったので、同じ行に表示されます。従って Locate コマンドを用いる必要はありません。

但し、” ”(出力)命令を記述する際に、それが実行されるときの内部カーソル行を把握しきれないことが殆どです。従って Locate コマンドを使って、出力の位置を明示的に指定する方が、確実でプログラミングは楽になります。従って、

"INPUT MENU N°?"

の代わりに、

Locate 1,4,"INPUT MENU N°?"

とすることを推奨します。

なお、Cls コマンドを実行すると、内部カーソル行がリセットされて1行目に設定されます。
上のプログラムでは、Cls の後に 表示しか行っておらず、内部カーソル行を確実に把握できるので、例外的に Locate コマンドを使わずにおきます。



それでは、上記の変更を実際に行います。

先ず、プログラム名 TC5TC6 に変更します。

今、PROGモードにある場合は、[EXIT] キーを何回か押せば、Program Menu 画面に戻ります。

TC5 Prog MenuTC5 Prog List 

ここで、[3] (3:EDIT) を選ぶと、Prog Edit 画面になります。

TC5-ProgEdit 

ここで、ファイル名 TC5TC6 に変更したいので、TC5 にカーソルを合わせ、[FUNCTION] キーを押します。

File Commands 

ここで、[2] (2:Rename) を選ぶ。

TC5-FileName 

画面上端、左側に、小さなアイコン A が表示されているので、アルファベット入力モード(ALPHAモード)になっています。
ファイル名末尾の 56 に変えるので、[ALPHA] キーを押して、ALPHAモードを解除し、TC6 に変更します。

TC6-FileName 

[EXE] キーで確定します。

TC6-ProgEdit 

TC6 にカーソルを合わせ、[EXE] で確定すると、プログラム編集画面になります。

上記の TC6 のソースコードに従って、赤文字部分を変更・入力します。入力が終わったら [EXIT] キーを2回押して、Program Menu 画面に戻ります。

TC5 Prog MenuTC5 Prog List 

[2] (2:RUN) を選ぶと、

TC6-ProgList 

Prog List が表示されます。PROGモードから呼びだした Prog List なので、画面上端に小さく PRGM の表示が見えます。TC6 をカーソルで選び、[EXE] キーでプログラムを起動します。

TC6 2 

ここで、摂氏温度を入力することにし、[1] を入力すると、[EXE] による入力確定なしに、直ちに温度入力画面に移行します。

TC6 3 

摂氏温度入力画面です。

TC6 4 

20 を入力し、[EXE] で確定すると、

TC6 5 

換算結果が表示されます。動作確認してみてください。正常に動作すると思います。

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

TC6 6 

強制終了されたことが表示され、ここで [EXIT] キーを押せば、

TC6 7 

プログラム編集画面に戻ります。

このように、PROGモードでプログラムを実行すると、強制終了した時に、プログラム編集画面に戻るので、うっかりプログラムを変更してしまう可能性があります。従って、一旦完成したプログラムを実行するには、COMPモードから Prog List を出して、そこから実行すべきです。

[MODE] キーを押して、モードメニューを表示させ、

TC5 Mode Menu 

[1] (1:COMP) を選びます。すると、通常の電卓の画面(COMPモード)になるので、そこで [FILE] キーを押して、Prog List を表示させます。

TC6 ProgList 

COMPモードからの呼び出しなので、画面上端に PROG 表示がありません。ここで、TC6 を選び、[EXE] で確定すると、

TC5 2 

プログラムが起動します。ここで [AC] キーを押して終了させます。

TC6 6 

[AC] で終了(強制終了)されたことが表示され、[EXIT] キーを押すと、

TC6 8 

PROGモードの時とは、異なった画面表示になります。
プログラム編集画面にならず、COMPモードで

Prog "TC6"

と表示されています。このままの状態で [EXE] を押すと、再び TC6 が起動します。つまり、COMPモードで Prog "TC6" と入力して [EXE] を押すと、TC6 が実行されることが分かります。

試しに、COMPモードで、Prog "TC6" をキー入力してみます。

[SHIFT] [FILE] (Prog) と入力すると、画面に Prog と表示されます。続けて

[ALPHA] [√■] ()
[ALPHA] [2] ()
[ALPHA] [°’’’] ()
[6]
[ALPHA] [√■] ()


と入力すると、Prog "TC6" と表示されます。そして [EXE] を押すと プログラム TC6 が起動することが分かります。つまり、この手入力のプロセスの代わりに、リストからプログラム名を選んで実行するのが、[FILE] キーの正体なのです。



[2015/03/16 追記] バグ修正
[2016/02/14 修正] 画像差し替え&説明修正

うっかり、大切なポイントが抜けていましたので、追記します。

上で示したソースのままですと、たまにバグが発生します。具体的には、下記の異常です;
  • [1][3] 以外のキーを押した時、それを無視するはずですが、入力画面が表示されてしまう。

このプログラムを普段使っているのですが、そのバージョンではこのバグへの対策をしているのですが、今回それを忘れていました。

プログラム起動時のメニュー選択画面で、[1][3] 以外のキーを押した時の画面の一例:

TC5 4 

[1] を押していないのに、摂氏温度を入力させる画面になってしまいました。[1][3] 以外のキーを押しても無視するようにしたいのです。

このようなバグが発生するのは、プログラム起動時にメニュー番号変数 M に 1 が格納されていることが原因です。

キー検知とメニュー番号取得のブロックを以下に転記します。

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


もし、プログラム起動前に、変数 M に 1 が格納されていたとします。そして [1][3] 以外のキー、例えば [9] を押したとします。すると、このブロックでは、Getkey で取得したキーコードは、L=35 でも L=36 でも L=37 でもないので、下の3行は実行されません。すると、変数 M には 1 が入ったままで、次の処理へ進みます。

すると、If M=1:Then 以下が実行され、まるで [1] キーを押したのと同じ処理になってしまいます。

そこで、[1][3] 以外のキーが押された時には、変数 M13 以外の値が入っているようにします

そこで、このブロックが実行されるたびに、事前にメニュー番号にはなり得ない値で変数 M を初期化しておく作戦にします。今後機能拡張によってメニューが増える可能性が無いとも限りません。そこで、メニュー番号 -1 にすることは多分無いので、M-1 で初期化することにします。

具体的には、

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


と変更しておきます。

キー検知のたびに、M-1 で初期化しておくと、M13 以外の時は、M = -1 になるので、これに続く If 文での M の値による条件分岐のいずれも実行されず、問題は発生しません。

この修正を含めて、改めてプログラム TC6 のソースを示します。

温度換算プログラム TC6
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°?"

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


Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd

Goto 0


(今回修正した部分を赤文字で示す)



メニュー選択で、番号を入力したら、直ちに入力画面が表示されるように変更ができました。

Getkey と、それを活用するための Do ループの使い方は、プログラミング経験が無いと分かりにくいかも知れません。新世代 Casio Basic の使いこなしの鍵が、GetkeyLocate にあると思っています。これを使いこなせたら、Casio Basic だけでなく 他のBasic をかなり使いこなせるようになります。

Getkey の使いこなしについては、Casio Basic 入門3Casio Basic 入門4で、詳細に解説していますので、是非ご覧ください。ここでは、Locate の使いこなしにも触れています。


TC5 2 

この画面が表示されているとき、温度入力画面を表示させずに、この画面で直接温度を入力できたら、プログラムとしての完成度が上がると思っています。プログラムでは、常にこの画面を表示したままにして、数値を入力して換算値を表示する...パソコンのプログラムでは当たり前のことです。

次回は、これをプログラム電卓で実現してみようと思います。




つづく...

Casio Basic入門44 / 目次




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






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

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


関連記事

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

e-Gadget アーカイブ

2015/03/08

e-Gadget では色々なプログラムを紹介してきています。特に昨年の12月以降、fx-9860GII のプログラムの掲載も始めています。

fx-5800P のCasio Basic プログラムを使うには、本体同士の通信を行う以外は、紙やファイルに記録したテキストベースのプログラムソースを見ながらプログラムを手で入力する方法しかありません。プログラムの配布は、テキストベースのファイルを利用するしかありません。

一方で、fx-9860GII は、テキストベースのソースをみてプログラム入力する以外に、Casio Basic プログラムならば G1M ファイル(拡張子が G1M のファイル)をPCから本体へ転送可能で、さらに Casio SDK で作った Add-in プログラムなら G1A ファイル(拡張子が G1Aのファイル)をPCから本体へ転送可能です。つまり、配布ファイルをPCから電卓に転送して使えます。

そこで、fx-9860GII プログラムの転送ファイルをダウウンロードできるように、e-Gadget アーカイブ を作りました。

 ⇒ e-Gadget アーカイブ


ついでに、fx-5800Pfx-9860GII のソースコードを PDF ファイルでダウンロードできようにもしました。さらに、役立つツールや説明、そして電卓に関係する面白ろそうな読み物なども掲載しようと考えています。


ダウンロードしてもらえるようにすること、そして私自身のファイル管理が目的なので、とても殺風景な Web Site ではあります。当ブログで紹介していないプログラムのソースや転送ファイルも掲載したりしています。いずれ、海外のプログラム電卓コミュニティーでも紹介することを考えて英語/日本語 併記にしています。英語と日本語を別ページにする可能性もありますが、先ずは私の利便性優先ってことで、見づらい点はご容赦ください。


Documents のページに、「電子式卓上計算機技術発展の系統化調査」という読み物へのリンクを貼っています。これをお読みになって面白いと感じられたら、電卓好き間違いなしです。


いつもトップに表示するポータルページにも、e-Gadget アーカイブ へのリンクを貼っています。



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


 




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

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


関連記事

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

fx-5800P カバーヒンジ破損の対策

2015/03/08

fx-5800P のカバーのヒンジが壊れやすいことを以前紹介しています。
 ⇒ fx-5800`:ヒンジ破損でカバーが取れた


新たに新品として購入した fx-5800P ですが、金属ピンが刺さっている樹脂部の2カ所でヒビが入っていることを見つけました。完全に破断する前の状態で、このまま放置していると明日にでも割れてしまいそうな状況だったので、割れる前に補修を行いました。

ヒビ(割れ)の中への浸透させ、樹脂同士の接着とスプリングピンと樹脂の接着の効果を狙って接着剤を探しました。接着剤が少しでも厚く盛られると、ヒンジ部材と干渉して回転できなくなるので、ひび割れの中に浸透し易く、かつ接着剤が盛り上がらないことが重要なので、年度の低い接着剤が良いだろうと考えました。

粘度が低いものを探したところ、シアノアクリレート系(瞬間接着剤)とUV硬化系が出てきました。UV硬化系は内部まで光が通る必要があるのものの、ひび割れの中までUV光を照射して硬化できないので、却下。

そこで、工業用瞬間接着剤(エチルシアノアクリレート)で、粘度が低い(40 mPa・s、サラダオイル程度のサラサラ)、柔らかめプラスチック用のグレードを試してみました。身の回りにある工業用から探しました。

但し、シアノアクリレート系(瞬間接着剤)は、耐衝撃性に劣るので根本的なヒンジの補修には向かないと思われます。完全に葉損する前に、それ以上破損が広がらないための予防的な処置として接着剤を使おうという作戦です。

接着剤の塗布には、まち針を使って、先端の細くなっている部分にできるだけ少量の接着剤をつけて、ヒビに内部に入り込むように塗布した後、ヒビの周囲を薄くコーティングするようにしました。

補修1ヶ月後の写真を掲載します。(補修前と補修直後の写真を撮り忘れました)

ヒンジの補修跡
Repair1
特にこの部分は、薄く塗らないと本体と干渉してしまいます。

ヒンジの補修跡
Repair2


補修から約一ヶ月経ちました。補修後、机の上に50cmくらいの落差から落下させてしまったのですが無事です。もし補修していなかったら、確実に上下2カ所で破損していたと思います。ヒビを見つけてスグに補修したのは正解でした。

定期的なヒビや割れのチェックを行えば、延命できるかも知れないと思います。


なお、もう1台の fx-5800Pで、ヒンジで完全に割れてしまったものにも同じ接着剤で修理を試みましたが、接着したつもりの部分が1ヶ月後には接合部が開きかけています。樹脂に金属ピンが押し込まれている構造で、樹脂にかなりの応力がかかっているのが原因のようです。根本的な補修には、接着力の大きなエポキシ系で低粘度のものでないとダメかも知れません。今度試してみようと思っています。

一般的な対策でなくて申し訳ありませんが、低粘度の高性能瞬間接着剤が使いやすくて、応急処置に使えると言うことがヒントになればと思い、紹介しました。


今回の経験から、樹脂にクラックが入って、それが成長して破断するプロセスを経験しました。Amazon や 楽天で fx-5800P の再生品が販売されていますが、ヒンジのクラックについて何も触れられていない限り、当たり外れがありそうで、手を出すのは不安に思います。



※ 関連記事
fx-5800P:ヒンジ破損でカバーが捕れた - 容易にヒンジ破損に至る原因の考察
fx-5800P の破損ヒンジの交換、ついてにリニューアル - 根本的な修理





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


 




keywords: fx-5800Pプログラム関数電卓


関連記事

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

Casio Basic入門42

Casio Basic(超)入門
<目次>

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

2015/02/27
2015/06/30 修正

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


Chapter 7  - 初級

前回: Casio Basic入門41


◆ Chapter 7 の目標: ゼロからのプログラム作成と機能追加

前回は、摂氏温度、華氏温度、絶対温度の間で換算するプログラムのバグを修正しました。

プログラム TC4
0→A
"1:°C"
"2:°F"
"3: K"
"INPUT MENU N°"?→M

Cls
If M=1:Then
"°C"?C
(9÷5)C+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
(9÷5)C+32→F
1→A
IfEnd:IfEnd
IfEnd

Cls
"1:"
"2:"
"3:"
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"



プログラムの構成は、
 1.メニュー画面表示と入力待ち
 2.メニュー番号に応じた換算
 3.換算結果の表示

となっています。



Chapter 7-5
プログラムの効率化

前回作成した TC4 の起動時の画面は、以下です。

TC4-2 

換算結果の表示は、以下です。

TC4-3 


今回のテーマは、起動時の画面を 換算結果と同様な構成に変更します(下図)。

TC4-4 

初期表示を変更するだけですので、簡単な修正だと思います。
今回作るプログラム名を TC5 とします。修正する部分を赤文字で示します。

プログラム TC5
0→A
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K" (スペース12個)
"INPUT MENU N°"?→M

If M=1:Then
"°C"?C
(9÷5)C+32→F
C+273.15→K
1→A

Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
(9÷5)C+32→F
1→A
IfEnd:IfEnd
IfEnd

Cls
"1:"
"2:"
"3:"

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"




これで終わりなのですが、よく見るとプログラムの最初と最後に表示処理があって、C、F、K の各変数の表示以外は全く同じですね...と言うか全く同じにしました。赤文字の部分と青文字の部分は全く同じ表示結果になります。

同じ処理なら、どちらか1つだけにして、繰り返し処理で同じ処理を繰り返せば良いですね。

また、今の状態ですと、COMPモード(普通の電卓の画面)で [FILE] キーからプログラムリストを表示させて、そこからプログラムを実行すると、プログラム終了時に [EXE] キーを押せば、同じプログラムが再起動するので、繰り返し使えます。しかし、PROGモードから起動した時は、繰り返しません。

そこで、表示を処理を1箇所にまとめて、さらに意図的にプログラムを繰り返すようにしてみます。どちらを省略して、処理を繰り返すようにすれば良いのか?


プログラムの最初の赤文字の部分を省略すると、プログラム起動時に表示されないので、マズイです。そこで、プログラム最後の青文字の部分を省略して、プログラム最後からプログラム最初へ強制的にジャンプさせることにします。

強制的に、つまり無条件にジャンプさせるには、Goto Lbl を使います。

Goto コマンドは、Goto [記号] と書き、ジャンプ先には Lbl [記号] を書いておきます。[記号] には、0 ~ 9 の1桁の数字と A ~ Z の1桁のアルファベットが使えます。Goto は同じ記号の Lbl に無条件ジャンプします。例えば、Goto 0 とすると、Lbl 0 までジャンプします。
 ⇒ Casio Basic コマンドリファレンス - Lbl / Goto

そこで、プログラム TC5 を以下のように変更してみます。

プログラム TC5
Lbl 0

0→A

Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"
 (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd

Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°"?→M

Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd

Goto 0


プログラム全体を Lbl 0Goto 0 で挟みました。この繰り返しをループと言います。そして、プログラム最後の表示部分を全てプログラムの最初の表示部分に統合しました。最初と最後の部分の共通な処理を青文字で示しています。そして最後の部分から持ってきた If ~ IfEnd の部分Cls を追加しています(赤文字で示しています)。

これを実行してみます。ちょっとマズイです。換算結果の数値が表示されません。原因は何でしょうか?

換算結果の数値を表示するのは、以下の部分;

If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd


Lbl 0 にジャンプしてきて、先ず最初に 0→A が実行されます。すると、上の If 文の中が実行されずに、丸ごとスキップしてしまいますね。これが原因です。

変数 A に持たせた働きは何だったでしょうか?正しく結果の数値を表示させるために、一度でも換算計算を行ったかどうかを示すフラグでしたね。プログラム起動直後は、計算結果を格納する変数 C、F、K にはどのような値が入っているかどうか、全く保証がありません。なので、プログラム起動時に フラグ A0 を入れておいたのですね。

思い出せない場合は、前回の Casio Basic入門41 をもう一度読んでください。

ところが、Lbl 0Goto 0 で作ったループが繰り返すたびに、フラグ A0 で初期化されてしまいます。上の If 文は、A1、 つまり 0 以外の時に、その中身が実行されます。だから、結果の値が表示されないわけです。

0→A は、本プログラムが起動した時だけ実行させれば良いので、0→A  を ループの前、つまり Lbl 0 の上へ移動させます。

 プログラム TC5 を以下のように変更します。

プログラム TC5
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°"?→M

Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd

Goto 0


これを実行してみてください。今度は正しく動作すると思います。



これで、プログラムコードが効率的に記述できました。無駄な処理を減らすと、プログラムの実行速度が向上するメリットがあります。

[2015/03/01 追記・修正]
これまでのプログラム作成では、以下の命令やコマンドを使いました。

1) →(代入)命令
2) " "(表示)命令
3) ?(入力)命令
4) Cls コマンド (表示消去コマンド)
5) If 文 (条件分岐)
6) Locate コマンド (表示コマンド)


このうち、1) から 3) は、古くからある Casio のプログラム関数電卓に搭載されていたCasio 独自の命令で、Basic とは無縁のものです。一方、4) から 6) は、Basic のコマンドで、パソコンなどで使う Basic と共通の一般的なコマンドです。

2006年に発売された fx-5800P 以降の機種では、Basic コマンドのみでプログラムを作ることができるようになっていて、旧来の命令を殆ど全てBasic コマンドで置き換えられます。この新しいカシオ機搭載の Basic を「新世代 Casio Basic」 と呼んでいます。

※ 一般の Basic では、変数A に10 を代入する時は、A=10 と表記します。Casio Basic では 10→A と表記します。実はこの部分のみが例外的に一般の Baisc と異なります。ただし、むしろこの表記の方が代入の意味が分かりやすいとも言えます。他のコマンドは一般のBasicとほぼ同じです。

Casio のカスタマーサポートの方から、新世代 Casio Basic にも旧来の命令を敢えて残している理由を伺いました。以前から Casio のプログラム関数電卓を愛用しているユーザーの利便性を考えた結果、旧来の命令を敢えて残しているとのことです。そして、ただ残すのではなくBasic コマンドとの整合性を取るための内部仕様の見直し・実装を行っているとのことです。

Chapter 7 では、敢えて旧来の命令を最大限活用し、Basic コマンドをあまり使わなくても、実用的なプログラムを作れることを紹介してきました。古い Casio のプログラム関数電卓でプログラムを作ったことの有る方でも、昔覚えた方法を使えば fx-5800P でプログラムが作れるわけです。

視点を変えれば、fx-5800P やそれ以降に登場したプログラム電卓には、新世代 Casio Basic が搭載されており、これを活かしたプログラミングをしなければ、大変もったいないと言えます。

-----

新世代 Casio Basic と古いBasic風言語

Casio のプログラム電卓に搭載された言語の変遷を調べてみると、Basic のコマンドが搭載されるようになった当初は、Basic として最低限必要なコマンドすら揃っておらず、Basic 風ではあるものの Casio 電卓特有なプログラミング言語と言わざるを得ないものでした。この時の経験や記憶を持っていらっしゃる方はまだ多くいらっしゃるようです。

カシオ機搭載の言語は着実に進化しています。

その後、徐々に Baisc コマンドが拡充され、2006年発売の CFX-9580CG PLUS に搭載されたプログラミング言語で、ようやく Basic として最低限必要なコマンド類が一通り揃いました。言い買えれば Basic のみでプログラムを作れるようになったのです。但し、この Basic は、本格的なプログラムを作るためには、ちょっと不便なものでした。

そして、同じ年に発売された fx-5800P には、構造化プログラミングが可能で本格的なプログラムを作れる新世代 Casio Basic が搭載されました。この新世代 Casio Basic でプログラミングを覚えれば、その殆どが パソコンなどでの一般的な Baisc プログラミングに活かせます(上記の代入命令が例外ですが...)。このような新世代 Casio Basic をあまりご存じ無い方も多くいらっしゃるようです。

-----

Casio Basic 入門では、当初から 新世代 Casio Basic の Basic としての言語仕様を活かした Basic プログラミングの入門を意識して連載してきています。Chapter 7 では、敢えて 旧来の命令の実力を調べ、実際のその能力を活かした実用プログラムを作ってみました。旧来の命令が、結構使えることが改めて分かりました。

Chapter 7 はこれで終わりです。次回からは、新たに Chapter 8 として、今回作った温度換算プログラムを出発点にして、Basic コマンドを活かしたプログラミングを紹介してゆく予定です。



つづく...

Casio Basic入門43 / 目次




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


 



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

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



関連記事

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

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

やす (Krtyski)

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


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

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR