Casio Basic入門16

Casio Basic入門
<目次>

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

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

Chapter 3

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

前回: Casio Basic入門15

「入力ボックス」プログラムの動作確認のために、、メインルーチン 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-1S"の呼出しと入力値の取得

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

WhileEnd

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


入力ボックスの雛形

「入力ボックス」のプログラムの構造を以下のように考えました。

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

[初期化処理]

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

Lbl 0

        [キーコード取得]

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

K≠47⇒Goto 0

[後処理]

Return



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

連続して押されたテンキーから、複数桁の入力値を算出してリアルタイムで表示するのがこのプログラムの基本になりますが、

Z+[新たな入力値]→Z
Locate X,Y,Z


と、うまく出来そうなことを確認しました。これから、入力ボックス CH3-0S (ゼロ・エス) を具体的に作ってゆきます。



Chapter 3-0 (続き)
「入力ボックス」プログラム CH3-0S

各ブロックごとに、プログラムコードを作ってゆきます。


[初期化処理]

共有変数 X, Y, Z のうち、戻り値の機能を持つ Z を初期化します。

0→Z


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

キー入力は、Getkeyコマンドを用いて押されたキーを判定します。このプログラムでは、Getkeyが返すキーコードから、キーの数字への変換が必要になります。

キーを押した時に得られるキーコードとキーの数字の関係は以下の表になりますが、簡単な式で表現できるような規則性が見つかりません。

キーの数字キーコード
35
36
37
21
22
23
31
32
33
25

そこで、配列変数 Z[ ] を利用します。


表1 キーコードからキーの数字への変換
キーの数字キーコード配列変数変換
Z[K]Z[K]の初期化
35Z[35]1→Z[35]
36Z[36]2→Z[36]
37Z[37]3→Z[37]
21Z[21]4→Z[21]
22Z[22]5→Z[22]
23Z[23]6→Z[23]
31Z[31]7→Z[31]
32Z[32]8→Z[32]
33Z[33]9→Z[33]
25Z[25]0→Z[25]

変換の列に示した通りに、配列変数を初期化しておきます。

こうしておくと、Getkeyコマンドで得られるキーコード K に対して、Z[K] は押されたキーの数になります。例えば、[6] キーを押すと、Getkeyコマンドで得られるキーコードは23、Z[23] は 6 になります。

配列変数を使用する前に、配列変数の領域を確保しなくてはなりませんが、その際の領域を 37 個分で確保します。

37→DimZ

こうすると、Z[1] ~ Z]37] が確保され、その中の上の表のにある必要なものが全て含まれます。

また、プログラムの最後では、確保した領域を開放します。

0→DimZ


配列変数は、プログラムの必要性に応じて、fx-5800P のメモリから必要な量のメモリ領域を確保して使う仕様なので、必要でなくなった時にメモリから解放しなければ、fx-5800P で使えるメモリ量が減ってしうので、領域解放は忘れずに行うようにします。

プログラムでは、配列変数 Z[1] から Z[37] までのうち、テンキーに対応する10個のみを使います。
 ⇒ CasioBasicコマンドリファレンス
      - 配列変数: Z[ ]

コマンドリファレンスに書いているように、配列変数の読み書きは通常変数よりも4倍ちかい時間がかかり、かなり遅いことが分かっています。そんなことから、私は配列変数を積極的に使わないようにしています。

しかし、キーコードからキーの数へ変換する簡単な式が見つからないので、配列変数を使うことにしました。と言うのも、If 文や 条件ジャンプ命令 ⇒ を使ってキーコードから押されたキーの数を判定する場合は、最低でも10回の判定が必要で、その場合は配列変数を使うよりも遙かに多くの処理時間が必要になり想定される時間は10倍以上になります。処理時間を考えた場合、配列変数が最良なわけです。

具体的なキーコードからキーの数への変換は、以下のように書けば良いですね。今回追加した部分を赤文字で示します。

37→DimZ
0→Z
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]



[キーコード取得]

このブロックには特別なことは何もありません。

Do
Getkey→K
LpWhile K=0


これについては、CasioBasic入門 の Chapter 1 で詳しく取り扱っています。


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

例えば、[2] [0] [1] [4] と順に入力されたとします。

1回のキー入力のたびに、Getkeyコマンドで取得したキーコードから数へ変換します。

[2] が押された時、Z2 にします。続いて [0] が押された時、Z20 とします。さらに [1] が押された時、Z201 とし、[4] が押されると、Z2014 とする...このような作戦にします。

何かキーが押された時、それまでに得られている Z を10倍して、今得た数を足せば、Z を更新できます。[新たな入力値] は Z[K] なので、

10Z+Z[K]→Z

これで、キーが押されるたびに Z の更新を行います。

そして、この Z を表示するには、

Locate X,Y,Z 

とします。

X と Y は、入力開始位置として、メインルーチンから渡されるものです。従ってメインルーチンで、

3→X:2→Y
Prog "CH3-0S"


と記述すると、このProgコマンドで呼び出されたプログラム CH3-0S (ゼロ・エス)では、この XY をそのまま使えます。

Locate X,Y,Z は、メインルーチンで指定した位置 (X, Y)Z を表示します。


そこで、このブロックのプログラムコードは以下のようになります。

If [押されたキーがテンキーの時]
Then
10Z+Z[K]→Z
Locate X,Y,Z
IfEnd


押されたキーがテンキー、つまり0~9のキーである条件は、キーコード K が 表1 に記載されている値であることです。改めて記載すると、

Kが、「21≦K≦23」 または 「K=25」 または 「31≦K≦33」 または 「35≦K≦37」 であること

または と言うのは、数学用語、プログラミング用語で、CasioBasic には、「または」を意味する論理演算コマンド Or があります。

従って、上の条件を、この論理演算コマンドを使えば、

(21≦K≦23) Or K=25 Or (31≦K≦33) Or (35≦K≦37)

となります。


キーコード
・・・212223242526272829303132333435363738

赤く塗った部分が、上の条件を示しています。Or理論和とも言いますが、「全体の広がり」のイメージです。


さて、21≦K≦23 と言う表記はCasioBasicでは正しく動作しません。「K≧21 かつ K≦23」 と、2つに分けた表現が必要です。

論理演算コマンドを使えば、

K≧21 And K≦23 

となります。

← ←  ← ← K≦23
181920212223242526
K≧21 → → → →

K≦23 を青く塗りつぶし、K≧21 を緑で塗りつぶしています。
これらの重なる部分が、K≧21 And K≦23 です。And理論積と言いますが、「重なり」のイメージです。

31≦K≦33 や 35≦K≦37 も同様です


従って、上の 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)

論理演算コマンド Or And については、以下で少し詳しく説明します。

このブロックのプログラムコードは、以下のようになります。

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




[後処理]

後処理で重要なのは、配列変数の領域を開放することです。確保したままだとプログラム領域が減ったままになります。

0→DimZ

を実行しておきます。

このプログラムはサブルーチンとして機能するので、動作が終了するとメインルーチンの呼び出し部分へ戻ります。しかし明示的に Return コマンドを実行するようにします。

後処理は以下のようになります。

0→DimZ
Return



以上を一旦まとめておきます。

プログラム名 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 o


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


この入力ボックス プログラクを作成した上で、メインルーチン CH3-0M を実行してみてください。

メインルーチン起動後、メニュー番号0を押すと、入力モードになります。実際にテンキーで入力が可能なことを確認してください。そして[EXE]キーを押すと入力が確定され、表示されます。

先ずは、最低限必要な基本動作ができました。



論理演算について

論理演算 OrAnd が出てきましたが、これらを1度きちんと理解しておかないと、あとで困ることになります。そこで、少し行数を使って解説しておきます。

Or は「あるいは」で、And は「かつ」 と言うことは上で紹介しました。このような論理演算を 言葉、特に日本語で考えてはいけません。絶対に分からなくなります。

論理演算はキチンと規則があり、それに従えば、悩むことも、間違えることもなくなります。

fx-5800P 搭載の CasioBasicの論理演算コマンドには、OrAndNot の3種類あります。(fx-9860GII では、これらに加えて Xor が追加されています。これらの論理演算は他のプログラミング言語でも同じです)。

これらの書式は、

X Or Y

X And Y

Not X


です。

論理演算結果は、「真」「偽」かのどちらかになります。
論理演算で使う X と Y (上記の書式の場合)も、「真」「偽」のどちらかの値を持ちます。

これまで、色々なコマンドの条件にも、「真」と「偽」が出てきて、「0でない」「真」で、「0である」「偽」でした。
「真」True「偽」False とも言いますが、ここでは真と偽を使います。

先ずは、以下の表を見て下さい。

X Or Y
XYX Or Y
X と Y のどちらか1つが真ならば、X Or Y の結果は真となり、
両方が偽の時、偽となります。


X And Y
XYX And Y
X と Y の両方が真ならば、X And Y の結果は真となり、
どちらかに偽があれば、偽となります。


Not X
XNot X

Not X は、Xの真と偽を入れ替えます。

これらの表を「真理表」といい、論理演算を確かめるために使えます。



ド・モルガンの法則

ここで、覚えておくと便利な法則:ド・モルガンの法則 を紹介します。

Not (X And Y) = (Not X) Or (Not Y)     ・・・ (式1)

Not (X Or Y) = (Not X) And (Not Y)     ・・・ (式2)

これを真理表で確かめてみます。

XYX And YNot (X And Y)

XYNot XNot Y(Not X) Or (Not Y)

それぞれの表の一番右の結果が等しくなっていることから、(式1)が正しいことが分かります。

(式2)についても同様に確かめられますので、やってみてください。


さて、ド・モルガンの法則 が役立つ事例を紹介します。

例えば、A=1 と B=2 が同時になり立つ」時、Dsz C を実行せず、それ以外の場合に Dsz Cを実行したい、と言う内容をプログラムでスッキリと書きたい時、どうするか?

「A=1 と B=2が同時に成り立つ」のではない時(それ以外の場合)、Dsz C を実行する、でも論理的に正しいですね。

A=1 And B=2」ではない は、Not (A=1 And B=2) です。

ド・モルガンの法則を使えば、

Not (A=1 And B=2) = A≠1 Or B≠2

なので、

A≠1 Or B≠2 の時 Dsz C を実行する、と書けば良いので、

A≠1 Or B≠2⇒Dsz C

と、うまく書けました。

ド・モルガンの法則 は、プログラミングで役立つことが多いので、覚えておくと良いと思います。


※ CasioBasicコマンドリファレンス
      - 論理演算: Or / And / Not



次回は、入力ボックスとしての完成度を上げてゆきます。



つづく...


CasioBasic入門17 / 目次




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

人気ブログランキングへ


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