Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
2015/03/07
2016/03/16 修正
4. Casio Basicを使ってみる(続き)
前回:
Casio Basic入門42Chapter 8 - 初級◆ Chapter 8 の目標: Basic命令を使ってみるChapter 7 では、旧来の命令をできるだけ利用し、その能力を見てきました。旧来の命令には多彩な機能が備わっていて、うまく活用すると、実用的なプログラムを作れることを紹介しました。
但し、旧来の命令は Casio 独自のものなので、せっかく覚えても Basic プログラミングの学習としては応用が利かず、一般的な Basic プログラミングには役立ちません。
2006年に登場した fx-5800P 以降の Casio のプログラム電卓(プログラム関数電卓とグラフ関数電卓)には、新世代 Basic Basic が搭載されていて、多くの Basic 言語との共通性が高く、実用的なプログラムを作れます。
?(入力)命令や◢(出力)命令は、Basic コマンドを使って置き換えられます。そこで、Chapter 7 で作ったプログラムを Basic コマンドに置き換え、さらに旧来の命令ではできないことを実現してゆきます。Chapter 7 で作った温度換算プログラムのプログラム
TC5 のコードを示します。
温度換算プログラム TC50→A
Lbl 0
Cls
"1: °C" (スペース11個)
"2: °F" (スペース11個)
"3: K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°"?→M
Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd
Goto 0このプログラムは、
COMPモードと
PROGモードの両方から実行できます。具体的な操作方法は
Chapter 7 でも紹介しています。
fx-5800P の電源を入れます。fx-5800P は、
[MODE] キーか
[FUNCTION] キーを押して表示されるメニューから様々な機能を呼び出せます。
PROGモードから 既に作った温度換算プログラム
TC5 を呼びだして実行してみます。
[MODE] キーを押してモードメニューを表示させ、
[5] (5:PRG) を押して、
PROGモードに入ると、
Program Menu が表示されます。
プログラムを実行させるために
[2] (2:RUN) を押すと、
Prog List が表示されます。
PROMモードからプログラムを起動したので、画面上端に小さく
PROG と表示されています。
Prog List で
[▲] キーと
[▼] キーで、カーソルを
TC5 に合わせ、
[EXE] キーで プログラムを起動します。
温度換算プログラム
TC5 が起動した時の画面です。
[1]、[2]、[3] のいずれかのキーを押してメニュー選択を行います。
ここで、摂氏温度を入力するために、
[1] キーを押すと以下のようになります。
画面が1行スクロールして上にずれます。そして一番下の行(4行目)に今入力した
1 が表示されています。
実は、このスクロールはチョット気に入らないのですが、
?(入力)命令の仕様なのでしかたありません。
そして、この入力を確定するために
[EXE] キーを押すと、以下の摂氏温度入力画面になります。
ところで、1つ上のメニュー番号の入力で [
EXE] キーで確定するのは、無駄な操作ではないでしょうか?
つまり、
[EXE] キーで確定することなしに、
[1] ~
[3] のテンキーを押したら、直ちに摂氏温度入力画面に切り替わって欲しいと思います。しかし、
[EXE] で入力確定しなければならないのは、
?(入力)命令を使う限り避けられない仕様です。
そこで今回は、
[EXE] キーを押さずに、メニュー番号を入力したら直ちに温度値入力画面に切り替えるようにプログラムを変更してゆきます。これは、
?(入力)命令の代わりに Basic の入力コマンド
Getkey を使って実現できます。
Chapter 8-1メニュー選択に Getkey を使う上に示したコードで、赤文字で示した1行
"INPUT MENU N°"?→Mは、
?(入力)命令を使って、入力した番号を 変数 M に格納しています。余計な
[EXE] キーによる入力確定を行わないようにするには、この部分を
?(入力)命令以外の方法でキー入力をさせるように変更します。
新世代 Casio Basic には、2つの入力方法があります。
・?(入力)命令
・Getkey コマンド今回は、この1行を
Getkey コマンドを用いたコードに置き換えます。
Getkey コマンド先ずは、
[1] キーが押されたことを検知する処理を
Getkey を使って実現します。
何かキーが押されている時に
Getkey コマンドが実行されると、そのキーに対応したキーコード(2桁のコードか0) が得られます。電卓の全てのキーにそれぞれ異なったキーコードが割り振られています。但し
[AC] キーだけが例外的にキーコードが割り振られていません。キーコードを検出すれば、
[AC] 以外の全てのキーを判別できます。
Getkey→Lと書くと、
Getkey が取得したキーコードが変数
L に格納されます。
この書き方は、Getkey が変数のように見えます。
Getkey は取得したキーコードの値を保っていて、それを変数 L に代入する、と考えると良いわけです。
もし何もキーが押されていない場合は、
Getkey は
0 になるので、変数
L に
0 が入ります。
Getkey が
2桁のキーコードや 0 を格納した変数のように振る舞う 時、
Getkey はキーコードあるいは 0 を返す、と言います。これは、Casio Basic に限らず、ほぼ全てのプログラミング言語で使われている言い方です。「返す」は、リターン(
return)とも言います。返された値を「戻り値 」と言います。
Casio Basic では、値を返すBasic コマンドは
GetKey しかありません。Basic コマンド以外では、電卓に内蔵されている各種関数が値を返します。例えば、
Int( )、Frac( )、log( )、sin( )、cos( )、などがあります。
- Int( ) 小数を切り捨てた整数部を返す
- Frac( ) 整数を切り捨てた小数部を返す
- log( ) 対数関数
- sin( ) 三角関数
- cos( ) 三角関数
さて、プログラムは、上から下へ命令やコマンドが順次実行されます。条件分岐の
If のように、実行順序を変更するコマンドが無い限り、上から下へ1行づつ順に実行されるのが、プログラムの大原則です。これは Casio Basic に限らず、全てのプログラミング言語に共通の、重要ポイントです。
※参考: イベントドリブン(イベント駆動)型と言われる Windowsプログラミングでも、Winidows自身が行っているメッセージループなどの全ての動作に対して(見えなくなっているだけで)、この大原則は当てはまり、少なくともプログラマが書く部分だけをみても、各関数やプロシージャ内ではこの大原則に支配されます。
?(入力)命令は、
[EXE] キーで入力確定されるまで、プログラムの実行を止める機能を備えていることは、
Chapter 7 で説明しました。一方、残念なことに
Getkey コマンドには、実行を一時停止する機能が備わっていません。
すると、
Getkey→L が実行されているその瞬間にキーが押されないと、キーの検出が出来ないことになります。しかし、この仕様のおかげで、リアルタイムでキー入力の検出が可能になります。
⇒
Casio Basic コマンドリファレンス - GetkeyGetkey の使いこなしについては、以下で詳しく説明しています。
⇒
Casio basic 入門3 ⇒
Casio Basic 入門4キー入力の取得方法キー入力取得方法を紹介します。
Do
Getkey→L
LpWhile L=0この3行で、
[EXE] キーでの入力確定無しに、キー入力を取得できます。
Do は、
LpWhile と組み合わせて、繰り返し処理を行います。
繰り返しを「ループ」とも言い、
Do と
LpWhile で構成される繰り返し処理を
Do ループと言います。
- プログラムは上から下へ順次実行されます。
- 上から下へ処理が進んでゆき、Do に出くわします。ここでは特に何もせず、次に進みます。
- 次は、Getkey→L です。これが実行された時に偶然何かキーが押されていれば、そのキーのキーコードを取得して変数 L に格納します。これが実行された時に残念ながらキーが押されていない場合は、変数 L に 0 が格納されます。そして、プログラムはさらに下へ進みます。
- その次の処理 LpWhile L=0 が実行されます。 この1行では、変数 L が 0 ならば Do へジャンプして、Do から下へ処理を繰り返します。L が 0 以外ならそのまま下へ実行が進み、この3行の繰り返し処理から脱出します。
この3行のコードにより、
Do と
LpWhile L=0 の間を繰り返します。そして、
L に
0 が入っている限り、この3行を延々と繰り返します。
L に
0 が入っていると言うのは、押されたキーが検出され無いことですから、キーが押されたことを検出するまで、この3行が繰り返されます。
L=0 はキーが押されていないことなので、キーが押されない限りこのループが回り続け、その下の処理には移りません。言い換えればこのループは、キーが入力されるのを待っている処理になっています。
そして、キー入力が検出された時に、この3行の繰り返し(
Do ループ)から解放され、プログラムは下へ進むことができます。下に進んだ時は、変数
L には押されたキーのキーコードが格納されています。
この3行は、キー入力待ちと入力キーのキーコードを取得する機能、つまり今欲しい機能を実現することが分かると思います。
以上を頭に入れて、改めて
Do ~LpWhile がどういうものか、見てみましょう。
⇒
Casio Basic コマンドリファレンス - Do ~ LpWhileDo は、
LpWhile からジャンプする先を示す目印です。
Goto に対する
Lbl と同じようなものです。
LpWhile [繰り返し条件] は、
[繰り返し条件] が満たされる時、厳密に言うと
[繰り返し条件] が
「真」ならば、
Do へジャンプします。
Do
Getkey→L
LpWhile L=0この例では、繰り返し条件は、
L=0 です。
L が
0 である限り、この
Do ループが繰り返されます。
L が 0 と言うことは、
Getkey がキーコードを取得していないことなので、何かキーが押されるまでは、このループが回り続け、キーが押されたらそのキーコードを変数
L に入れて、ループが終わります。
この3行は、押されたキーの判別を行うためによく用いる方法です。
キーコードCasio Basic では、電卓の
[AC] キー以外の全てのキーに対して、異なる2桁のキーコードが割り振られています。
テンキー以外にも、例えば
[DEL] キーや、
[▼]、[▲]、[▶]、[◀] キーなどにも、それぞれ異なるキーコードが設定されています。つまり、
Getkeyを使えば、全てのキーを判別できるので、Casio Basic ではかなり実用的なプログラムを作れます。
さて、
[1] キーのキーコードは
35 です。今回のプログラムでは、
[2] や
[3] キーの取得も行います。
[2] のキーコードは
36、
[3] のキーコードは
37 です。では、
[4] のキーコードは、
38 かと言えばそうではなくて、
21 です。キーコードは、テンキーの数字との簡単な関係にはなく、ばらばらです。
キーコードについては、fx-5800P 取扱説明書の99ページを見るか、
キーコード取得プログラム を使って、調べる必要があります。
メニュー番号取得温度換算プログラム
TC5 で、メニュー番号取得は以下の1行で行っています。
"INPUT MENU N°"?→Mこの1行を、?(入力)命令を使わずに実現するのが、今回の目的です。
何かキーが押された時のキーコード取得は、上で検討したように、以下の3行で実現できます。
Do
Getkey→L
LpWhile L=0[1], [2], [3] キーに対する、キーコードとメニュー番号は以下の関係です。
押されたキー | キーコード:変数 L | メニュー番号: 変数 M |
[1] | 35 | 1 |
[2] | 36 | 2 |
[3] | 37 | 3 |
そこで、キーコードを格納した変数 L から 対応するメニュー番号変数 M を
If 文を使った条件分岐で対応付けることにします。
If L=35
Then 1→M
IfEnd
If L=36
Then 2→M
IfEnd
If L=37
Then 3→M
IfEndIf 文については、コマンドリファレンスをご覧ください。
⇒
Casio Basic コマンドリファレンス - If 文⇒(条件分岐)命令条件分岐には、If 文以外に、Casio Basic には、⇒命令があります。これは、新世代 Casio Basic がリリースされる前から Casio のプログラム電卓に搭載されている Casio Basic 特有の命令です。
If [条件]
Then
[処理]
IfEndを
⇒命令を使って同じ処理を行えます。
[条件]⇒[処理]と書けます。
Chapter 8 では、Casio Basic の旧来の命令を使わず、Basic コマンドを使うことをメインテーマにしているのに、何故ここで旧来の命令である⇒命令を取り上げるのか?という疑問が出てくると思います。
⇒命令には、他の旧来の命令にない、大きな特徴があります。
If ~Then~IfEnd 文に比べて、圧倒的に処理速度が速い(2倍程度速い)と言う点です。特に、fx-5800P は全般的に処理速度の遅いハードウェアなので、2倍も速い命令の価値が出てきます。そして、シンプルに1行に書けるので、プログラムの可読性が向上するといった副次的なメリットもあります。
If L=35Then 1→M
IfEnd
If L=36
Then 2→M
IfEnd
If L=37
Then 3→M
IfEndを ⇒(条件分岐)命令を使って書き直すと、以下のようになります。
L=35⇒1→M
L=36⇒2→M
L=37⇒3→Mどうでしょうか?圧倒的に読みやすいですね!そして処理速度が速いのです。
但し、
If 文で Else を使う場合は、⇒ 命令への直接の置き換え(
= 同じ論理構造での書き換え)はできません、
⇒命令には、If 文の Else に相当する機能が用意されていないからです。
⇒(条件分岐)命令は、If 文を完全に置き換えるものでななくて、限定的に Else が無い時に有用、という点には留意が必要です。
以上の検討により、
TC5 のメニュー番号取得部分
"INPUT MENU N°"?→Mは、以下のように置き換えられます。
"INPUT MENU N°?"
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
以上を反映させたプログラムを
TC6 とします。今回変更した部分を赤文字で示します。
温度換算プログラム TC60→A
Lbl 0
Cls
"1: °C" (スペース11個)
"2: °F" (スペース11個)
"3: K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°?"
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd
Goto 0ところで、赤文字部分の一番上の
"INPUT MENU N°?" ですが、説明無しにいきなり出てきました。
Getkey コマンドは、単にキーコードを取得する機能しかないので、?(入力)命令のように表示機能が含まれていません。従って文字列表示を行う必要があります。
?(入力)命令で説明のための文字列を表示する時、その時の内部カーソル行に表示を行います。
” ”(出力)命令も、その時の内部カーソル行に表示を行います。今回は同じ行に単に表示を行うために
” ”(出力)命令を使ったので、同じ行に表示されます。従って
Locate コマンドを用いる必要はありません。
但し、” ”(出力)命令を記述する際に、それが実行されるときの内部カーソル行を把握しきれないことが殆どです。従って
Locate コマンドを使って、出力の位置を明示的に指定する方が、確実でプログラミングは楽になります。従って、
"INPUT MENU N°?"の代わりに、
Locate 1,4,"INPUT MENU N°?"とすることを推奨します。
なお、
Cls コマンドを実行すると、内部カーソル行がリセットされて1行目に設定されます。
上のプログラムでは、
Cls の後に 表示しか行っておらず、内部カーソル行を確実に把握できるので、
例外的に Locate コマンドを使わずにおきます。
それでは、上記の変更を実際に行います。
先ず、プログラム名
TC5 を
TC6 に変更します。
今、
PROGモードにある場合は、
[EXIT] キーを何回か押せば、Program Menu 画面に戻ります。
ここで、
[3] (3:EDIT) を選ぶと、
Prog Edit 画面になります。
ここで、ファイル名
TC5 を
TC6 に変更したいので、
TC5 にカーソルを合わせ、
[FUNCTION] キーを押します。
ここで、
[2] (2:Rename) を選ぶ。
画面上端、左側に、小さなアイコン
A が表示されているので、アルファベット入力モード(
ALPHAモード)になっています。
ファイル名末尾の
5 を
6 に変えるので、
[ALPHA] キーを押して、
ALPHAモードを解除し、
TC6 に変更します。
[EXE] キーで確定します。
TC6 にカーソルを合わせ、
[EXE] で確定すると、プログラム編集画面になります。
上記の
TC6 のソースコードに従って、赤文字部分を変更・入力します。入力が終わったら
[EXIT] キーを2回押して、
Program Menu 画面に戻ります。
[2] (2:RUN) を選ぶと、
Prog List が表示されます。PROGモードから呼びだした
Prog List なので、画面上端に小さく
PRGM の表示が見えます。
TC6 をカーソルで選び、
[EXE] キーでプログラムを起動します。
ここで、摂氏温度を入力することにし、
[1] を入力すると、
[EXE] による入力確定なしに、直ちに温度入力画面に移行します。
摂氏温度入力画面です。
20 を入力し、
[EXE] で確定すると、
換算結果が表示されます。動作確認してみてください。正常に動作すると思います。
プログラムを終了させるために、
[AC] キーを押すと、
強制終了されたことが表示され、ここで
[EXIT] キーを押せば、
プログラム編集画面に戻ります。
このように、
PROGモードでプログラムを実行すると、強制終了した時に、プログラム編集画面に戻るので、うっかりプログラムを変更してしまう可能性があります。従って、一旦完成したプログラムを実行するには、
COMPモードから
Prog List を出して、そこから実行すべきです。
[MODE] キーを押して、モードメニューを表示させ、
[1] (1:COMP) を選びます。すると、通常の電卓の画面(
COMPモード)になるので、そこで [FILE] キーを押して、
Prog List を表示させます。
COMPモードからの呼び出しなので、画面上端に
PROG 表示がありません。ここで、
TC6 を選び、
[EXE] で確定すると、
プログラムが起動します。ここで
[AC] キーを押して終了させます。
[AC] で終了(強制終了)されたことが表示され、
[EXIT] キーを押すと、
PROGモードの時とは、異なった画面表示になります。
プログラム編集画面にならず、
COMPモードで
Prog "TC6"と表示されています。このままの状態で
[EXE] を押すと、再び
TC6 が起動します。つまり、
COMPモードで
Prog "TC6" と入力して
[EXE] を押すと、
TC6 が実行されることが分かります。
試しに、COMPモードで、
Prog "TC6" をキー入力してみます。
[SHIFT] [FILE] (Prog) と入力すると、画面に Prog と表示されます。続けて
[ALPHA] [√■] (”)
[ALPHA] [2] (T)
[ALPHA] [°’’’] (C)
[6]
[ALPHA] [√■] (”)と入力すると、
Prog "TC6" と表示されます。そして
[EXE] を押すと プログラム
TC6 が起動することが分かります。つまり、この手入力のプロセスの代わりに、リストからプログラム名を選んで実行するのが、[FILE] キーの正体なのです。
[2015/03/16 追記] バグ修正
[2016/02/14 修正] 画像差し替え&説明修正
うっかり、大切なポイントが抜けていましたので、追記します。
上で示したソースのままですと、たまにバグが発生します。具体的には、下記の異常です;
- [1] ~ [3] 以外のキーを押した時、それを無視するはずですが、入力画面が表示されてしまう。
このプログラムを普段使っているのですが、そのバージョンではこのバグへの対策をしているのですが、今回それを忘れていました。
プログラム起動時のメニュー選択画面で、
[1] ~
[3] 以外のキーを押した時の画面の一例:
[1] を押していないのに、摂氏温度を入力させる画面になってしまいました。
[1]~
[3] 以外のキーを押しても無視するようにしたいのです。
このようなバグが発生するのは、プログラム起動時にメニュー番号変数 M に 1 が格納されていることが原因です。
キー検知とメニュー番号取得のブロックを以下に転記します。
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→Mもし、プログラム起動前に、変数 M に 1 が格納されていたとします。そして
[1] ~
[3] 以外のキー、例えば
[9] を押したとします。すると、このブロックでは、Getkey で取得したキーコードは、
L=35 でも
L=36 でも
L=37 でもないので、下の3行は実行されません。すると、変数 M には 1 が入ったままで、次の処理へ進みます。
すると、
If M=1:Then 以下が実行され、まるで
[1] キーを押したのと同じ処理になってしまいます。
そこで、
[1] ~
[3] 以外のキーが押された時には、
変数 M に 1 ~ 3 以外の値が入っているようにします。
そこで、このブロックが実行されるたびに、事前にメニュー番号にはなり得ない値で変数
M を初期化しておく作戦にします。今後機能拡張によってメニューが増える可能性が無いとも限りません。そこで、メニュー番号
-1 にすることは多分無いので、
M を
-1 で初期化することにします。
具体的には、
-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→Mと変更しておきます。
キー検知のたびに、
M を
-1 で初期化しておくと、
M が
1 ~
3 以外の時は、
M = -1 になるので、これに続く
If 文での
M の値による条件分岐のいずれも実行されず、問題は発生しません。
この修正を含めて、改めてプログラム
TC6 のソースを示します。
温度換算プログラム TC60→A
Lbl 0
Cls
"1: °C" (スペース11個)
"2: °F" (スペース11個)
"3: K" (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
"INPUT MENU N°?"
-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
Cls
If M=1:Then
"°C"?C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
"K"?K
K-273.15→C
C(9÷5)+32→F
1→A
IfEnd:IfEnd
IfEnd
Goto 0(今回修正した部分を
赤文字で示す)
メニュー選択で、番号を入力したら、直ちに入力画面が表示されるように変更ができました。
Getkey と、それを活用するための
Do ループの使い方は、プログラミング経験が無いと分かりにくいかも知れません。新世代 Casio Basic の使いこなしの鍵が、
Getkey と
Locate にあると思っています。これを使いこなせたら、Casio Basic だけでなく 他のBasic をかなり使いこなせるようになります。
Getkey の使いこなしについては、
Casio Basic 入門3 ~
Casio Basic 入門4で、詳細に解説していますので、是非ご覧ください。ここでは、
Locate の使いこなしにも触れています。
この画面が表示されているとき、温度入力画面を表示させずに、この画面で直接温度を入力できたら、プログラムとしての完成度が上がると思っています。プログラムでは、常にこの画面を表示したままにして、数値を入力して換算値を表示する...パソコンのプログラムでは当たり前のことです。
次回は、これをプログラム電卓で実現してみようと思います。
つづく...
⇒ Casio Basic入門44 / 目次 応援クリックをお願いします。励みになるので...
keywords: fx-5800P、CasioBasic、入力ボックス, プログラミング入門、プログラム関数電卓、温度換算
リンク集 | ブログ内マップ
- 関連記事
-
テーマ : プログラム関数電卓
ジャンル : コンピュータ