Casio Basic入門15

Casio Basic入門
<目次>

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

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

前回: Casio Basic入門14 - Chapter 2

Chapter 3

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

Windows のエクスプローラで、ファイル名を変更する場合

InputBox 
このように、入力範囲が現れて、そこで入力や編集を行い、最後のEnterキーで確定します。

あるいは、以下のように最初から入力ボックスが表示されている場合もあります。

InpurBox2 

[ サンプル ] 入力ボックスをクリックするとカーソルが現れ、入力や編集を行い、入力ボックスの外側を適当にクリックすると内容が確定されます。


このような機能を使うことで有用なプログラムを簡単に作れるので、私は多くのプログラムを気楽に作っています。そこで、CasioBasic入門でも紹介しようと思います。


CasioBasicで入力ボックスを使いたい...これが Chapter 3 のテーマです。


CasioBasicでは、さすがにウィンドウ表示は無理ですが...

・入力範囲を表示する
・入力桁数を指定する
・入力と編集を行う
・[EXE]キーで確定する


これくらいの機能は、fx-5800P の遅いプロセッサでもなんとかなりそうです。


百聞は一見にしかず、でサンプルをみてもらいます。

今年の西暦年を 0.This Yr の右に入力しておき...
(今年 = This year

Birthday_1 
 
メニュー番号1の 1.Born in に生まれ年を入力するために、 [1] キーを押します。
(1970年生まれ = Born in 1970


すると、入力範囲が >>>> で表示され、入力モードに入ったことが分かります。

Birthday_2 

右下に、<EXE>:ENTER と表示され、入力モードであること、[EXE]キーで確定...とガイドがでます

ここで、テンキーを押せば自由に数字を入力でき、[DEL] キーで右から1文字づつ削除できて、入力内容の修正・編集ができます。


Birthday_3 

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


1988 で確定すると...

Birthday_4 

2.Age の項目に 26 と表示されます。
(年齢 = Age)

1988年生まれだと、2014年では 26歳だとわかります。
これは、機能面で言えば、一種の換算プログラムです。


次に、和暦と西暦を換算するプログラムです。

YearConv_2_convert_20140312192315.jpg 

項目が多いですね。

0:AD (西暦)
1:M (明治)2:T (大正)
3:S (昭和)4:H (平成)
5:At (この西暦では...) 6: y (この歳...)

1画面に、7項目を押し込んでいます。

和暦と西暦を換算するプログラムですが、おまけ機能として、項目5と6を追加しています。

各項目への入力は、上の例と全く同じです。

0:AD1990 と入力すると、明治、大正、昭和、平成の年が表示されます。
4:H に 2 と入力すると、西暦、明治、大正、昭和の年が表示されます。

どちらも表示結果は同じですが、1カ所を変更すると、残りの項目が連動して変化します。

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


この状態で、5:At に別の西暦を入力してみます。

YearConv_5_convert_20140312192414.jpg 

[5]キーを押すと、入力モードになって、4桁の入力範囲が示されています。
右下には 三角マークとE の表示がありますが、これも 確定を促すサインです。これが表示されていれば入力モードと言うわけです。


平成2年生まれの人は、東京オリンピック開催の2020年では...?

そこで、2020 と入力。

YearConv_6_convert_20140312192433.jpg 

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

YearConv_7_convert_20140312192456.jpg  

6:30y  と表示されました。

東京オリンピック開催時には30歳になっている、と教えてくれています。

項目 5:At に過去の西暦を入れたり、項目 6: y に過去の年齢を入れると、それぞれ過去の年齢や西暦が換算されるので、履歴書を書いたり、自分の過去の年を思い出すのに役立っています。

これも、一種の換算プログラムです。


「入力ボックス」サブルーチンの活用

上で紹介した2つのプログラムでは、入力ボックス機能として、全く同じサブルーチンを使い回しています。つまり、一旦このサブルーチンを作っておけば、入力モードについてはプログラミングの必要がありません。

これらのメインルーチンは、項目数が違っていて、具体的な計算(換算)は異なりますが、実はほぼ同じプログラム構造で作れます。換算プログラムを作るには、基本構造は同じなので、実際に考えるのは具体的な計算(換算)部分のみです。

自由自在に入力するための1つの方法として、このような「入力ボックス」サブルーチンを活用すれば、必要な換算プログラムを簡単かつ短時間で作れるます。そのメリットは大きいのではないでしょうか?


同じサブルーチンを使った他のプログラム事例をもう少し紹介します。


温度単位換算プログラム

摂氏温度(°C)、華氏温度(°F)、絶対温度(K)の換算プログラムです。

TempConv_1


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

TempConv_4 
アメリカ南部の夏の温度は、現地の天気予報を見ると100度とか105度と言っていますが、我々日本の温度では40度程度だと分かります。気温100度と聞いてビックリしますが、40度でも相当熱いですね...

絶対温度は、高校の物理や化学で初めて出てくると思いますが、理工系では必ず使う温度単位です。液体窒素でバナナを凍らせると釘が打てる....その液体窒素の温度は、絶対温度で77Kです。

TempConv_7 
換算結果を見ると、だいたい-196℃ だと分かります。感覚を超えた低い温度ですね。

画面の左下に <RCL> とありますが、[RCL]キーを押すと計算式を表示するオマケ機能です。

TempConv_16 


圧力単位換算プログラム

PressureConv_2 

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

PressureConv_4 
500psi は、他の単位では....

ちなみに、psi は、1平方インチあたりのポンド...なんとも分かりづらい単位です。  



入力ボックス・サブルーチン
各種換算プログラムへの適用


1画面に全ての項目が表示された換算プログラムは、どれか1つを変えると、他がどのように変わるのか?が1画面で把握できるので、非常に使いやすくなります。

ちなみに、CasioBasicの「入力命令:?」を使うと、このようなプログラムを作ることは困難です。入力命令:? は、入力する位置や桁数を自由に決められず、入力結果が勝手に表示され、さらに画面が勝手にスクロールします。

以前は、入力命令:?を使って、スクロールする画面の換算プログラムを作って、それを使っていました。しかし1画面で全ての換算結果を把握できるプログラムを使ってしまうと、もう元に戻れません。

CasioBasicには、入力ボックス相当のコマンドが準備されていません。そこで、Chapter 3 では、サブルーチンとして使い回しができる「入力ボックス」プログラムを作ります



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

プログラム名 CH3MM は、メインルーチンの 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 で初期化すれば、は -1 か 0 以外にはならず、完全に管理された状態になります。バグ予防措置として重要です。


[入力処理]
まだブラックボックス扱いですが、「入力ボックス」プログラム CH3-0S (ゼロ・エス)を呼び出します。メインルーチンと「入力ボックス」プログラムで、変数 X, Y, Z を共有させます(このように「入力ボックス」プログラムを作ってゆきます)。

CasioBasicでは、変数は全てのプログラムからアクセス可能なので、変数は共有されます。

X, YCH3-0S (ゼロ・エス)への引数、ZCH3-0S (ゼロ・エス)からの戻り値として扱うことにします。

If M=0:Then
3→X:1→Y
Prog "CH3-0S"
        (ゼロ・エス)
Z→A
IfEnd


メニュー番号の時、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] が押された時、Z2 にします。続いて [0] が押された時、Z20 とします。さらに [1] が押された時、Z201 とし、[4] が押されると、Z2014 とする...

キーが押されるたびに、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 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



カシオプログラム関数電卓 FX-5800P-Nカシオプログラム関数電卓 FX-5800P-N
(2006/09/22)
CASIO(カシオ)

商品詳細を見る



keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

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

コメントの投稿

非公開コメント

おもしろい

 これは活用の幅が広がりますね。

狙いはそこにあります

藤堂様

>  これは活用の幅が広がりますね。

はい、それが狙いです。

これまで、個人的に作って活用していましたが、fx-5800P の CasioBasicを使いこなすには、良いテーマだと思い、思い切って紹介することにしました。

入力ボックスを作る際、これまで紹介していないCasioBasicのコマンドやプログラミングの考え方も出てくるので、CasioBsic入門としても使えるテーマです。

お楽しみに...

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます

Re: 小数の入力及び表示

コメントありがとうございます。

少しはお役にたてているようで、うれしいです。


非公開でご質問頂いたので、お名前は伏せておきます。今後可能なら、ニックネームでも構いませんので、公開でコメント頂ければ幸いです。


> 質問が2つあります。
>
> 1 整数を入力、表示する方法はわかりましたが、小数を入力、表示さ 
>  せるスマートな方法ご教授いただけませんか?

はい、Casio Basic入門の次のテーマに予定しております。

実は自分で作った入力ボックスですが、その動作の遅さに満足できず、すこしでも速くなるように少し手を入れてみて、かなり速くなっています。これについては、プログラムライブラリで Ver 1.2 として公開しておりますので、とりあえずお使い頂けます。

現在公開しているのは、0以上の整数に対応した INPI です。0以上の小数に対応した INP や 正負小数に拡張した IN は、INPI よりもやることが多いので、Ver 1.2 と同じ対処方法では満足ゆかず、プログラムのロジックの見直しをしています。今のところかなり速くなったと思います。


次のテーマでは、0以上の小数対応の INP と 正負小数対応の IN も紹介できると思います。今も少しでも速くなるよう、色々検討中ですが、週1回の続編公開のペースで、その時がきたら、その時点で出来ている内容を紹介しようと思っています。

お待ち頂ければありがたいです


> 2 ループプログラム実行中の消費電力は通常よりも大きいのでしょう
>  か?

ループ実行中は、CPUがしっかりと仕事をしているので、待機状態に比べて消費電力は増している筈です。

但し、fx-5800P はかなりの低消費電力設計になっているようで、ループをガンガン回したプログラムを、それこそ終夜で動かしても、すぐにバッテリー切れになるようなことは、今のところ経験していません。

一方で、fx-9860GII は、特にオーバークロックが可能なので、オーバークロックでループをカンガン回すと、電池の消耗が顕著なようです。

fx-5800P も fx-9860GII もバージョンは異なりますが同じCasio Basicなので、ループでの消費電力増加は同じと思われますが、fx-5800Pでは、気になるほど顕著な電池の消耗はありません。


これからも、よろしく御願い致します。


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

やす (Krtyski)

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


プログラム関数電卓は、プログラムを作り・使ってナンボ!

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

おもしろい・役に立つならクリックしてください。励みになります。

人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR