Casio Basic入門41

Casio Basic(超)入門
<目次>

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

2015/02/21
2015/03/01 修正


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


Chapter 7  - 初級

前回: Casio Basic入門40


◆ Chapter 7 の目標: ゼロからのプログラム作成と機能追加

前回は、摂氏温度、華氏温度、絶対温度の間で換算するプログラムを作りました。

プログラム TC3

"1:°C"
"2:°F"
"3: K"
"INPUT MENU N°"?→M

Cls
If M=1:Then
"°C"?C
(9÷5)C+32→F
C+273.15→K
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
Else If M=3
Then
"K"?K
K-273.15→C
(9÷5)C+32→F
IfEnd:IfEnd
IfEnd

Cls
"1:"
"2:"
"3:"
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"


このプログラムの構成は、

メニュー選択させた後、それぞれ
 1) 入力: 数値を入力させ
 2) 計算: 計算して
 3) 出力: 結果を表示する

と、なっています。

このプログラム TC3 を使っていて、たまに妙なバグが発生することがあります。

TC3 を起動すると、以下のメニュー画面が表示されます。

TC3-2 

メニュー番号1~3 を入力すべきところ、138 と入力して、

TC3-4 

ここで、[EXE] で入力確定すると、 

TC3-3 

摂氏 0 ℃、華氏 -1℃、絶対温度 10K となってしまい、これは絶対に間違った表示なので、バグと言えます。そもそもメニュー番号を間違って入力したのがいけないので、バグがあっても自分で正しく使えば良いのです。

今回のケースでは明かにバグと分かる表示ですが、これが正しい値ではないけれど、それに近い間違った表示だった場合、換算プログラムとしてはマズイし、プログラムが想定外の動作をするのは気持ちが悪いので、原因を調べて、簡単に修正できれば修正しようと思います。



Chapter 7-4
バグの原因と対処 - フラグの利用

問題の原因を探すために、プログラムは上から下へ順に実行されると言う基本に従って、作ったプログラムを上から順に追いかけて、詳細にシミュレーションしてみます。

"1:°C"
"2:°F"
"3: K"
"INPUT MENU N°"?→M


ここまでは問題ない筈です。メニューが表示されてキー入力待ちになっています。

ここで、138 と入力して [EXE] を押すと、M138 が代入されます。

すると、先ず Cls で画面表示が消去され、内部カーソル行がリセットされて 1 行目になります。これに続部分で If から IfEnd までは、M138 だと言う条件に合わないので、何も実行されません。

Cls
If M=1:Then
"°C"?C
(9÷5)C+32→F
C+273.15→K
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
C+273.15→K
Else If M=3
Then
"K"?K
K-273.15→C
(9÷5)C+32→F
IfEnd:IfEnd
IfEnd


ここまでは、問題無さそうです。この後に以下のコードが続きます。

Cls
"1:"
"2:"
"3:"
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K

Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"


最初の4行は、特に問題なく表示されます。その下の Locate を使った3行(赤文字で示している部分)を調べます。

TC3-3 

問題が発生する時には、このように表示されるのですから、変数 C に 0変数 F に -1変数 K に 10 が格納されていることになります。この3行の Locate を使ったプログラムは正常に動作していて、変数が異常になっていることが疑われます。

そこで、この推測を検証するために、敢えて以下のコードをプログラムの先頭、つまり "1:°C" の上に追加してみてください。

0→C:-1→F:10→K

これを実行します。最初に表示されるメニュー画面で 138 と入力して [EXE] を押すと、上と同じ表示になりました。バグに再現に成功しました。これで、変数に格納されている数値に異常があったことが確認されました。

次に、なぜ変数の異常が発生したのかを調べます。

fx-5800P はプログラムTC3 を走らせるだけでなく、普通に電卓として使ったり、他のプログラムを実行して使います。すると、変数 C、F、K に何かの値が格納される可能性があります。するとTC3を起動した時、変数 C0F-1K10 が格納されている可能性が確かにあります。これらの変数に別の数値が格納されている可能性だって十分にあります。

そして、メニュー番号の入力で 1~3 以外にすると、メニュー番号に応じた処理がまるまる飛ばされるので、本来 C、F、K に新たに値が代入される機会がないまま、これらの変数に格納されている値が Locate コマンドで表示されてしまいます。これがバグの原因です。

Casio Basic のコマンドに、ClrMemory コマンドがあります。プログラムの冒頭でこれを実行するとどうなるでしょうか?

ClrMemory を入力するには、
[FUNCTION] [6] (6:CLR) と入力して CLRメニューから [2] (2:Memory) を入力します。

ClrMemory は、全ての変数に 0 を代入するコマンドです。言い換えれば全ての変数を 0 で初期化します。

TC3-5 

すると、変数 C、F、K0 が格納されます。そして、今回のバグの条件、つまりメニュー番号入力で 1 ~ 3 以外の数を入力すると、以下のような表示になります。

TC3-6 

これも間違った表示ですね。つまり、ClrMemory ではバグ対策にはなりません。


そこで、メニュー番号入力で、1 ~ 3 の入力があったときだけ、つまり変数 C、F、K に正しい値が代入された時だけ、これら変数をを表示させるようにします。

具体的には、正しいメニュー番号を入力して、メニュー番号に応じた処理が実行された時だけ、

Locate 4,1,C
Locate 4,2,F
Locate 4,3,K


の3行を実行させ、そうでない時はこの3行を実行させない方法を考えます。

これを実現するためには、幾つかの方法が考えられます。
今回は、新しい変数 A を導入した上で、以下のようにします。追加した部分を赤文字で示します。

0→A
"1:°C"
"2:°F"
"3: K"
"INPUT MENU N°"?→M

Cls
If M=1:Then
"°C"?C
(9÷5)C+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
(9÷5)C+32→F
1→A
IfEnd:IfEnd
IfEnd

Cls
"1:"
"2:"
"3:"
If A=1: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"


この変更では、変数 A を追加し、プログラム開始時に A0 を入れておきます。そして、正しくメニュー番号を入力して、メニュー番号に応じた処理を行った時にだけ A1 を入れるようにします。変数 C、F、K の値を表示する Locate コマンドを使った3行は、If A=1 による条件判断で、A が 1 の場合に、この3行を実行します。

このような方法は、Casio Basic に限らずあらゆるプログラミング言語で一般的に使われます。変数 A を「フラグ」と呼びます。フラグ (flag) =旗 です。何かの条件を満たす時旗を揚げ、そうでない時は旗を下げます。そしてこの旗が上がっているか上がっていないかで、処理の分岐を行うと言うテクニックです。

旗を揚げることを「フラグを立てる」と言います。フラグには変数を用いて、フラグが立っていない時は 0 としておき、フラグを立てると 0 以外の値にするのが一般的です。

上のプログラムでは、フラグの変数を A としてい、以下のような If 構文を使っています。

If A=1:Then
<フラグが立っている時の処理>
IfEnd


ところで、この処理は以下のようにしても正しく動作します。

If A:Then
<フラグが立っている時の処理>
IfEnd


Casio Basic コマンドリファレンス - If 文 でも説明しているように、If の条件判定に変数だけを使うこともできます。

変数 A0 の時 If A は「」、つまり条件に合わない、と判定し、A0 以外の時 If D は「」、つまり条件に合う、と判定するのです。If の条件判断に変数を指定できるのです。

この仕様は、一般に多くのプログラミング言語で採用されているもので、Casio  Basic でも、この一般的な仕様を採用しています。Casio Basic が登場する前のカシオのプログラム電卓には無かった仕様で、新世代 Casio Basic は、しっかりした言語だと言えます。

そこで、値の表示を行う上記3行のコードを、以下のように記述できます。

If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd


If A という記法は他の言語でも一般的に使えるので、覚えて損はありません。

この記法には、もう一つの利点があります。fx-5800P は処理速度が遅いので、色々とプログラムを作るようになると、処理を速くしたいことが必ずあります。If A は If A=1 に比べて処理速度が2倍以上速いので、役立ちます。
 ⇒ fx-5800P:変数アクセス、比較・論理演算、条件分岐の速度比較


では、プログラム名を TC3 から TC4 に変更した後、上記の変更を行います。

COMPモード[MODE] [5] (5:PROG) と入力して、Program Menu に入ります。

Program Menu 

ここで、[3] (3:Edit) を入力して、Prog Edit 画面に切り替え、TC3 にカーソルを合わせます。

Prog Edit TC3 

ここでファイル名 TC3 から TC4 に変更してみます。

Prog EditTC3 にカーソルが合っている状態で、[FUNCTION] を押すと、File Commands メニューが現れます。

File Commands 

ここで、[2] (2: Rename) を入力し、File Name? 画面に切り替えます。

File Name TC3 


この状態では、画面上部に A アイコンが表示されていることからも分かるように、アルファベットモードになっています。[ALPHA] キーを押して、アルファベットモードを解除してから、末尾の 3 を消去して 4 に変えます。

File Name TC4 

[EXE] で確定し、Prog Edit 画面へ戻ります。

Prog Edit TC4 

[EXE] で確定すれば、プログラム編集画面が開きます。

TC4-1 

あとは、コードを変更します。以下に従ってプログラムを修正しましょう。

プログラム TC4
0→A
"1:°C"
"2:°F"
"3: K"
"INPUT MENU N°"?→M

Cls
If M=1:Then
"°C"?C
(9÷5)C+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
(9÷5)C+32→F
1→A
IfEnd:IfEnd
IfEnd

Cls
"1:"
"2:"
"3:"
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"

これで、バグの修正ができました。追加部分を赤文字で示しています。



今回は、フラグと言う考え方を紹介し、想定外の入力に対してでも異常動作しないようにバグを修正しました。
プログラムには正解が1つあるものではありません。正しく動けば正しいプログラムです。色々な流儀や好みもあります。

プログラムをブロック構造にしておき、追加や変更するブロック以外には手を付けずそのまま残しておけるのが、バグの出にくいプログラムと言えます。今回紹介したようなフラグの使い方は、変更時にもバグの出にくいテクニックとして紹介しました。

これで、十分実用的なプログラムが完成しました。表示の一部と計算を変更すれば、様々な換算プログラムを作れるようになったと思います。TC4 を改造したり流用して、色々なプログラム作りに挑戦してみてください。

次回は表示を少し変更してみます。

TC4 起動時の画面は以下のようになります。

TC4-2 

これを、下の写真のような換算結果画面と同じ画面構成に変更しようと思います。

TC4-4 


次回までに、ご自分で改造に挑戦してみてください。



つづく...

Casio Basic入門42 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ

 


keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓、温度換算

リンク集 | ブログ内マップ



関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

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

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

人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR