キー押下でプログラムをコントロールしたい - 逆引き Casio Basic

逆引き Casio Basic
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

追記修正 2017/01/03
[fx-5800P / fx-9860GII / fx-CG20]

プログラムの一旦停止や実行をキー押下でコントロールしたい。



プログラムは、コードの上から下へ順に実行されるものだ、と理解することは基本だ。逆にプログラムを一旦停止するには、一旦停止の機能をコードとして書く必要がある。

最も簡単な方法は、Casio Basic に備わっている Casio 特有の旧来からの命令の1つ  (出力)命令を使うことだ。
命令には、一旦停止の機能も備わっているので、プログラムを一旦停止したいところで使うことができる。但し、一旦停止を解除するには [EXE] を押す必要があり、他のキーは使えない。なお  命令は出力命令なので空白を含めて何か出力させるようにコードを書く必要がある。何も出力せずに一旦停止のみ行うには ""◢ とすれば良い。

命令を含んた旧来の命令の使いこなしは、Casio Basic 入門38 を参照



Basic コマンドを使うと、キーを押した時のプログラムの動作のコントロールを、より自由度高く行える。

汎用性のあるコードとして、
  • 処理を一旦停止させ、何かキーを押している間に処理を先に進める方法
  • 処理を一旦停止させ、何かキーを押すたびに(押している時間に係わらず) 処理を1回だけ実行する方法
  • ◢ 命令と同じ動作を、Basic コマンドで実現する方法
  • ◢ 命令とほぼ同じ機能だが、[EXE] キー以外で一旦停止を楷書する方法
  • 処理を一旦停止させ、何かキーを押している間だけ処理を実行する方法
を紹介する。基本的にキーが押されたことの検出とキーが離されたことの検出、それらの組み合わせで実現する方法だ。具体的には While / WhileEnd ループと Getkey を使って2~4行のコードで実現できる。

⇒ Casio Basic コマンドリファレンス: Whileループ


先ず、以下のプログラムを作り、これを元にそれぞれの課題を実現する方法を付加してゆく。
以下のプログラムは、fx-5800P, fx-9860GII, fx-CG20 のすべてに共通して使える。

ファイル名: C-UP
0→C
While 1
Isz C
Locate 1,1,C
WhileEnd


変数 C0 で初期化し、
Isz CC を1つ増やして Locate 1,1,C で増やした C の値を表示する。
While 1 / WhileEnd による無限ループでこの処理を繰り返す。

プログラム C-UP を実行すると、数字がカウントアップされ、[AC] キーで強制終了する。

==========

何かキーを押している時だけカウントアップを実行し、キーを離したら一旦停止するように、C-UP を改造する。

ファイル名: C-UP1
0→C
While 1
Isz C
Locate 1,1,C
While Getkey=0
WhileEnd

WhileEnd


プログラム C-UP に赤文字の2行を追加した。
 While Getkey=0
 WhileEnd

は、いずれのキーも押されていない時に処理を先に進めない (一旦停止) 機能を実現する。プログラムを一旦停止し、何かキー([AC] キーを除く)を押したら一旦停止を解除する。

さらにキーを押している間カウントアップ処理が継続され、キーを離したら処理が一旦停止する。
なお、カウントアップを1回だけ行うには、キーを押している時間をできるだけ短くする必要がある。言い換えればキーの長押しは、キーを複数回押したのと同じと判定される、つまりキ-リピートを検出する。

ここで、
 While Getkey=0
 WhileEnd

の動作を詳しく見てみる。While Getkey=0 は、While ループの [ループ継続条件]Getkey=0 になっている。
Getkey=0 は、何もキーが押されていないことを意味するから、何もキーが押されていないときこのループが継続する。つまりループがグルグル回っていて、プログラムの処理は先に進まないから、ここでプログラムが一旦停止しているように見える(実際はループ処理が続くのでプログラムは停止していない)。

Getkey は、それが実行された時に押されているキーを判別するコマンドで、押されているキーごとの固有のキーコードを返し、キーが押されていない時は 0 を返す。「返す」というのは、Getkey が その値になっていると思って良い。キーが押されていない場合は 0 になる。
従って、Getkey=0 は、いずれのキーも押されていない条件を示す。

==========

次に、C-UP1 を改造して、キーを押す時間にかかわらず、1回押したらカウントアップを1回だけ行うようにする。

ファイル名: C-UP2
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd

While Getkey=0
WhileEnd

WhileEnd


C-UP1 に青文字の
 While Getkey
 WhileEnd

の2行を追加した。

ここで、
 While Getkey
 WhileEnd
は、何かキーが押されている限りこの2行のループ処理が続き、キーが離された時にこのループを抜ける。つまりキーリピートを抑制する機能を実現する。

Getkey は、このコマンドが実行された時に何かキーが押されていたら 0 以外のキーコードを返す。「返す」とは、Getkey その値であると思って良い。
While Getkey は、While のループ継続条件が Getkey になっていて、何かキーが押されていたら Getkey が 0 以外の値になるから、この時ループは継続され、処理は先へ進まない。キーが離されると、Getkey は 0 になるからループから抜けて、処理は先へ進む。

==========

C-UP2 を改造して、 命令と同じ機能を実現してみる。

つまり、

0→C
While 1
Isz C
Locate 1,1,C◢

WhileEnd

と同じ機能を実現する。


ファイル名: C-UP3
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd

While Getkey≠47
WhileEnd

WhileEnd


C-UP2 の赤文字の部分を変更した。

ここで、、
 While Getkey≠47
 WhileEnd
このループは、キーコード 47 のキー、つまり [EXE] キーが押されない限り、繰り返しを継続して、処理が先に進まない。[EXE] キーが押される時のみ、処理が先へ進む。

命令を使う時は、キーリピートは無いので、
 While Getkey
 WhileEnd
によりキーリピートを抑制している。

この例は、キーコード47の [EXE] キーで処理を1回進めるものだが、他のキーに対応するキーコードを使えば、好きなキーコードで処理を1回進めることができる。汎用の高い方法だ。

==========

プログラム C-UP を改造して、何かキーが押されている時だけ、カウントアップを停止させるようにする。

ファイル名: C-UP4
0→C
While 1
Isz C
Locate 1,1,C
While Getkey
WhileEnd

WhileEnd


このコードで、
 While Getkey
 WhileEnd

は、何かキーが押されている限り、この2行のループが継続することは、上で紹介した。キーが離されている時は、このループは継続しない。

もし、この Getkey が実行されるとき、キーが押されていない場合、[ループ継続条件] である Getkey は 0 なので、ループに1度も入ることなくループを抜ける。







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

人気ブログランキングへ


FC2ブログランキングへ



   



keywords: CasioBasic、プログラミング入門プログラム関数電卓



関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR