Casio Basic入門15
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終: 2015/01/17
修正: 2017/09/11
最終: 2015/01/17
修正: 2017/09/11
4. CasioBasicを使ってみる(続き)
前回: Casio Basic入門14 - Chapter 2
Chapter 3
◆ Chapter 3 の目標: 自由自在に入力する
Windows のエクスプローラで、ファイル名を変更する場合

このように、入力範囲が現れて、そこで入力や編集を行い、最後のEnterキーで確定します。
あるいは、以下のように最初から入力ボックスが表示されている場合もあります。

[ サンプル ] 入力ボックスをクリックするとカーソルが現れ、入力や編集を行い、入力ボックスの外側を適当にクリックすると内容が確定されます。
実は個人的に、このような入力ボックスの機能をCasio Basic で使えるようにしていて、多くのCasio Basic プログラムを作る際に気楽に使っています。そこで、Casio Basic で気楽に使える入力ボックスを紹介しようと思います。
CasioBasicで入力ボックスを使いたい...これが Chapter 3 のテーマです。
Casio Basicでは、さすがにウィンドウ表示は無理ですが...
・入力範囲を表示する
・入力桁数を指定する
・入力と編集を行う
・[EXE]キーで確定する
これくらいの機能は、fx-5800P の遅いプロセッサでもなんとかなりそうです。
百聞は一見にしかず、でサンプルをみてもらいます。
今年の西暦年を 0.This Yr の右に入力しておき...
(今年 = This year)

メニュー番号1の 1.Born in に生まれ年を入力するために、 [1] キーを押します。
(1970年生まれ = Born in 1970)
すると、入力範囲が >>>> で表示され、入力モードに入ったことが分かります。

右下に、<EXE>:ENTER と表示され、入力モードであること、[EXE]キーで確定...とガイドがでます
ここで、テンキーを押せば自由に数字を入力でき、[DEL] キーで右から1文字づつ削除できて、入力内容の修正・編集ができます。

右下の <EXE>:ENTER は、確定前の入力モードであることを示しています。
1988 で確定すると...

2.Age の項目に 26 と表示されます。
(年齢 = Age)
1988年生まれだと、2014年では 26歳だとわかります。
これは、機能面で言えば、一種の換算プログラムです。
次に、和暦と西暦を換算するプログラムです。

項目が多いですね。
0:AD (西暦) | |
1:M (明治) | 2:T (大正) |
3:S (昭和) | 4:H (平成) |
5:At (この西暦では...) | 6: y (この歳...) |
1画面に、7項目を押し込んでいます。
和暦と西暦を換算するプログラムですが、おまけ機能として、項目5と6を追加しています。
各項目への入力は、上の例と全く同じです。
0:AD に1990 と入力すると、明治、大正、昭和、平成の年が表示されます。
4:H に 2 と入力すると、西暦、明治、大正、昭和の年が表示されます。
どちらも表示結果は同じですが、1カ所を変更すると、残りの項目が連動して変化します。

西暦1990年は、明治123年、大正79年、昭和65年、平成2年と表示されます。
項目0から4まで、好きな項目に好きな値を入力でき、入力値に応じて全ての項目が更新されます。
この状態で、5:At に別の西暦を入力してみます。

[5]キーを押すと、入力モードになって、4桁の入力範囲が示されています。
右下には 三角マークとE の表示がありますが、これも 確定を促すサインです。これが表示されていれば入力モードと言うわけです。
平成2年生まれの人は、東京オリンピック開催の2020年では...?
そこで、2020 と入力。

右下のEマークが残っているので、まだ入力モード、確定前です。そこで、[EXE]キーで確定すると...

6:30y と表示されました。
東京オリンピック開催時には30歳になっている、と教えてくれています。
項目 5:At に過去の西暦を入れたり、項目 6: y に過去の年齢を入れると、それぞれ過去の年齢や西暦が換算されるので、履歴書を書いたり、自分の過去の年を思い出すのに役立っています。
これも、一種の換算プログラムです。
「入力ボックス」サブルーチンの活用
上で紹介した2つのプログラムでは、入力ボックス機能として、全く同じサブルーチンを使い回しています。つまり、一旦このサブルーチンを作っておけば、入力モードについてはプログラミングの必要がありません。
これらのメインルーチンは、項目数が違っていて、具体的な計算(換算)は異なりますが、実はほぼ同じプログラム構造で作れます。換算プログラムを作るには、基本構造は同じなので、実際に考えるのは具体的な計算(換算)部分のみです。
自由自在に入力するための1つの方法として、このような「入力ボックス」サブルーチンを活用すれば、必要な換算プログラムを簡単かつ短時間で作れるます。そのメリットは大きいのではないでしょうか?
同じサブルーチンを使った他のプログラム事例をもう少し紹介します。
温度単位換算プログラム
摂氏温度(°C)、華氏温度(°F)、絶対温度(K)の換算プログラムです。

項目が3つで、どれかに入力すれば、他の単位の値が表示されます。
華氏(°F)はアメリカで使われていて、日本の摂氏温度(°C)の感覚とはとても異なる値です。

アメリカ南部の夏の温度は、現地の天気予報を見ると100度とか105度と言っていますが、我々日本の温度では40度程度だと分かります。気温100度と聞いてビックリしますが、40度でも相当熱いですね...
絶対温度は、高校の物理や化学で初めて出てくると思いますが、理工系では必ず使う温度単位です。液体窒素でバナナを凍らせると釘が打てる....その液体窒素の温度は、絶対温度で77Kです。

換算結果を見ると、だいたい-196℃ だと分かります。感覚を超えた低い温度ですね。
画面の左下に <RCL> とありますが、[RCL]キーを押すと計算式を表示するオマケ機能です。

圧力単位換算プログラム

圧力単位は、普通にはあまり馴染みの無いものですが、私はこのプログラムを仕事で愛用してます。この画面は、psi という単位で入力しようとしているところ(入力モードに入っている)です。

500psi は、他の単位では....
ちなみに、psi は、1平方インチあたりのポンド...なんとも分かりづらい単位です。
入力ボックス・サブルーチン
各種換算プログラムへの適用
1画面に全ての項目が表示された換算プログラムは、どれか1つを変えると、他がどのように変わるのか?が1画面で把握できるので、非常に使いやすくなります。
ちなみに、CasioBasicの「入力命令:?」を使うと、このようなプログラムを作ることは困難です。入力命令:? は、入力する位置や桁数を自由に決められず、入力結果が勝手に表示され、さらに画面が勝手にスクロールします。
以前は、入力命令:?を使って、スクロールする画面の換算プログラムを作って、それを使っていました。しかし1画面で全ての換算結果を把握できるプログラムを使ってしまうと、もう元に戻れません。
CasioBasicには、入力ボックス相当のコマンドが準備されていません。そこで、Chapter 3 では、サブルーチンとして使い回しができる「入力ボックス」プログラムを作ります。
[追記]
この記事を書いた後、入力ボックスの処理速度向上のための修正を行っています。
速度向上ための具体的な修正内容については、Casio Basic入門32 から始まる Chapter 6 で紹介しています。最終的なプログラムはプログラムライブラリに収録しています。
Chapter 3-0
動作確認用メインルーチン CH3M
Chapter 3 では、メインルーチンと入力ボックスの両方を並行して作ることになります。
先ずは、以下のメインルーチンを入力して、準備して下さい。
プログラム名 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
プログラム名 CH3M の M は、メインルーチンの M です。プログラム終了は [AC] キーです。
さて、このメインルーチンから呼び出す「入力ボックス」のプログラム名を CH3-0S (ゼロ・エス)とします。末尾の S は、サブルーチンの S で、これがこれから作る入力ボックスです。いまの段階では、「入力ボックスプログラム: CH3-0S 」は、想定した機能を持つブラックボックスとして扱います。
話をメインルーチンに戻します。
Casio Basicでは、サブルーチンを呼びだす時は、プログラム名を指定します。具体的には CH3-0S を呼びだすために、
Prog "CH3-0S"
と書きます。
サブルーチンを呼びだす時、Casio Basicのコマンドのように引数を設定したり、戻り値を設定したりしたいところですが、残念ながらできません。一方で、Casio Basicでは、変数が全てのプログラムで共通して使えると言う性質を利用します。
メインルーチンで 変数 X に数値 123 を代入した後で入力ボックスを呼びだすと、呼びだされた入力ボックスでは 123 が代入された変数 X をそのまま使えます。
入力ボックスで変数 Z に 456 を代入してから終了すると、戻ってきたメインルーチンでは、456 が代入された変数 Z をそのまま使えます。そこで、引数として渡したい変数は入力ボックスを呼びだす直前に設定し、戻り値として受け取りたい変数は入力ボックスの直後に受け取るようにします。
メインルーチンプログラムの説明
[初期化処理]
初期表示を行います。
今は、1つだけしかないメニューを表示します。メニュー番号は0です。
Locate 1,1,"0:"
[メニュー番号取得]
このブロックでは、Getkey コマンドを使って、メニュー選択の処理をしています。
-1→M
Do
Getkey→K
K=25⇒1→M
LpWhile K=0
[0] キーが押されると、Getkey はキーコード 25 を返します。
そこで、キーコードが 25 の時、メニュー変数Mに、1を代入します。
キーが押されない間は、このDoループが回り続け、何かキーがおされたら、キーコードに応じた番号をメニュー変数Mに代入する動作をします。今後メニューを増やすときは、メニュー番号を2、3、...と増やします。
なお、-1→-M の初期化は重要です。
[0] キー以外が押されたときを考えます。何かキーを押してDoループから出てくると、[0]キーを押したときは M=0 になっています。しかし、[0]キー以外を押したとき、Mには何も代入されません。
もしMを初期化していないと、Mの値がどうなっているか全く不明です。他のプログラムを走らせた時にMを使っていれば、何かの値がMに入っています。プログラムが込み入ってくると、管理されない変数はバグの原因となります。Mを -1 で初期化すれば、M は -1 か 0 以外にはならず、完全に管理された状態になります。バグ予防措置として重要です。
[入力処理]
まだブラックボックス扱いですが、「入力ボックス」プログラム CH3-0S (ゼロ・エス)を呼び出します。メインルーチンと「入力ボックス」プログラムで、変数 X, Y, Z を共有させます(このように「入力ボックス」プログラムを作ってゆきます)。
CasioBasicでは、変数は全てのプログラムからアクセス可能なので、変数は共有されます。
X, Y は CH3-0S (ゼロ・エス)への引数、Z は CH3-0S (ゼロ・エス)からの戻り値として扱うことにします。
If M=0:Then
3→X:1→Y
Prog "CH3-0S" (ゼロ・エス)
Z→A
IfEnd
メニュー番号Mが0の時、If文による分岐処理を行っています。「入力ボックス」プログラム CH3-0S は、これから作ります。
「入力ボックス」プログラムでは、入力開始位置である X と Y が引き渡され、それに基づき動作します。動作が終了すると、入力結果が変数 Z に格納されているので、メインルーチンでは Z を変数 A に代入しています。Z は「入力ボックス」プログラムの中で使われる変数なので、次に入力ボックスを呼び出すと、その値は変更されます。従って、入力ボックスから戻ってきた直後に変数 A に代入しておきます。こうすれば、Z が変化しても問題ありません。
[出力処理]
メニュー番号に対応した内容を表示します。
If M=1:Then
Locate 3,2," " (スペース14個)
Locate 3,2,A
IfEnd
この出力は何度でも繰り返されるので、表示前にスペースで上書きして、前の出力を消去し、その後新たな表示を行っています。これまでにも使って来た手法です。
「入力ボックス」プログラムの作成準備
今回のメインテーマ「入力ボックス」プログラムの作成準備をします。
例えば、[2] [0] [1] [4] と順にキー入力した時、「入力ボックス」プログラムからの戻り値 Z をどのようにするか? を考えてみます。
1回のキー入力のたびに、Getkeyコマンドで取得したキーコードからキーの数へ変換します。
[2] が押された時、Z を 2 にします。続いて [0] が押された時、Z を20 とします。さらに [1] が押された時、Z を 201 とし、[4] が押されると、Z を 2014 とする...
キーが押されるたびに、Zを10倍してそれに新たな数を足して Z へ代入する、こうして正しく Z を得られそうです。
10Z+[新たな入力値]→Z
そして、キー入力時にリアルタイムで表示を更新するには、Z が更新されるたびに、Locateコマンドで Z を表示します。こうすると、キー入力時にリアルタイムで 表示に反映させられます。
入力開始位置の X と Y はマインルーチンから 入力ボックスへ渡されます。従ってZの表示は、
Locate X,Y,Z
で良いわけです。
さて、プログラム全体の構造を以下のように想定します。
「入力ボックス」プログラムの構造
[初期化処理]
[キーコードからキーの数への変換]
Lbl 0
[キーコード取得]
[戻り値 Z の算出と表示]
K≠47⇒Goto 0
[後処理]
Return
入力モードに入っている時は Lbl / Goto ループの中にあり、入力確定のために [EXE] キーを押すと、ループから抜けるようにします。 [EXE] のキーコードは 47 なので、キーコードが 47 でない時はループを継続して、47 の時ループから抜けます。
Lblb 0
[入力モードでの処理]
K≠47⇒Goto 0
次回は、具体的にプログラム CH3-0S を作ります。
つづく...
⇒ CasioBasic入門16 / 目次
応援クリックをお願いします。励みになるので...