Casio Basic: 行列計算

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
2015/01/31 更新

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
行列計算

◆概 要: プログラム内で行列に関する計算を行う。
※ fx-5800P の取扱説明書には、行列をプログラムで使える説明がありませんが、実際に使えます。但し、fx-5800P の内部仕様の変更があったときに、行列機能について影響が出る可能性が無いとは言えません。
※ fx-9860GII は公式に行列を使えます。


◆使える行列の最大サイズ:
fx-5800P: 行と列のそれぞれの最大が 10 と思われる。
fx-9860GII や fx-CG20/50: 行と列のそれぞれの最大は 999 となる。
但し、メモリ不足になると、これ以下でも Memory ERRORとなる。


◆行列変数: AZ、および Ans を使える


◆行列の生成:
行列変数をAとし、3X3の行列を生成する場合、
fx-5800P: [[0,0,0][0,0,0][0,0,0]]→Mat A
fx-9860GII や fx-CG20/50{3,3}→Dim Mat A

[2015/01/31 修正]
fx-5800P では、3x3の行列の領域確保の際に、各要素の初期値を指定する。
fx-9860GII や fx-CG20/50 では、3x3の行列の領域確保を行う際、各要素が0に初期化される。

※ Mat A を記述するには (fx-5800P); 
プログラム編集画面で、[FUNCTION] [8] で 8:MATRIX を選択後、[1]で 1:Mat を選択すると Mat を入力できる。その後[ALPHA] [ i ] でAを入力する。

fx-5800P で大きな行列を生成する際、fx-9960GII や fx-CG20/50 のような簡潔な方法が用意されていないようです。上記の方法で10 × 10 の行列を生成するのは結構な記述量です。このあたりは、正式に使えるとしていないので仕方ありません。もっとも、fx-5800P で大きな行列を使うのは、その処理速度を考えると現実的ではないので、致し方なしではあります。

◆行列の要素;
行列Aの X行 Y列の要素は、
Mat A[X,Y]


◆行列の任意の要素に値や変数を代入する方法:
行列Aの1行3列めの要素に、X を入力する場合、
X→Mat A[1,3]

※ 行列の要素指定 [行,列] は、横の並びが行、縦の並びが列となる。Locate X,Y,"HOGE" の X と Y の並びとは異なることに注意。

3X3行列;
1 2 3 ← 1行目
2 5 9
6 3 4

1列目


において、[1,3] の要素は、1行目&3列目なので 3 であり、6 ではない。


◆行列の任意の要素を読み出す方法:
行列Aの2行3列めの要素を読み出して、変数Xに代入する場合
Mat A[2,3]→X

3X3行列;
1 2 3 
2 5 9
6 3 4

において、[2,3] の要素は 9 なので、Xには が代入される。代入されるのは 3 ではない。


◆行列式を求める方法:
行列Aの行列式を変数Dに代入する場合、
fx-5800P: det(Mat A)→D
fx-9860GII や fx-CG20/50Det Mat A→D

det( を fx-5800P で記述するには;
プログラム編集画面で、[FUNCTION] [8]8:MATRIX を選択後、[2]2:det を選択する。


◆逆行列を求める方法:
行列式が0の時には逆行列を求められない。
※ 逆行列の計算では、分母に行列式がくるので、行列式が0の場合は、0で除算するエラーが発生する。

行列Aの行列式が0でない場合の逆行列を 行列Bに代入する場合、
先ず、3X3行列Bを生成する(要素は任意)。その上で、det(Mat A)が0でない場合の逆行列は Mat A-1 と記述できる。

[[0,0,0][0,0,0][0,0,0]]→Mat B
If det(Mat A)
Then Mat A-1→Mat B
IfEnd


或いは、

[[0,0,0][0,0,0][0,0,0]]→Mat B
det(Mat A)⇒Mat A-1→Mat B



◆転置行列を求める記述方法:
fx-5800P: Trn(Mat A)
fx-9860GII や fx-CG20/50Trn Mat A

※ fx-5800P で Trn を入力するには、プログラム編集画面で、[FUNCTION] [8]8:MATRIX を選択後、[3]3:Trn を選択する。


◆行列Aの各要素の絶対値をとる記述方法:
Abs(Mat A)


◆行列の加算
Mat A+Mat B


◆行列の乗算
Mat AxMat X


◆行列の表示
Mat A◢

※ 出力命令を用いると、fx-5800P や fx-9860GII 内蔵の行列閲覧画面に切り替わり、全ての要素を確認することができる。
ここで表示されるのは、Mat Ans であり要素を編集することはできません。そこで「行列編集画面」ではなく「行列閲覧画面」と呼ぶことにしています。

◆行列領域解放
ClrMat

※ 生成した行列は、メモリを使っていて、プログラムの最後でそのメモリ領域を解放しないと、メモリを無駄に使ったままになります。領域解放のために用います。ClrMat を入力するには、プログラム編集画面で、[FUNCTION] [6] (CLR) [3] (Mat) と入力します。



行列計算プログラム例 (fx-5800P)

[[0,0,0,0][0,0,0,0][0,0,0,0][0,0,0,0]]→Mat A
-7→N
For 1→Y To 4
For 1→X To 4
N-(3)→Mat A[Y,X]
Isz N
Next:Next

Mat A◢
det(Mat A)→D
D⇒Mat A-1
Trn(Mat A)◢

Cls
For 1→X To 4
For 1→Y To 4
Locate 4X-3,Y,Mat A[Y,X]
Next:Next

出力命令◢ により、行列閲覧画面が開いて、それぞれの行列要素を確認できる。
行列式は、5308416 となる。

このプログラムの最後で行列Aの要素をLocateコマンドを使って表示します。

表列Aの各要素は下記の通り;

-343-216-125-65
-27-8-10
192764
125216343512





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


 


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

リンク集 | ブログ内マップ
関連記事

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

FX-502P/602P/603P のプログラム

学生時代の荷物の片付けをしていたら、カシオのプログラム関数電卓FX-502PFX-602Pfx-603P で作ったプログラムライブラリが出てきました。A6程度のサイズの「京大カード」に、1プログラム1枚で、書き留めていました。

FX-603P は、2007年に fx-5800Pを購入するまで使っていました。

手帳サイズで、プログラムを作れる関数電卓 FX-502P は、おそらく個人が入手可能な世界最初の携帯プログラミングツールだったのではないかと思います。この製品により、世界中で多くのカシオファンが生まれたようです。

私が生まれて初めて作ったプログラムが、FX-502Pで作った「反射ゲーム」でした。
出てきたカードには、以下のように書かれていました。

反射ゲーム
P0,
LBL 3, INV RAN#, x, 9, =, INV INT, INV x=0, GOTO 3, Min0, 0,
LBL 1, INV PAUSE, INV DSZ, GOTO 1,
LBL 2, INV ISZ, MR0, GOTO 2 

操作表示Memory
1.[P0]0 (zero)M0: 回数制御
2.(ランダム数秒後)M1:結果表示 
3."-" 表示直後に[HLT]キー押す

[P0]キーを押すとプログラムが起動し、0(ゼロ)が何回かランダム回数点滅し、表示が - に切り替わったところで、[HLT]キーを押し、反応が速ければ小さい数が表示される、という単純なものです。

FX-502Pのプログラム記法はかなり忘れてしまったので、ここでは説明しませんが、CasioBasicに比べるとまるで暗号文ですね。


反射ゲーム以外にも、

ピタゴラス数: x2 + y2 = z2 となる (x, y, z) を次々と計算して表示するプログラム

1~N個の順列: S = NN + NN-1 + NN-2 + ・・・ + N2 + N を計算するプログラム

分子量計算: C,H、O、N、P、Si、Mg、Zn、Cl、Br、I、Ga、As、Al、In、などの個数を入力すると、分子量が表示され、メモリに格納するプログラム。メモリに格納された数を利用して、実験用の仕込み量をさらに計算する、といった使い方をしていました。。後年、半導体を触るようになって、Gaなどを追加しています。fx-603P専用。

などに加えて、主に技術計算用のものばかりです。


改めて、CasioBasicの良さ、そしてfx-5800P と言えども、十分なプログラム領域と広いディスプレイを実感します。



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


 



keywords: FX-502PFX-602Pfx-603Pfx-5800Pプログラミングプログラム関数電卓

リンク集 | ブログ内マップ
関連記事

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

カシオ電卓のイースタエッグ

カシオの電卓で、イースタエッグが見つかったと言うニュース


[1] [3] [7] [9] [AC] の5つのキーを同時押しすると、7セグメントで CASIO と表示されるらしい。

ニュースソースは、こちら

fx-5800P でキーの同時押しのネタを提供してきた私としては、大いに興味をそそられ...

結果は、

fx-5800P: ダメ
・fx-995ES: ダメ
・fx-993ES: ダメ

そもそも、7セグディスプレイでないので、無理なのかも知れません。

一般のカシオ電卓を持っていないので、確認できないのですが、今度販売店に行く機会があれば、試してみようと思います。



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


 



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

商品詳細を見る



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

リンク集 | ブログ内マップ
関連記事

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

Casio Basic入門8

Casio Basic入門
<目次>

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

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

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

前回: Casio Basic入門7


◆ Chapter 1 の目標: キーコードを調べるプログラムを作る

Chapter 1-10で作ったプログラム

プログラム名 CH1-10

"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
0→C

Locate 5,4,"   "
Do
Isz C

C≦99⇒Locate 5,4,C
C>99⇒Locate 5,4,"--"
LpWhile Getkey
Goto 0


Chapter 1 のメインテーマは、GetkeyLocateの使いこなしです。Getkey はCasio Basicの優れた特徴を支える重要コマンドの一つで、これによって動きのあるプログラムを作り易くなっています。

そこで、Chapter 1 の締めくくりとして、これまでに実際に使ってみた命令やコマンドを使って、ダイナミックに動くプログレスバーを追加して、視覚的に動きのあるプログラムに仕上げます。



Chapter 1-11
ダイナミックな表示機能の実装

Chapter 1 で仕上げるプログラムの動作:


今回追加するプログレスバーの仕様は以下のものです。

1) プログレスバーに > を使うことにします。

2) キーカウントが増えるに従って、>>>> が右へ伸びてゆきます。

3) >
の数はキーカウントと同じです。キーカウントが10の時は、> が10個まで伸びてゆきます。

4) fx-5800P のディスプレイは16桁が最大なので、プログレスバーの最大の長さは > が16個。

5) キーカウントが16を超える場合は、プログレスバーは最大長のままになります。

6) 新しいキーが押された時は、キーカウントが1になると同時に、プログレスバーは > 1個になります。


プログレスバーの実装

プログレスバーは、ディスプレイの2行目に、左から > が伸びてゆくように作ります。

ダイナミックな(動的な)プログレスバーの表示を行うためには、増えてゆくキーカウントCを表示位置に利用して、> の表示位置をCの値に応じて変更できるようにすれば良いのです。

Locate C,2,">"

と記述します。Locate の表示桁を指定するのに、変数Cを使うのがミソです。


この Locate C,2,">" は、キーカウントを反映させてプログレスバーをリアルタイムに表現するため、Doループの中に記述します。

ここまでに出来上がっているプログラムを見ると、このDoループに最初に入った時は、先ず Isz C によりCが1つ増えて、1となります。

そして、Locate C,2,">" が実行されると、Locate 1,2,">" と同じことになり、> が左端に1つ表示されます。


キーを押し続けた時は、このDoループが回るので、キーカウントCは、1つづつ増えてゆきます。すると、Locate C,2,">" のCも増えるので、> の表示桁の位置も順次増えてゆき、プログレスバーが右へ伸びてゆきます。

この部分のプログラムを詳細に見てゆきましょう。

Do
Isz C
C≦99⇒Locate 5,4,C
C>99⇒Locate 5,4,"--"
Locate C,2,">"

LpWhile Getkey


キーが押され続けると、このDoループが回るので、追加した Locate C,2,">" により、次々に

Locate 1,2,">"
Locate 2,2,">"
Locate 3,2,">"
Locate 4,2,">"
Locate 5,2,">"

 ・
 ・
 ・
Locate 14,2,">"
Locate 15,2,">"
Locate 16,2,">"


が実行されることになります。


ディスプレイの2行目だけに注目すると、

Locate C,2,">"  (C=1の時)
>               

Locate C,2,">"  (C=2の時)

>>              

Locate C,2,">"  (C=3の時)
>>>             

Locate C,2,">"  (C=4の時)
>>>>            

Locate C,2,">"  (C=5の時)

>>>>> 
          

 ・
 ・
 ・

Locate C,2,">"  (C=14の時)
>>>>>>>>>>>>>>  

Locate C,2,">"  (C=15の時)

>>>>>>>>>>>>>>> 

Locate C,2,">"  (C=16の時)
>>>>>>>>>>>>>>>>


というように、プログレスバーが1つづつ右へ伸びてゆきます。


Locate
コマンドは、引数に変数を使えるため、このようなことが可能になります。


※ CasioBasicコマンドリファレンス
      - Locateコマンド



さて、Locateコマンドは、表示する内容が16桁以上になるとエラーになります。そこで、このエラーを回避するには、Cが16を超えると Locate C,2,">" を実行させないことです。言い換えれば、Cが16以下の時だけ、Locate C,2,">" を実行させます。

そこで、条件ジャンプ命令 ⇒ を使って、

C≦16Locate C,2,">"

とすれば良いので、Doループを、以下のように修正します。

Do
Isz C
C≦99⇒Locate 5,4,C
C>99⇒Locate 5,4,"--"
C≦16⇒Locate C,2,">"

LpWhile Getkey



改めてプログラム全体を書きます。


"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
0→C

Locate 5,4,"   "
Do
Isz C

C≦99⇒Locate 5,4,C
C>99⇒Locate 5,4,"--"
C≦16⇒Locate C,2,">"
LpWhile Getkey
Goto 0



赤文字で示した1行を追加するだけで、プログレスバー機能の追加ができそうです。このように、たった1行だけで、ダイナミックな表示機能を追加できるのは、プログラミングの面白いところですね。

但し、残念ながらこのままだと、1つ問題があります。実際にプログラムを走らせてみると分かります。

一旦プログレスバーが伸びた後、別のキーを押しても、プログレスバーは伸びたままになってしまいます。新たなキーを押した時、プログレスバーを一旦消す必要がありますが、その動作をプログラムしていないのが原因ですね。そこで、何か新しいキーが押された時、つまりキーカウントを行うDoループの前で、プログレスバーを消去する動作を追加しましょう。


このプログラムには、Doループが2つあります。最初のDoループは、キーコードを取得するためのループです。

キーコードが取得されるまで、つまり何かキーが押されるまでは、最初のDoループが回り続けます。そして何かキーが押された時、このループを抜けて、動作が下へ進みます。

「プログラムは、何も指示が無ければ、上から下へ動作する」と言う基本を思い出してください。

2つめのDoループの Do の1つ上に Locate 5,4,"   " (スペース3個)がありますが、これはキーカウント表示にスペース3個を上書きして表示の初期化を行っています。

従って、プログレスバー表示の初期化も、ここで、つまり Locate 5,4,"   " の直後で行います。プログレスバーの初期化は、> を1つだけ表示し、残る15桁全てをスペースにして、上書きすれば良い、と分かると思います。

具体的には、

Locate 1,2,">               "  (スペース15個)

を記述します。

これで、プログラムは完成です。完成したプログラム名を GET KEYCODE とします。


プログラム名 GET KEYCODE

"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do
Getkey→K
LpWhile K=0

Locate 1,1,"KEYCODE =    "
Locate 11,1,K

0→C

Locate 5,4,"   "
Locate 1,2,">        "
Do
Isz C

C≦99⇒Locate 5,4,C
C>99⇒Locate 5,4,"--"
C≦16⇒Locate C,2,">"
LpWhile Getkey

Goto 0



改めて完成したプログラムは、たった20行のコンパクトなものです。1行1行に意味があるのですが、意外にシンプルですね。

プログラム全体をおさらいします。

1) プログラム全体の基本構造は、Lbl 0Goto 0 で作った大きなループです。

2) 最初に、プログラム名の表示、操作方法の表示、キーカウントの初期表示を行います。

3) キーコード取得は、1つめの Doループ で行います。何かキーが押されるまでこのループが回っています。

4) その後、キーコードの表示を行います。

5) 続いて、キーカウントの初期化、表示の初期化を行います。

6) 2つめのDoループで、キーカウントの表示とプログレスバーの表示を行います。キーが長押しされている間はこのループが回っています。

7) 以上の動作は Lbl 0 と Goto 0 のループにより、エンドレスに継続されます。

8) [AC]キーを押した時、プログラムは終了します。


プログラムを見て、この 1) ~ 8) を説明できれば、ほぼ完全に理解できたと言って良いと思います。



Chapter 1-12
プログラムのバックアップ

完成させたプログラムは、fx-5800Pのメモリの中にあります。

fx-5800P にはパソコンとのリンク機能が無いので、プログラムをパソコンに転送して保存することができません。fx-5800Pのプログラムをバックアップするには、オプションのリンクケーブルを使って、もう1台の fx-5800P へプログラムを転送してバックアップする方法のみが提供されています。

fx-5800Pで作ったプログラムのバックアップ方法に関するカシオの説明こちら


せっかく作ったプログラムは、操作ミスやfx-5800Pの故障により失われる可能性があるので、バックアップしておくべきです。しかしそのために、fx-5800Pやリンクケーブルを購入する気にもなれません。

注意!!
fx-5800P の初期化操作を行うと保存されているプログラムが全て消えてしまいます。
[MODE] [▼] [3] (SYSTEM) [3] (Reset All) とすると、初期化されるので要注意です!


PCへのバックアップができないのは、なんとかして欲しいものです。しかし無いものは無いので、別のバックアップ方法が必要です。要するに作ったプログラムを転記して保存するしかありません。

転記作業は、書き間違いがあり得ますが、そこは慎重に書き写すしかありません。そして転記する先は、紙媒体か電子媒体の2通りが考えられますが、私はエクセルファイルに転記して保存しています。

実は、私にとっては本ブログがもう一つの保存媒体になっています(^^;)

エクセルに保存する際、フォントに Consolas を指定しています。このフォントを使うのは、数字のゼロとアルファベットのオーの区別が明確なためです。数字のゼロは、斜め線が入るので、オーとはっきり異なります(以下参照)。
fx-5800P の液晶表示でも、数字のゼロに斜め線が入ったフォントを使っています。

エクセルなど電子媒体で保存するもう一つの利点として、スペースの数の確認が容易なこともあります。


GetKeycodeSource 


他に良い方法があれば教えて頂ければ有り難いのですが、今のところ私はこの方法を採用しています。

[2015/01/07 追記]
プログラムを数多く作ったので、1台の fx-5800P に入りきらなくなったので、もう一台入手して一方はバックアップ用、もう一方は日常使いとしています。



Chapter 1
おわりに

GetkeyLocate があること、そして条件判定で 値が0なら"偽"、0以外なら"真"となることが Casio Basic の最大の優位点だと思っています。そこでChapter 1 では、これらのコマンドの使いこなしを通じて、fx-5800P のプログラミングを紹介しました。

プログラミング初心者の方には、いきなりループ処理が出てきて面食らったかも知れませんが、Chapter 1 を完璧に理解すれば、プログラミングの基本をかなり習得したことになります。言い換えれば、ループ処理に馴染むことがプログラミング習得の大きなステップになります。

今回作った Get Keycode プログラムは、実際にプログラムを作る際に、キーコードが分からなくなって、取扱説明書が手元に無くても、プログラムを走らせれば調べることが出来るので、私には必携プログラムです。

キーコード取得プログラムは、プログラムライブラリ - キーコード取得 にもまとめています。今回 fx-5800P 用に作ったプログラムは、実は fx-9860GII や fx-CG20 でもそのまま正常動作する互換性100%のプログラムです。但し画面がより広い fx-9860GII 向けに表示の配置を最適化したプログラムも 上記のプログラムライブラリで紹介しています。fx-9860GII や fx-CG20 はダウンロードしたプログラムファイルをそのまま電卓に転送する機能があるので、プログラムファイルをダウンロードできるようにしています。






「CasioBasic入門」は、Chapter 2 へ進みます。そこでは簡単なアクションゲームを作ってゆこうと思います。

以前作ったもぐら叩きゲーム(詳細はこちら)は、初心者の方にはチョット敷居が高いと思いますので、もう少し単純なゲームを作ってゆこうかと考えています。



つづく...

⇒ CasioBasic入門9 / 目次




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


 



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

リンク集 | ブログ内マップ
関連記事

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

Casio Basic入門7

Casio Basic入門
<目次>


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

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

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

前回: Casio Basic入門6


◆ Chapter 1 の目標: キーコードを調べるプログラムを作る

Chapter 1-8 で作ったプログラム

プログラム名 CH1-8
"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
1→C

Locate 5,4,"   "
Locate 5,4,C
While Getkey
Isz C

Locate 5,4,C
WhileEnd

Goto 0

前回の最後の問い「WhileループをDoループに変更して、正常に動作させるには、どうするか?」への答えは、分かりましたか?

WhileループとDoループの違いを理解すれば分かります。Whileループは[ループ継続条件]が「真」でない場合は、ループに入らないことがあります。従って、このループに入る時には、キーカウントCは1にしておく必要がありました。

もしこれをDoループに置き換えると、

Do
Isz C
Locate 5,4,C
LpWhile Getkey


のDoループに入ると、Locate 5,4,C で表示される時、キーカウントCは Isz C によって1つ増えて2になっているので、キーカウントが2と表示されます。正しくは1なのに2になってしまいます。DOループは、ループに至ると必ず1回は実行され、Whileループとの動作の違いが原因です。

そこで、Doループに入る前のキーカウントCは0にしておく必要があります。

"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
0→C
Locate 5,4,"   "
Locate 5,4,C
Do
Isz C

Locate 5,4,C
LpWhile Getkey

Goto 0

これをみて、もう一つ気付くことがあります。

実は、2つめのDo (赤文字)の上の Locate 5,4,C は不要なのです。

Whileループの時は、長押しされていない時は、このループが実行されません。この時、キーは1回押されていますのでキーカウントが1になっています。つまりWhileループに入らない時でもキーカウントが1であることを表示しなければならないので、
この Locate 5,4,C は必要でした。

一方、Doループは、必ずループの中に入ります。従ってDoループ内にある Locate 5,4,C が必ず実行されます。キーが長押しされない時でも Doループ内の Locate 5,4,C は実行されます。従って、Do の上にある Locate 5,4,C は不要なわけです。


プログラムは1行でも無駄が無いほうが簡潔で良いと、私は考えます。従って今回の目的では、WhileループよりもDoループを使う方が良い、との結論になります。「Casio Basic入門」なので、敢えて回りくどいことをしてしまいました。慣れてくるとこの判断はスグにできるようになるでしょう。


そこで、プログラム CH1-8 をDoループに置き換えます。

プログラム名 CH1-8-2
"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
0→C

Locate 5,4,"   "
Do
Isz C

Locate 5,4,C
LpWhile Getkey

Goto 0


※ CasioBasicコマンドリファレンス
     - Whileループ: While~WhileEnd
     - Doループ: Do~LpWhile


DoループとWhileループについては、これでよく分かったと思います。あとは自分で色々と実際にプログラムを作れば、頭に定着すると思います。



Chapter 1-9
Locateコマンドで陥るバグ

Chapter 1 は、GetkeyコマンドとLocateコマンドを使いこなすことを目標としています。そこで Locate コマンドを使っていて陥るバグについて、もう一度見てみます。

プログラム CH1-8-2 を実行してみると、問題点が1つ見つかります。



この動画で、
1) 最初は色々なキーをチャッチャチャと押しています。押されたキーのキーコードが表示され、キーカウントは1です。

2) 次に、少し長押しをしてみています。キーカウントが増えているのが分かります。

3) 最後に長押しを続けています。するとキーカウントが増加してゆき100を超えていますね。

さて、長押しを続けると、画面の一番下の4行目の表示がおかしくなることに、気付いたでしょうか?

<AC>:QUIT

の表示の左端の "<" が消えてしまいます。

このままキーカウントが増えてゆくと、キーカウントの桁数が増えてゆき、そのうち一番下の行の表示が、キーカウントの数で浸食されてゆくわけです。

但し、よく見てみると、キーカウントの数字は3桁までは問題無い筈です。それでも "<" が消えてしまっています。このバグは、実は既に1回出てきていて、対処をしていますが、分かりますか?

これは、fx-5800P のCasioBasic特有の陥りやすいバグです(fx-5800Pのバグではなくて、作ったプログラムにバグがあります)。

少し見づらいのですが、動画を見てみると、ディスプレイの一番上に小さく ENG と表示されていて、ENGモードがOnになっています。これがバグの原因です。.

CasioBasic入門3Chapter 1-2 参照のこと。


詳しくは、以前の記事をご覧頂くとして、要するにENGモードがOn になっていると、3桁の数字を表示する際に右端にスペースが自動的に付加されます。

キーカウントが106の時の表示は、ENGモードOnでは、以下のようになります。
  GET KEYCODE   
 














     HIT ANY KEY
CNT:106
AC>:QUIT
CNT:106 の右にスペースが自動的に付加されるため、そのスペースが "<" を上書きしてしまっています。

これが、今回のバグの正体です。

そこで、ENGモードをOffにすれば良いので、プログラムの一番最初で EngOff を実行すれば良いことが分かります。確かにこれは正しい対処ではあります。しかし、私はこの対処方法が最善の方法だとは思わないのです。

fx-5800P は関数電卓としても使用するものです。関数電卓として使う際、ENGモードを使用内容に応じて設定して使います。少なくとも私は、状況に応じて ENGモードを切り替えて使っています。従って、何かプログラムを実行した時に、ENGモードを勝手に変更されたくないのです。

Casio Basicでは、プログラム内で、ENGモードを On や Off にするコマンドが用意されており、プログラムの都合に合わせて EngOffEngOn を実行できます。現在の ENGモードが、On になっているのか、Off になっているのかが分かれば、プログラムの最初で ENGモードの状態を取得した上で、プログラムに都合の良いENGモードを設定し、プログラム終了時に ENGモードを最初の状態に戻すことができます。

ところが、fx-5800P のCasio Basicでは、現在の ENGモードが、On になっているのか Off になっているのかを知る方法が用意されていません。つまり、プログラム内で ENGモードを変更すると、プログラム実行前のENGモードに戻すことが出来ないのです。これは、Casio Basicの仕様が不十分だと言うこともできますが、いずれにせよ、プログラム内でENGモードを変更すべきでない、と考えています。

と言うのも、プログラムの作成者が、自分のプログラムの都合でユーザーのハードウェアの設定を了解無しに変更するのは、作法の悪いプログラムだと思うからです。従って、今回の ENGモードに起因するバグの解消は、ENGモードが OnOff かに無関係に解決する方法を採用します。

その方法として、具体的には以下の2つの方法が考えられます。

1) キーカウント表示後に、"<" を上書きする
つまり、
Locate 5,4,C
の直後に
Locate 8,4,"<"
を実行する。


2) キーカウントの表示を2桁に制限する
キーカウントを2桁に制限すれば、3桁目に自動的にスペースが入っても、表示 <AC>:QUIT に影響はありません。今回のキーカウント取得目的は、キーの長押しを検出することを試すことでした。そして長押しを検出には、キーカウントが99までで十分だと思います。そもそも、ENGモードの影響だけでなく、キーカウントが4桁になってしまえば、最終的に表示<AC>:QUIT に影響が出るので、キーカウントの桁数を2桁に制限する方が、1)の対処よりも本質的な対処方法だと、私は思います。


そこで、今回は 2) の方法を採用することにします。



キーカウント表示の桁数制限

Cが2桁以下の時には、

Locate 5,4,C

を実行させ、

Cが3桁以上になると CNT:-- と表示されるように

Locate 5,4,"--"

が実行されるように変更してみます。ここで、表示 CNT:--  として (- を2つ表示させて)、「3桁以上の表示がされないのは、プログラムの仕様であってバグではない」と、ささやかな主張をしておきます。

このように、キーカウントCの値に応じて表示処理を変更するためには、条件分岐を行う If 文が役に立ちます。

If 文の書式は、

If [条件]
Then [処理1]
Else
[処理2]
IfEnd

となりますが、If、Then、Else、IfEnd をそのまま日本語にしてみると、その動作は一目瞭然です。

もし [条件]
その場合は [処理1]
その他では [処理2]
If 終わり


If [条件]
[条件]「真」の時は、Then 以降を実行
[条件]「真で無い」時は、Else以降を実行
IfEnd で条件分岐処理は終わり

という動作を行います。ここで「真」「真でない」(=「偽」)が、再び登場します。この考え方はプログラミングで重要なので、CasioBasic入門6 で説明をしました。曖昧な場合は、もう一度参照してください。


※ CasioBasicコマンドリファレンス
      - If 文: If~Then(~Else)~IfEnd 



さて、

キーカウントが99以下(つまり2桁以下)の時は、
Locate 5,4,C を実行し
その他では、
Locate 5,4,"--" を実行する

を Casio Basicで表現すると、

If C≦99
Then Locate 5,4,C
Else Locate 5,4,"--"

IfEnd

となります。

キーカウント表示のバグに対処したプログラムを CH1-9 とします。


プログラム名 CH1-9
"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
0→C

Locate 5,4,"   "
Do
Isz C

If C≦99
Then Locate 5,4,C
Else Locate 5,4,"--"
IfEnd

LpWhile Getkey
Goto 0

このプログラムを実行してみて、狙い通りにキーカウントが表示されることを確認しましょう。



Chaper 1-10
利用価値の高い⇒命令(条件ジャンプ)を使ってみる

Chapter 1 の目標であるキーコード表示プログラムは完成しましたが、Casio Basicで用意されている 非常に利用価値の高い ⇒命令(条件ジャンプ) について紹介しておきます。

⇒命令(条件ジャンプ)はCasio Basic独自の機能なので、私は「命令」と呼ぶことにしています。一方、他の Basic でも使われているコマンドを Basic コマンドと呼ぶことにしています。

さて、⇒命令は、If 文の代わりに使えることが多いのです。全てのIf文を⇒命令で置き換えることはできませんが、置き換えが可能な場合は、If 文に比べて ⇒命令は実行速度が速く、プログラムの表現も簡潔で見やすいので、利用価値の高いものです。

⇒命令(条件ジャンプ)の書式は、

[条件][処理]

と、改行なしに1行で書きます。
1行で書かないとエラーになります。さらに、⇒の前後にスペースを入れてもエラーになります。


[条件]「真」の場合は[処理]を実行し、「偽」(「真」でない)の場合は[処理]を飛ばして次の処理を実行します。


※ これまで、「真」「偽」が出てきていますが、「真」「偽」は必ずどちらかになり、どちらでも無いと言う状態はありません。「真」でなければ「偽」であり、「偽」でなければ「真」です。ちなみに、VisualBasicなどでは、「真」"TRUE" と言い、「偽」 "FALSE" と言います。


さて、プログラム CH1-9 で追加した、キーカウント表示の桁数制限の部分の If 文を、⇒命令に置き換えてみます。

C≦99⇒Locate 5,4,C
C>99⇒Locate 5,4,"--"

⇒命令には、If文のElseに相当する機能はありません。If ~ Then ~ IfEnd の置き換えしかできません。

つまり、上の⇒命令を使ったプログラムを正しく If 文に翻訳すると、

If C≦99
Then Locate 5,4,C
IfEnd
If C>99
Then Locate 5,4,"--"

IfEnd

となります。

⇒命令(条件ジャンプ)は、1行で書く必要がありますが、非常に簡潔に書けます。

従って私は、⇒命令に置き換え可能な If 文は⇒命令を使うようにしており、⇒命令の使用を勧めたいと思います。


※ CasioBasicコマンドリファレンス
      - ⇒命令(条件ジャンプ)


そこで、プログラム CH1-9 のキーカウント表示の部分を ⇒命令で置き換えたプログラム CH-1-10 を作ります。


プログラム名 CH1-10
"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
0→C

Locate 5,4,"   "
Do
Isz C

C≦99⇒Locate 5,4,C
C>99⇒Locate 5,4,"--"

LpWhile Getkey
Goto 0


プログラム CH1-10 を実行してみましょう。キーカウントが3桁以上になると、CNT:-- と表示されることを確認してください。




これまで、以下のCasioBasic の命令やコマンドを実際に使い、その使い方やバグが潜む危険性、使いこなしについてみてきました。

- Getkey
- Locate
- Eng On/Off
- Doループ
- Whileループ
- " "命令(出力)
- Isz命令
- If 文
- ⇒命令


Chapter 1 では、GetkeyLocate の使いこなしをメインテーマにしています。特に Getkey はリアルタイム入力監視が出来る点で、優れたコマンドです。つまり、GetkeyLocate を使いこなすことで、動きのあるプログラムを作ることが出来ます。

Getkeyを使いこなすには、キー入力を待つために DoループやWhileループが必須であることも、既にお分かりだと思います。そこでDoループやWhileループの使いこなしについても、実際にプログラムを作りながら体験してもらいました。

動きのあるプログラムを作るためには、処理速度が重要になることもあります。CasioBasic特有の Isz命令 や ⇒命令 は処理速度の面で有利で、表記も簡潔なため、お勧めの命令です。

Locateコマンドを使う上で、CasioBasic特有の EngOn / EngOff が思わぬバグに繋がることも経験してもらいました。



そこで、Chapter 1 の締めくくりとして、動きのあるプログラムに仕上げてみようと思います。これまで取り上げた命令やコマンドの範囲内で、以下の動画にあるようなプログラムに改造します。

キーを長押ししている時、キーカウントが増えることをプログレスバーで視覚的に示す機能を追加してみましょう。




プログレスバーは、> を利用します。キーカウントが増えるに従って、>>>> が右へ伸びてゆきます。> の数はキーカウントと同じです。キーカウントが10の時は、> が10個まで伸びてゆきます。

fx-5800P のディスプレイは16桁が最大なので、プログレスバーの最大の長さは > が16個です。キーカウントが16を超える場合は、プログレスバーは最大長のままになります。

新しいキーが押された時は、キーカウントが0になると同時に、プログレスバーは > が1つだけの表示に変わります。

以上の動作を行うように、プログラムを改造してみましょう。



つづく...

CasioBasic入門8 / 目次




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


 



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

リンク集 | ブログ内マップ
関連記事

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

Casio Basic入門6

Casio Basic入門
<目次>

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

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

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

前回: Casio Basic入門5


◆ Chapter 1 の目標: キーコードを調べるプログラムを作る

Chapter 1-7 で作ったプログラム

プログラム名 CH1-7
"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "
Locate 1,1,K
Goto 0



このプログラムを走らせて色々なキーを押してみたところ、特定のキーを同時に押すとキーコードが1桁になることを発見しました。しかし、取扱説明書には、1桁のキーコードについては説明がありません。

と言うことは、秘密のキー入力ができるわけです。ここで、こうして書いてしまっては秘密も何もあったモンじゃありませんが、まあ取扱説明書にない動作を使えば、秘密のキー入力です。

実は、以前作ったゲーム Hit&Blow でも、秘密のキー入力(複数キーを同時に押す)により、1桁キーコードが取得された時、ゲーム開始前に答えが分かるように作りました。これは、プログラムのデバッグ用に設定したのですが、面白いので完成版にも残しました。詳しくは、こちら


ところで、最近の携帯機器や家電の操作系は、少ないボタンに複数の機能を持たせるために、複数のキーの同時押しや、長押しによって別の機能を割り当てるものが結構多いように思います。

関数電卓のプログラムにも同じことが言えると思います。プログラム CH1-7 で複数キーの同時押しを認識できることが分かったので、今度は長押しを認識できればプログラムの操作系の幅が広がるはずです。さらに、ゲームを作る時に使えるかも知れません。


そこで、Chapter 1 の締めくくりとして、キーの長押しを認識させる機能を追加しようと思います。



Chapter 1-8
DoループとWhileループ再び

キーを長押しした時、押されている時間をキーカウントとして表示する機能を追加します。

プログラムの動作としては、普通にキーを押すとキーカウントの表示は 1 となり、キーを押し続けるとキーカウントの表示がリアルタイムでどんどん増えるようにします。

今回の改造ポイントは、以下の赤文字で示した部分です。プログラム名を CH1-8 とします。今回はプログラムの説明は後にします。先ずこのプログラムを入力して、動作を確認してみてください。


プログラム名 CH1-8
"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
1→C
Locate 5,4,"   "
Locate 5,4,C
While Getkey
Isz C

Locate 5,4,C
WhileEnd
Goto 0


プログラム起動時は、キーカウントは0(ゼロ)ですから、表示もゼロとします。それが上から4行目の

Locate 1,4,"CNT:0  "


で、今回追加する新機能に関する初期表示です。なおCNT は COUNT (カウント)の略です。

Locateコマンドの表示位置は、1桁目、4行目になっています。つまり画面の左下です。この位置に CNT: に続いてキーカウントの数値を表示させる作戦です。


今回は、追加機能に Whileループを使います。Whileループについては、Doループとの違いを既に説明しています。繰り返し処理の最初で繰返条件の判断を行うのでしたね。

さらに、Isz命令も使います。これは、Casio Basic独特のコマンドなので命令と呼ぶことにしています。

Isz C

は、変数Cを1つ増やすします。つまり、

C+1→C

と同じことを行います。変数を1や2など決まった分だけ増やすことを、インクリメントと呼びます。

Whileループの中で、Isz C を行っています。これは、ループが回った回数をカウントしていることになります。そうです、変数Cはキーカウントを代入する変数です。

残りの複数のLocateコマンドは、キーカウントを適切に表示させるためのものです。

以上をヒントにして、もう一度プログラムを読み解いてみてください。

※ CasioBasicコマンドリファレンス
     - Isz命令
     - Dsz命令




キーカウント取得の動作

プログラム CH1-8 をもう一度見てみます。

プログラム名 CH1-8
"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Locate 1,4,"CNT:0  "
Lbl 0
Do

Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =    "

Locate 11,1,K
1→C
Locate 5,4,"   "
Locate 5,4,C
While Getkey
Isz C

Locate 5,4,C
WhileEnd
Goto 0

キーカウント取得以外の既に作った部分を簡単な説明に置き換えると、着目すべきところが明確になります。

[ 初期表示 ]
Locate 1,4,"CNT:0"
Lbl 0
[ キーコード取得と表示 ]
1→C
Locate 5,4,"    "
Locate 5,4,C
While Getkey
Isz C
Locate 5,4,C
WileEnd
Goto 0

プログラム全体は、Lbl 0Goto 0 で作られるループが基本構造です。

このループに入って、Lbl 0 の次に、先ず [キーコード取得と表示] が実行されます。これは今まで作った部分です。

ここまでくると、キーは押されたことになりますので、キーカウント変数Cは、1 にならなければなりません。そこで、1→C により、キーカウント変数Cを1に初期化します。

続いて出てくるLocate コマンド2つは、以下の仕事をします。
・キーカウントを表示する位置の3桁分を一旦消去、つまりスペース3個を上書きする
・キーカウントを表示する、つまりここではキーカウント 1 を表示する。


これは、Locateを使った典型的な表示方法で、既にお分かりのことです。ここでも同じ方法を使えば良いのです。


プログラムは、上から下へ止まらずに進みます。そして、Whileループに入ります。

While Getkey
Isz  C
Locate 5,4,C
WhileEnd


Whileループは、ループ継続条件による判定を、ループに入ろうとする時点で行う点が、Doループと異なることは、以前一度触れました。ここれは、Getkeyの結果が0でない時にループを継続すると言う条件になっています。つまり何かキーが押された時はループを継続するわけです。

Whileループに入ろうとする時にキーが押されていない時は、Getkey は0を返しますので、Whileループには入らず、一気にWhileEndまでジャンプします。そしてその下に Goto 0 があるので、そのまま Lbl 0 へジャンプします。これは、キーが1回だけ押された時の動作ですね。そして、キーコード取得と表示を再度行います。


Whileループに入ろうとする時にキーが押されている時は、Getkey は 0 以外のキーコードを返します。つまり、キーが長押しされていると、Whileループの中に入ってゆきます。

Whileループに入れば、最初に Isz C が実行され、キーカウント変数Cを1つ増やす動作をします。続いて Locate 5,4,C によりキーカウントを表示します。ここではキーカウントは1つ増えて2になっているので、

CNT:2

と表示されます。

表示をしたら、WhileEnd に到達するので、そこから While Getkey までジャンプし、2回目の繰り返しの判定を行います。

もし、まだキーが押されたままだと、Whileループに再び入ります。キーが押されていなければ、Whileループに入らず WhileEndまでジャンプし、続いて Goto 0 を実行して、Lbl 0 までジャンプします。

もうお分かりのように、キーが長押しされた状態が続けば、Whileループがまわり続けます。そして Isz C によりキーカウントが1つづつ増えてゆき、それが即座に表示されます。そして、キーが離された時は、[キーコード取得と表示] の処理の中の Doループが回り続け、キー入力待ちの状態になります。


さて、While Getkey ですが、While Getkey≠0 と同じことになります。

While [ループ継続条件] 
WhileEnd
 

と言う書式では、[ループ継続条件] が「真」の時ループを継続し、「偽」(真でない)時 WhileEnd にジャンプしてループを終了します。これが、Whileループのループ判定条件の本質的な意味です。

Doループの説明で、[ループ継続条件] が 「正しい」 か 「正しくない」 かで判定すると書きましたが、「真」「偽(真でない)」かで判定するのが、本質的な意味になります。


この本質的な意味は重要なので、少し解説します。

While Getkey≠0
 の は、関係演算子で、右と左が等しくないとき、「真」となります。Getkey≠0「真」ならループを継続するわけです。

一方、While Getkey と書いた時は、Getkey の戻り値が「真」「偽」かを判定した結果、それが「真」ならループを継続すると言う意味になります。

Casio Basicでは、コマンドの戻り値や変数が、0でなければ「真」で、0の時は「偽」であると、決められています。この規則は、Visual Basicなどの他の多くのBasic言語やC言語系言語(C、C++、C#)などの多くのプログラミング言語でも採用されている、基本的なものです。

ですから、While Getkey と言う書き方は、While Getkey≠0 の省略形などではありません。どちらの書き方でも、[ループ継続条件] 「真」であるかどうかで判定するのです。



条件が「真」「偽」か?は、Doループの LpWhile [ループ判定条件] でも適用されますし、今後出てくる If [判定条件] にも適用されます。これは、多くのプログラミング言語で適用される重要な考え方なので、覚えておくと良いでしょう。



話を元に戻します。キーカウント取得のための Whileループですが、代わりに Doループを使うとどうなるでしょうか?

Doループは必ず1回ループがまわります。すると上のままだと、キーが長押しされていないのにキーカウントが1つ増えてしまい、おかしなことになります。


次回は、WhileループをDoループに置き換える場合のプログラムを紹介します。


※ CasioBasicコマンドリファレンス
     - Doループ
     - Whileループ




つづく...

⇒ CasioBasic入門7 / 目次




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


 



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

リンク集 | ブログ内マップ
関連記事

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

Casio Basic: Dsz命令

Casio Basic
コマンドリファレンス

Casio fx-5800P と fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
2015/01/09 更新


fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
Dsz (ディクリメント・ジャンプ命令)


◆概 要: 変数をディクリメントし、その結果が0になると、2つめのコマンド/命令にジャンプする。

◆書 式: Dsz [変数]


Dsz命令は、CasioBasic 独特のコマンド。

[変数] が0にならない保証があれば、単純にディクリメントに利用できる。



Dsz命令の使用例

100→C
Lbl 0
Dsz C
Goto 0


このプログラムは、ループを100回繰り返した後、Cが0になるので、Goto 0 をジャンプして、次の処理へ移ります。


Dsz A の変数Aが0にならない保証があれば、A-1→A と同じ処理になる。

1000→A
Lbl 0
If A≠0:Then
Dsz A
Goto 0
IfEnd


これの実行時間は、約16秒 (fx-5800P使用)。

1000→A
Lbl 0
A-1→A
If A≠0:Then
Goto 0
IfEnd


これの実行時間は、約24秒 (fx-5800P使用)。

A-1→A よりも Dsz A のデクリメント処理の方33%速いので(fx-5800P使用)、Dsz命令の利用価値が高いと言えます。



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


 



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

リンク集 | ブログ内マップ
関連記事

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

Casio Basic: Isz命令

Casio Basic
コマンドリファレンス

Casio fx-5800P と fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。

2015/01/09 更新

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
Isz (インクリメント・ジャンプ命令)

◆概 要: 変数をインクリメントし、その結果が0になると、2つめのコマンド/命令にジャンプする。

◆書 式: Isz [変数]


Isz命令は、CasioBasic 独特のコマンド。

[変数] が0にならない保証があれば、単純にインクリメントに利用できる。



Isz命令の使用例

-100→C
Lbl 0
Isz C
Goto 0


このプログラムは、ループを100回繰り返した後、Cが0になるので、Goto 0 をジャンプして、次の処理へ移ります。


Isz A の変数Aが0にならない保証があれば、A+1→A と同じ処理になる。

-1000→A
Lbl 0
If A≠0:Then
Isz A
Goto 0
IfEnd


この1000回ループの実行時間は、約16秒 (fx-5800P使用)。

-1000→A
Lbl 0
A+1→A
If A≠0:Then
Goto 0
IfEnd


この1000回ループの実行時間は、約24秒 (fx-5800P使用)。


Isz A A+1→A よりも8秒速く、A+1→AIsz命令よりも33%余計に時間がかかることが分かります(fx-5800P使用)。このように、Isz命令の利用価値は高いと言えます。




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


 


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

リンク集 | ブログ内マップ
関連記事

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

fx-5800P SE 新製品発売か(´д`)

定期的に、Casioプログラム電卓の新製品リリースが無いのか、チェックしています。

fx-5800P CPU の2ワードで検索を掛けたら、SH-3 と言うのが引っかかって、おおっ、と思って以下のリンクへ...

https://community.casiocalc.org/topic/3256-comparison-between-fx-5800p-and-fx-9860sd-programming-function/



最近定期的にチェックしている Universal Casio Forum のエントリーではありませんか!

PCリンク、1MB RAM、SH-3 CPU...の fx-5800P SE


う~む残念!架空のモデルでした。カシオさん、これ発売して、と言うカシオフリークの夢でした(´д`)


SH-3 は無くても良いので、せめてPC-Link 付きの後継機を早く出してください。

お願いします>カシオ様


せっかく、高機能な構造化BASICであるCasioBasicを搭載しているのですから、PC-Link 機能さえあれば、ネットでプログラムが普及して、ハードウェアの商売にも繋がると思うのです。


是非、ご一考を...



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


 


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

リンク集 | ブログ内マップ
H
関連記事

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

Casio Basic入門5

Casio Basic入門
<目次>

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

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

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

前回: Casio Basic入門4


◆ Chapter 1 の目標: キーコードを調べるプログラムを作る

Chapter 1-3 で作ったプログラム

プログラム名 CH1-3
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 2,1,"  "
        (" " の中はスペース1つ: 2014/11/19 追記)
Locate 1,1,K
Goto 0



プログラム CH1-3 で、押したキーのキーコードを表示する中心部分が完成しました。今回は、誰でも使いやすいレベルまでプログラムの品質を向上させるために、適切な表示を追加して、以下の画面のようなプログラムに仕上げます。


プログラム起動時の表示:

1-GetKeycode 


プログラム起動直後に、プログラム名

GET KEYCODE

を1行目に表示し、

3行目に、プログラムの使い方の説明を表示します:

HIT ANY KEY

(何かキーを叩いてください)


このプログラムは、[AC]キー以外のすべてのキーのキーコードを表示します。[AC]キーにはプログラムの強制終了の機能があるので、このキーを使ってプログラムを終了させます。

そこで、プログラムの終了方法の説明を4行目に表示することにします。

<AC>:QUIT

QUIT は終了と言う意味です。


さらに、得られたキーコードは、次の画面の1行目のように表示させます。

キーを押した時の表示:

2-GetKeycode 





Chapter 1-4
Locateコマンドと出力命令" "の違い


先ずは、キーコードを表示する部分を、例えば [EXE]キーを押した時に、

KEYCODE = 47

といった表示を行うために、今回は " " (出力命令)を用います。

Locateコマンドで表示する方法は既に紹介しています。CasioBasicでは、この他にも、出力したい文字列を " " で括る(くくる)方法があります。

"KEYCODE ="

とプログラムを書くだけで良いので、簡単です。

そして、この1行の下に、

Locate 1,11,K

とすれば、表示が

KEYCODE = 47

となるはずです。この表示で 474  は、1行目 - 11桁目にくるので、Locateコマンドの第1引数は 1、第2引数は 11 になります。

では、プログラムを変更しましょう。プログラム名を CH1-4とし、変更部分を赤文字で示します。


プログラム名 CH1-4
Lbl 0
Do
Getkey→K
LpWhile K=0
"KEYCODE ="
Locate 11,1,K

Goto 0


プログラム編集画面で、Locate 11,1,"KEYCODE =" の = 記号を入力できますか?

CasioBasicでは、コマンド、命令、その他何でも選択可能な記号を文字列に使うことが出来ます。

= 記号は比較演算子として用意されているので、プログラム編集画面で、[FUNCTION] キーを押し、出てくるメニューで 「3:PROG」を選び([3] キーを押し)、[▼]キーを1回押すと、メニューに 「1:=」 が現れますね。これをそのまま使えば良いのです。

"  " で括られる中に = を入れると、それは文字として使えるわけです。


さて、このプログラムを実行すると、画面表示は以下のようになります。

KEYCODE = 22
KEYCODE =
KEYCODE =
KEYCODE =


ちょっと妙なことになってしまいました。

1行目は期待した通りの表示ですが、2行目以降に予期せぬ表示がズラズラと出てきてしまいます。

これは、出力命令 " " の仕様なのです。



プログラムの説明

CasioBasicでは、「カーソル行」というものが内部で管理されています。カーソル行は、プログラム開始時は1となっており、 " " 命令が実行されるたびに、自動的にカーソル行が1つづつ増えてゆきます

従って、1回目の "KEYCODE =" は1行目、2回目は2行目・・・4回目は4行目、それ以降は画面がスクロールされて4行目に表示され続けます。見方を変えると、出力コマンド "  " には、改行機能が付加されているとも言えます。



表示位置がカーソル行で管理される命令(コマンド)には、出力命令 " " 以外にも、入力命令 ? があります。つまり、" " (出力命令)や ? (入力命令)を使う時は、カーソル行がどこにあるのかを、きちんと意識して使う必要があります。


実際には、カーソル行を意識しないで使えるのは、実際はプログラム開始時くらいのものです。プログラムが入り組んでくると、カーソル行を把握するのが困難になります。

もし、プログラムの最初で

""

と書くと、何も表示をせずにカーソル行が1行下がるので、改行コマンドとして使えます。

これを応用すると、意図的にカーソル行を2行目にするには、プログラム開始時に

""
""


と、2回改行すれば良いわけですね。


従って、好みの位置に表示を行うには、Locateコマンドを使うのが賢明です。Locateコマンドと " " 命令の違いを理解しておけば、適切に使い分けができます。


ところで、入力コマンド ? の使用時も、カーソル行が自動的に変化して、改行されてから入力内容が表示されますので、画面設計の邪魔になります。入力させる時に、カーソル行の心配をせずに入力させてそれを変数に代入するには、入力命令 ? ではなくて、Getkeyコマンドを使った方が良いことがわかります。

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



※ コマンドと命令

これまで、LocateコマンドとかGetkeyコマンドと言いながら、"  "命令や ?命令と書いています。コマンドと命令は、いずれも同じ意味で、英語か日本語かの違いです。取扱説明書では、これらが混在して使われていますが、明確な使い分けがされていないように思われます。CasioBasic特有のコマンドを「命令」と言っている部分もあり、そうでない部分もあります。┃
そこで、私はCasio Basic特有のものを命令と呼び、他のBasicでも共通して使われるものをコマンドと呼ぶことにしています。

例えば、、?、、"  "、⇒、Dsz、Isz は、一般のBasicには無い、Casio Basic特有のコマンドなので、これらを「命令」と呼び、それ以外は「コマンド」と呼ぶことにします。




chapter 1-5
思い込みの罠


KEYCODE = 34

といった結果表示を必ず1行目に表示するには、積極的にLocateコマンドを使うべきだ、ということがハッキリと理解できたと思います。

では、プログラムを変更します。プログラム名を CH1-5 とし、変更する部分を赤文字で示します。

プログラム名 CH1-5
Lbl 0
Do
Getkey→K
LpEhile K=0
Locate 1,1,"KEYCODE ="
Locate 11,1,K
Goto 0



fxー5800P の取扱説明書には、キーコードは2桁の整数だと書かれていています。ところが、実際は、キーコードが1桁になるケースがあります。詳細はあとで紹介します。

そこで、

KEYCODE = 25

と表示されている時に、1桁のキーコード、例えば 2 が表示される場合を想定します。この時、変数Kは 2 になるので、

Locate 1,1,"KEYCODE ="
Locate 11,1,K


が実行されると、どうなるでしょうか?


Locate 11,1,K は、1行目の11桁目に、2 を表示させます。しかし12桁目には何も表示されないので、表示結果は、

KEYCODE = 25

となってしまいます。

本来、

KEYCODE = 2

となるべきなのですが、そうはなりません。そして、キーコードが 25 であるかのように表示されてしまうのです。これは、明らかなバグですね。

なぜそうなるのか、わかりますか?

ディスプレイに表示された状態は、以下のようになっています。

KEYCODE = 25    
                
 
 

この状態で、Kが2になっていて、Locate 11,1,K を実行すると、1行目、11桁目に 2 が表示されます。 1行目12桁目に表示されている 5 はそのままです。キーコードが常に2桁の場合は、1行目12桁目の 5 も上書きされるので問題は発生しません

この問題を解決するには、Locate 11,1,K を実行する前に、11桁目と12桁目を消去しておけば良いですね。消去する代わりにスペースを上書きしても良いわけです。

fx-5800P には、画面消去コマンドとして、Cls が用意されていますが、これは画面全体、つまり4行16桁を全て消去しますので、今回のように、特定の位置だけを消去するのには使えません。そして、測定の位置だけを消去するコマンドはありません。

実は、そのようなコマンドは特に必要ありません。Locateコマンドを使って、特定の位置にスペースを表示させれば良いのです。


そこで、1行目、11桁目と12桁目にスペースを上書きするために、

Locate 11,1,"KEYCODE ="

と書くところを、

Locate 11,1,"KEYCODE =  "

とします。"=" の後ろに、スペースを3つ追加しています。


KEYCODE =___    
                
 
 

ここでは、便宜上スペースを _ で表現していますが、実際は空白です。

こうしておいてから、K が 2 になっていて、Locate 11,1,K を実行すると、

KEYCODE = 2     
                
 
 

と正しく表示されます。


表示する桁数に対する思い込みがバグの原因となっていたわけです。では、プログラムを修正して、プログラム名を CH1-5-2 とします。赤文字が修正部分です。

プログラム名 CH1-5-2
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =  "   ( = の後ろにスペース3つ: 2014/11/19 追記)

Locate 11,1,K
Goto 0




Chapter 1-6
プログラム完成

プログラム名の表示、操作方法と終了方法の説明を追加します。

プログラム名 CH1-6
"  GET KEYCODE "         
(Gの前にスペース2つ)
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"

Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =  "   (=の後ろにスペース3つ)
Locate 11,1,K
Goto 0


今回は、プログラムの最初に赤文字で示した3行を追加しました。これは特に説明は不要だと思いますが、2点補足しておきます。

先ずは、Locate 8,4,"<AC>:QUIT" で表示する <AC>:QUIT ですが、ここでは、記号 <>: が出てきます。
これらは、アルファベットには有りません。

Casio Basicでは、コマンド、命令、その他何でも選択可能な記号を文字列に使うことが出来ます。

例えば、<> は比較演算子 です。プログラム編集画面が表示されている時に、[FUNCTION] キーを押し、出てくるメニューで 「3:PROG」を選び([3] キーを押し)、[▼]キーを1回押すと、メニューに 「3:>」 や 「4:<」 が現れるので、それを文字として使用できます。

では、: 記号はどうやって入力するか?
この記号は、[SHIFT] [√■] で入力できます。


本来この記号は、複数行にわたるプログラムを1行に続けて記述する時に使います。

例えば、

Do
Getkey→K

LpWhile K=0

と書くところを、: 記号を使って、

Do:Getkey→K:LpWhile K=0

と書けます。

私は、画面上でプログラムを見やすくするために、 : 記号を使うことがありますが、むしろ表示のために多用しています。



2つめの、補足ポイントです。

1行目は、文字列が "  " で括(くく)られているだけですが、これだけで出力ができる Casio Basic 特有のとても手軽な命令です。これを実行すると、ディスプレイ上では次のようになります。

  GET KEYCODE   
                
 


続いて、2行目と3行目が実行され、

  GET KEYCODE   
                
 HITANYKEY
 <AC>:QUIT
このように表示されます。

そして、プログラム起動時に押した [EXE] キーの影響で、K には [EXE] キーのキーコード 47 が入っているので、Do ループが継続せずに、

Locate 1,1,"KEYCODE =  "
(= の後ろにスペース3個)

が実行されるので、1行目、1桁目から左へ "KEYCODE =   " が上書きされるはずです。

  GET KEYCODE   
(1行目のみ表示)

が、

KEYCODE =   E   

となってしまうはずです。

最後の E もスペースで上書きしておく必要があるわけですね。

従って、Locate 1,1,"KEYCODE =   " は、= の後ろにスペースを4個にしておけば、問題は解決です。

Locate コマンドで上書きする場合には、どこまでスペース上書きで消去するのかを、気をつけておくことが、バグを作らないポイントになります。たかが表示ですが重要なので、取り上げました。



さて、実際にプログラムを実行してみて、何か気付きませんか?

いままでは、プログラムを起動したら、プログラム起動に必要な [EXE] キーのキーコード 47 が表示されていました。ところが、今回新たに表示を追加したら、プログラム起動時には、キーコードが表示されません。つまり、画面の1行目には、GET KEYCODE と表示されており、KEYCODE = 47 と表示されませんね。

今回のプログラム改造により、起動時の [EXE] キーのキーコードが取得されなくなった、と言うことを意味しています。
しかしその後は、押したキーに対応するキーコードが表示されます。

試しに、起動時に [EXE] キーを少し長押ししてみてください。すると、一旦 GET KEYCODE が表示されますが、すぐに KEYCODE = 47 と表示が切り替わりますね。

このことから、Getkeyコマンドは、キーが押されてから一定時間内ならキーコードを取得するが、その時間を超えるとキーコードを取得しないことが分かります。

※ CasioBasicコマンドリファレンス
     - Getkeyコマンド

を参照してください。



Chapter 1-7
思い込みの罠(補足)


それでは、プログラム名 を CH1-7 とし、ここまでのプログラムをまとめておきます。

プログラム名 CH1-7
"  GET KEYCODE"
Locate 6,3,"HIT ANY KEY"
Locate 8,4,"<AC>:QUIT"
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 1,1,"KEYCODE =   "     (=の後ろにスペース4つ)
Locate 11,1,K
Goto 0



ここまでで、Chapter 1 の目標のプログラムが完成しました。

実際に実行してみます。

1-GetKeycode 

1行目の右端に、黒い■ が表示されていますね。

これは、プログラムが一旦停止せずに走っていることを示しています。

何かキーが押されるまで、

Do
Getkey→K
LpWhile K=0


のループが回り続けているので、リアルタイムに入力待ちをしていることになります。

ここで、[4] キーを押すと、キーコードが21であると表示されます。[7]を押すと、キーコードが31であると表示されます。


チョット面白い実験をしてみます。

[4][7] を同時に押してみて下さい。キーコードが 1 になりますね。縦の同じ並びのキーを2つだけでなく複数を同時に押すと、1桁のキーコードが得られます。

但し、電卓の右下にある [(-)] [EXE] [+] [-] [÷] の5つのキーは例外で、これらのうち何個でも同時に押すと、キーコード 7 が得られます。

いずれにせよ、キー1つを押して得られるキーコードの1の位の数が同じキーは、それらを何個でも良いので同時に押すと、1の位の数と同じ1桁のキーコードが得られるのです。

取扱説明書には説明はありませんが、ここで作ったキーコード取得プログラムを実際に走らせて、色々触っている時に発見しました。

自分で作ったプログラムで、電卓の内部動作を垣間見えると言うのは、チョット愉しいですね。

1桁のキーコードについては、詳しくは以前の記事をご覧ください。→ こちら



次回は、ここまで作ったプログラムに、ちょっと動きを取り入れたギミックを追加しようと思います。



つづく...

⇒ CasioBasic入門6 / 目次




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


 



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

リンク集 | ブログ内マップ
関連記事

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

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

やす (Krtyski)

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


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

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

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR