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 / 目次




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

人気ブログランキングへ


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