Casio Basic入門37
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
修正:2015/01/25
修正:2015/01/25
4. CasioBasicを使ってみる(続き)
Chapter 6
前回: Casio Basic入門36 を見る
◆ Chapter 6 の目標: プログラムを速くする
入力ボックスの改良と拡張
入力ボックス2.0 にバージョンアップして、ようやくfx-5800P Casio Basic でストレスなく使えるようになりました。この汎用サブルーチンは、より画面の広い fx-9860GII ではさらに役立つので、今回は入力ボックス を fx-9850GII に移植します。
今回 fx-9860GII に移植したプログラムは、以下のモデルでも動作します。
- fx-9860GIII
- fx-9750GIII
- fx-CG10 / fx-CG20
- fx-CG50
Chapter6-7
fx-5800P から fx-9860GII へ移植する
高速動作する fx-9860GII では、キーリピート対策が必要です。そこで、この対策を行った fx-5800P 用 IN Ver 2.1 のプログラム(以下)を元に移植を進めます。
[2015/01/25 修正] INPI Ver 2.0 のコードを掲載していたのを正しく IN Ver 2.0 に修正しました。
プログラム構造
[初期表示と変数の初期化]
[キー入力]
[後処理]
このプログラムをそのまま fx-9860GII で動作させても、以下の理由からエラーになります。
1. fx-9860GII には配列変数がない
2. fx-9860GII では、Getkey が返すキーコードが異なる
さらに、fx-9860GII の広い画面を活かすために、Locate の引数を最適なものに変更した方が良いでしょう。
fx-9860GII Casio Basic での配列
fx-5800P の配列変数 Z[ ] は fx-9860GII の Casio Basic には準備されていません。配列変数の代わりとして使えそうなのは、行列とリストです。
以前、fx-9860GII (ノーマルクロック 29MHz) で行列とリストのアクセス速度を測定しています。結果の表を再掲載します。
⇒ fx-9860GII への移植 - ピタゴラス数
表 行列とリストのアクセス速度
処理内容 | 処理時間 (ミリ秒) |
リスト読み出し | 13.2 |
リスト書き込み | 17.6 |
行列読み出し | 10.7 |
行列書く込み | 12.0 |
明かに行列の方がアクセス速度が速いので、配列変数の代わりに行列を採用します。
さて配列変数は、1行K列の行列と同じなので、87個の配列変数Z[K] を1行87列の行列 Z[1,K] に置き換えます。ここで、K は1~87の整数です。
この行列 Z の領域確保は、{1,87}→Dim Mat Z
そして、配列変数 Z[K] の代わりに、行列 Mat Z[1,K] で各要素にアクセスします。
例えば、数 1 を、1行72列目の要素に代入する場合は、
1→Mat Z[1,72]
とします。
異なるキーコードの対応
同じキーを押しても Getkey が返すキーコードは、fx-9860GII と fx-5800P で異なります。キーコードを知るには、取扱説明書を見るか、キーコード取得プログラムを実行してください。
取扱説明書 | キーコード取得プログラム | |
fx-5800P | 99 ページ | プログラムライブラリ - キーコード取得 |
fx-9860GII | 8-17 ページ |
入力ボックス IN Ver 2.1 で使うキーコードをまとめます。
キー | fx-5800P | fx-9860GII |
1 (テンキー) | 35 | 72 |
2 (テンキー) | 36 | 63 |
3 (テンキー) | 37 | 52 |
4 (テンキー) | 21 | 73 |
5 (テンキー) | 22 | 63 |
6 (テンキー) | 23 | 53 |
7 (テンキー) | 31 | 74 |
8 (テンキー) | 32 | 64 |
9 (テンキー) | 33 | 54 |
・ (小数点) | 26 | 61 |
DEL | 34 | 44 |
(-) (負号) | 57 | 41 |
- (減算記号) | 67 | 32 |
その他 [AC] 以外のキー※ | ・・・ | ・・・ |
キーコード最大値 | 87 | 79 |
これに基づき、行列の領域確保と初期化は、以下のようになります。
なお、fx-9860GII ではキーコードの最大値が 79 になっていることに留意します。行列の領域確保はその分メモリを消費するので、必要最小限にすべきです。
{1,79}→Dim Mat Z
1→Mat Z[1,72]
2→Mat Z[1,62]
3→Mar Z[1,52]
4→Mat Z[1,73]
5→Mat Z[1,63]
6→Mat Z[1,53]
7→Mat Z[1,74]
8→Mat Z[1,64]
9→Mat Z[1,54]
初期表示と変数の初期化
fx-9860GII 用に書き直すために、キーコードの扱いを変更し、配列変数を行列に切り替えましたが、最後に Locate コマンドを使った画面表示を変更します。入力ボックス・インジーケータは、画面の右下の端に表示するのが良いので、それに併せて表示位置を変更します。なお、fx-9860GII では小文字アルファベットや特殊記号 ▶ などが文字として使えるので、それを利用します。
If E=2:Then
Locate 11,7,"<EXE>:Enter"
Else If E=1:Then
Locate 20,7,"▶E"
IfEnd:IfEnd
E→Mat Z[1,1]
For 1→I To D
Locate X+I-1,Y,">"
Next
0→C:0→F:1→E
キー入力ループ
キーコードが異なる以外は、fx-5800P のプログラムと全く同じになります。fx-5800P と異なる部分を青文字で示します。同じ Casio Basic なので移植性は高いようです。
但し、fx-9860GII は、fx-5800P に比べると処理速度が格段に速く、キーリピートが頻発して使いにくいので、以下の赤文字の部分でキーリピートを抑制しています。
⇒ キーリピート抑制 - 逆引き Casio Basic
Do
While Getkey
WhileEnd
Do
Getkey→K
LpWhile K=0
Mat Z[1,K]→I
If (I≧1 And I≦9) Or K=71
Then
If C<D:Then
If F:Then
Z+EI÷10^(F)→Z
Isz F
Else
10Z+EI→Z
IfEnd
Locate X+C,Y,I
Isz C
IfEnd
Else If K=61
Then
If F=0:Then
Locate X+C,Y,"."
Isz C:Isz F
IfEnd
Else If K=44
Then
If C:Then
If F:Then
F-1→F
F⇒Int(10^(F-1)Z)÷10^(F-1)→Z
Else
Int(Z÷10)→Z
IfEnd
C-1→C
C=0⇒1→E
Locate X+C,Y,">"
IfEnd
Else If K=32 Or K=41
Then
If C=0:Then
Locate X,Y,"-"
-1→E:Isz C
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
LpWhile K≠31
行列利用の後処理
fx-5800P と殆ど変わりません。fx-5800P では 配列変数の領域解放を行っているので、配列変数の代わりに使った行列も領域解放を忘れずに行います。これをやらないと、メモリが占有されたままになって、使えるメモリが減ってしまいますので要注意です。行列の領域解放には ClrMat コマンドを使います。変更部分を青文字で示します。
For 1→I To D-C
Locate X+C+I-1,Y," "
Next
Mat Z[1,1]→E
If E=2:Then
Locate 11,7," "
Else If E=1:Then
Locate 20,7," "
IfEnd:IfEnd
ClrMat
Return
これで、IN の移植が終わりました。ここで行った変更は、INP や INPI にもそのまま適用できます。
なお、移植したプログラムのプログラム名は、fx-5800P 向けと同様に、それぞれ INPI、INP 、IN としておきます。
プログラム
fx-9860GII (及び fx-CG20) は、プログラムを入力せずに、ファイルをダウンロードして電卓に転送するだけでプログラムを利用できます。プログラムファイルのダウンロードはプログラムライブラリからできます。
⇒ 入力ボックス 2.1G - fx-9860GII & fx-G20専用
IN Ver 2.1G for fx-9860GII
INP Ver 2.1G for fx-9850GII
INPI Ver 2.1G for fx-9860GII
処理能力の高い fx-9860GII では、入力速度の問題は全くありません。
さて、処理速度の遅い fx-5800P でも実用的な応答性で動作する入力ボックス2.0 /2.1 が出来たので、次々回 Chapter 8 で入力ボックス2.0 /2.1 (好みの方を使って下さい)を使って、初級者向けの簡単なプログラムを作ってみます。
次回 Chapter 7 では、Casio Basic(超)入門編 として、Casio プログラム電卓で作れる、最も簡単なプログラムの作り方を紹介します。この最も簡単に作れるプログラムを出発点として、Casio Basic を駆使した高品質なプログラムへの改造方法を Chapter 8 で行います。
つづく...
⇒ Casio Basic入門38 / 目次
応援クリックをお願いします。励みになるので...
keywords: fx-5800P、CasioBasic、入力ボックス, プログラミング入門、プログラム関数電卓
リンク集 | ブログ内マップ
- 関連記事
-
- Casio Basic入門39 2015/02/06
- Casio Basic入門32 2015/01/25
- Casio Basic入門37 2015/01/23
- Casio Basic入門36 2015/01/15
- Casio Basic入門35 2015/01/09