Casio Basic入門17

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
2014/12/23: 入力桁数の制限に関して追記
最終: 2015/01/17


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


Chapter 3

◆ Chapter 3 の目標: 自由自在な入力をする

前回: Casio Basic入門16


「入力ボックス」プログラムの動作確認のためのメインプルーチン CH3M を作りました。

プログラム名 CH3M

Locate 1,1,"0:"

While 1

-1→M
Do
Getkey→K
K=25⇒0→M
LpWhile K=0

If M=0:Then
3→X:1→Y
Prog "CH3-0S"
        (ゼロ・エス)
Z→A

IfEnd

If M=0: Then
Locate 3,2,"              "
    (スペース14個)
Locate 3,2,A

IfEnd

WhileEnd


================

プログラム構造

[初期化処理]初期設定と初期表示

While 1

    [メニュー番号取得]今はメニュー番号0が1つだけ

    [入力処理]入力プログラム"CH3-0S"の呼出しと入力値の取得

    [出力処理]換算計算と表示

WhileEnd

================


「入力ボックス」プログラムの基本機能を作り、プログラム名 CH3-0S (ゼロ・エス)としました。

プログラム名 CH3-0S (ゼロ・エス)

0→Z
37→DimZ
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]

Lbl 0


Do
Getkey→K
LpWhile K=0

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
10Z+Z[K]→Z
Locate X,Y,Z
IfEnd

K≠47⇒Goto 0

0→DimZ
Return



「入力ボックス」プログラムの構造

[初期化処理]

[キーコードからキーの数への変換]

Lbl 0

        [キーコード取得]

        [戻り値 Z の算出と表示]

K≠47⇒Goto 0

[後処理]

Return




Chapter CH3-1
「入力ボックス」プログラムの改良

メインルーチンの画面構成を崩さずに入力させるために、入力範囲を指定したい。そこで、メインルーチンで入力桁数を指定すると、それに従って入力範囲を制限する機能を追加します。

入力開始位置の X と Y を指定したのと同様に、入力桁数 D をパラメータとして指定することにします。桁=Digit (デジット)なので、変数 D です。

メインルーチンから呼び出す時には、以下のようにします。

3→X:2→Y:9→D
Prog #CH3-1S"
Z→A



入力範囲の表示

入力範囲を >>>>> と表示して、桁数が分かるようにしようと思います。

For [開始]→I To [終了]
Locate [X座標], [Y座標], ">"
Next


このようにFor文を使うことにします。X, Y, D、そして制御変数(インデックス) I をうまく使って、これを完成させます。

">" の表示を始めるのは、入力開始位置なので、For文で最初に実行するのは、

Locate X,Y,">"


です。

For文での2回目は、1つ右に ">" を表示するので、

Locate X+1,Y,">"
 

です。続いて...

Locate X+2,Y,">"
Locate X+3,Y,">"
  ・
  ・
Locate X+D,Y,">"


となれば良いので、

For 1→I To D
Locate X+I-1,Y,">"
Next


とすれば良いことが分かります。このコードを、[初期化処理] に追加します。

このコードを追加することで、

>>>>>>>>>>

と入力範囲が表示され、そこへ入力してゆくと...

12345>>>>>

">" に数字が上書きされて、入力値が表示されます。


入力モードの表示

入力範囲の表示があれば、入力モードであることが分かります。しかし入力範囲一杯に入力されていると、">" が無くなるので、入力モードかどうか分からなくなります。そこで、画面右下に入力モードであることを別途表示させることにします。

入力確定すれば入力モードが終了するので、確定をうながす「インジケータ」を表示します。

・パターン2: インジケータ大を表示
・パターン1: インジケータ小を表示
・それ以外: インジケータを表示しない


このように、3種類から選べるようにしておきます。

<パターン2>
Birthday_2 

<パターン1>
PressureConv_2 

インジケータ設定のために、変数E を新たなパラメータとして使用することにし、Eが2でパターン2、Eが1でパターン1、Eが0のときはこれら以外でパターン0とします。

インジケータは初期画面で表示するので、[初期化処理] に以下のコードを追加します。

If E=2:Then
Locate 6,4,"<EXE>:ENTER"
Else If E=1
Then
Locate 15,4,"►t"
    ( [FUNCTION] [7] [3] [4] )
Locate 16,4,"E"
IfEnd;IfEnd


インジケータは、入力モードが終われば消えるべきなので、[後処理] に以下のコードを追加して、この表示を消去します。

If E=2:Then
Locate 6,4,"           "
    (スペース11個)
Else If E=1
Then
Locate 15,4,"  "
    (スペース2個)
IfEnd:IfEnd



入力桁数の制限

今のままだと、入力範囲が表示されるだけで、実際に入力する場合は何桁でも入力できてしまうので、パラメータDで指定した桁数を超えて入力できないように、制限をかける必要があります。

そこで、実際にキー入力する際に桁数をカウントし、それが最大入力桁数パラメータ D を超えないようにします。

プログラムの構造をもう一度みてみると、キー入力を1回行うたびに Lbl / Goto ループを1回通るので、[戻り値 Z の算出と表示] ブロックを一回通るたびに、桁数カウント C をインクリメント(1つ増やす)し、C が D 以下になるか D 未満になるようにすれば、桁数を管理できます。C が D 以下にするか、D 未満にするかの細かいことは、実際のコードで正しい方を選択しますが、今は考え方のみを決めます。

桁数カウンタCの初期値を0とし(初期化処理に 0→C を追加しておく)、このブロックに Isz C を追加します。

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
10Z+Z[K]→Z
Locate X,Y,Z
Isz C
IfEnd


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


その上で、桁数カウンタC が入力桁数D 以下の時だけ、このブロック内の処理を実行するようにします。

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
If C<D:Then
10Z+Z[K]→Z
Locate X,Y,Z
Isz C
IfEnd:IfEnd


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


入力桁数D=10と設定されているとします。

桁数カウンタC は0で初期化されます。初めてこのブロックに入ってきた時は C=0 です。
1文字入力されると、Isz C でCが1つ増えて、C=1 となります。9回通れば(通り終われば)、Cは9になります。
次にこのブロックへ入る時は、C<D が真(成立)なので、このブロック内の処理を行い、C=10 になります。

さらに次の入力を行うと、C<D が偽(成立しない)ため、ブロック内の処理は行われません。つまり、C が D 未満になるように制限をかければ良いことが確認できました。これで桁数制限機能が追加されました。


以上をまとめて、プログラム CH3-1S とします。

プログラム名 CH3-1S

0→Z
37→DimZ
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]
If E=2:Then
Locate 6,4,"<EXE>:ENTER"
Else If E=1
Then
Locate 15,4,"►t"
    ([FUNCTION] [7] [3] [4])
Locate 16,4,"E"
IfEnd;IfEnd

For 1→I To D
Locate X+I-1,Y,">"
Next


0→C    (桁数カウンタの初期化)
Lbl 0


Do
Getkey→K
LpWhile K=0

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
If C<D:Then
10Z+Z[K]→Z
Locate X,Y,Z
Isz C
IfEnd:
IfEnd

K≠47⇒Goto 0

If E=2:Then
Locate 6,4,"           "
 
  (スペース11個)
Else If E=1
Then
Locate 15,4,"  "
    (スペース2個)
IfEnd:IfEnd

0→DimZ
Return


================

変更部分を赤文字で示しました。


「入力ボックス」プログラム CH3-1S を呼び出すメインルーチンも以下のように変更します。変更部分を赤文字で示します。
(ここでは、CH3-1S 実行時の入力桁数D を10にしています)


プログラム名 CH3M

Locate 1,1,"0:"

While 1

-1→M
Do
Getkey→K
K=25⇒0→M
LpWhile K=0

If M=0:Then
3→X:1→Y
:10→D:2→E
    (パラメータ D と E を追加)
Prog "CH3-1S"
Z→A

IfEnd

If M=0: Then
Locate 3,2,"              "
    (スペース14個)
Locate 3,2,A

IfEnd

WhileEnd



CH3M を実行してみてください。

メニュー番号0を選ぶために、[0] キーを押すと、プログラムCH3-1S が呼び出されて入力モードに入ります。
入力後、[EXE]キーを押すと入力が確定され、入力値が改めて表示されます。


次に、メインルーチン CH3M を変更して、入力桁数を12桁に変更してみます。

3→X:1→Y:12→D:2→E
Prog "CH3-1S"
Z→A


CH3M を実行し、入力モードで、以下を入力してみてください。

12345678901

11桁目の "1" を入力したところで、指数表示に変化してしまいました。

1.23456789×1010

fx-5800P は内部桁数15桁ですが、表示桁数は10桁なので、10桁を超えると指数表示になる仕様です。
[2014/12/23 修正]
fx-5800P の指数表示には、Norm 1Norm 2 の2つの設定があります。
1) Norm 1
  できるだけ指数表示にしたいときに設定する

2) Norm 2
  できるだけ指数表示したくないときに設定する。
  この場合は、小数点を含めて表示桁数が10桁までは、小数 / 整数表示となる

 ⇒ Casio Basic コマンドリファレンス: Norm

fx-5800P は工場出荷状態では Norm 2 となっています。もし上の実験通りにならず、3桁入力すると指数表示になってしまう場合は、Norm 1 に設定されていることになるので、Norm 2 を設定する必要があります。

桁数カウンタ C を使って桁数管理を行っているので、表示形式が指数に変化すると桁数管理が厄介になります。従って、「入力ボックス」プログラムの入力範囲は10桁以下にする、と言う仕様にします。さらに、入力ボックス のプログラム冒頭の初期設定部分で、Norm 2 を指定することにします。プログラムにより電卓の表示形式を勝手に変更することはしたくありませんが、しかたありません。

と言うのも、Casio Basic では Norm の状態を取得するコマンドが無いからです。もしあれば、プログラムの最初で現在の Norm の状態を取得し、それを記録しておけば、プログラム終了時に Norm 設定を記録に従って戻せます。それができないので、強制的に Norm 2 と設定するしかありません。

ここで、メインルーチン CH3MCH3-1S を呼び出す部分の入力桁数Dの指定を 10→D に戻しておいてください


表示形式への対応

万一、仕様外の使われ方をされた場合への対応として、D>10 のとき Dを 10 に強制設定するための桁数制限をプログラムで行います。

[初期化処理]

D>10⇒D=10

を追加します。

さらに、ENG記号(μ、m、K、M など)を使った表示になると、この場合も桁数管理が厄介です。
123456789 を表示するとき、ENGモードが ON になっていると、123.456789M と表示されてしまいます。

従ってENGモードも強制的に OFF にするしかなく、プログラム冒頭の [初期化処理]EngOff コマンドを実行せざるを得ません。


表示形式へ対応した「入力ボックス」プログラム CH3-1S は以下のようになります。ここで変更した部分を赤文字で示します。

プログラム名 CH3-1S

EngOff:Norm 2
0→Z:D>10⇒10→D
37→DimZ
1→Z[35]:2→Z[36]
3→Z[37]:4→Z[21]
5→Z[22]:6→Z[23]
7→Z[31]:8→Z[32]
9→Z[33]:0→Z[25]
If E=2:Then
Locate 6,4,"<EXE>:ENTER"
Else If E=1
Then
Locate 15,4,"►t"
    ([FUNCTION] [7] [3] [4])
Locate 16,4,"E"
IfEnd;IfEnd

For 1→I To D
Locate X+I-1,Y,">"
Next


0→C
    (桁数カウンタの初期化)
Lbl 0


Do
Getkey→K
LpWhile K=0

If (K≧21 And K≦23) Or K=25 Or (K≧21 And K≦23) Or (K≧31 And K≦33) Or (K≧35 And K≦37)
Then
If C<D:Then
10Z+Z[K]→Z
Locate X,Y,Z
Isz C
IfEnd:IfEnd

K≠47⇒Goto 0

If E=2:Then
Locate 6,4,"           "
    (スペース11個)
Else If E=1
Then
Locate 15,4,"  "
    (スペース2個)
IfEnd:IfEnd

0→DimZ
Return



「入力ボックス」プログラムの構造

[初期化処理]

[キーコードからキーの数への変換]

Lbl 0

        [キーコード取得]

        [戻り値 Z の算出と表示]

K≠47⇒Goto 0

[後処理]

Return




現状では、入力はできても、打ち間違いの修正ができません。そこで次回は、[DEL]キーを使った削除機能を追加します。




つづく...


CasioBasic入門18 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR