Casio Basic入門40
Casio Basic(超)入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
2015/02/21 修正
2015/02/21 修正
4. CasioBasicを使ってみる(続き)
Chapter 7 - 初級
前回: Casio Basic入門39
◆ Chapter 7 の目標: ゼロからのプログラム作成と機能追加
前回は、摂氏から華氏、華氏から摂氏を選んで温度換算するプログラムを作りました。
プログラム TC2
"1:°C"
"2:°F"
"INPUT MENU N°"?→M
Cls
If M=1:Then
"°C"?C
(9÷5)C+32
Else If M=2
Then
"°F"?F
5(F-32)÷9
IfEnd:IfEnd
このプログラムの構成は、
メニュー選択させた後、それぞれ
1) 入力: 数値を入力させ
2) 計算: 計算して
3) 出力: 結果を表示する
と、なっています。
Chapter 7-3
選択肢3つの換算プログラムに拡張する
これまでのプログラムでは、最後に計算を行った結果が表示されると言う Casio Basic の性質を利用しています。
ところが、絶対温度を計算して表示させる機能を追加することを考えてみると、3つの温度単位のうちどれか1つで温度値を入力した後、残り2つの単位の温度値を表示しなければなりません。今のままだと、最後に計算した値しか表示されないので、うまくゆきません。そこで、計算した結果を変数に入れておき、計算が終わった後、改めて変数を表示するようにすれば、2つの値を表示できます。
この作戦に沿って、前回のプログラムを変更して、摂氏温度と華氏温度の両方を表示するように変更してみます。追加した部分を赤文字で示します。
"1:°C"
"2:°F"
"INPUT MENU N°"?→M
Cls
If M=1:Then
"°C"?C
(9÷5)C+32→F ・・・(1)
Else If M=2
Then
"°F"?F
5(F-32)÷9→C ・・・(2)
IfEnd:IfEnd
Cls ・・・(3)
"1:°C"
"2:°F"
Locate 6,1,C
Locate 6,2,F
変更部分の説明
(1)
摂氏から華氏温度へ換算した結果を変数 F に代入(格納)しておきます。
(2)
華氏から摂氏温度へ換算した結果を変数 C に代入(格納)しておきます。
(3)
一旦画面を消去し、内部カーソル行をリセットして1行目に戻します(Cls の仕様)。
次に、プログラムの最初と同じ表示を行います。
1:°C
2:°F
最後に、Locate コマンドを使って、この2行の右へ、それぞれ摂氏温度と華氏温度を表示します。
Locate コマンドは、画面内の好きな位置へ表示を行えるものです。出力命令" " との最大の違いは、表示位置の柔軟性が高いことにあります。
命令とコマンド
これまで、?(入力)命令、" "(出力)命令、Cls コマンドが出てきて、そして今回は Locate コマンドが出てきました。
命令とコマンドは、同じ意味ですが敢えて使い分けています。
Casio プログラム電卓で以前から有ったもので、新世代 Casio Basic でも残っているものを「命令」と呼ぶことにしています。
そして、Basic としてのものを「コマンド」と呼ぶことにしています。
旧来の命令
Chapter 7 では、以前からある「命令」を使うことで、シンプルなプログラムを作ることを優先させています。旧来の「命令」は、これまでに見てきたように、多彩な機能を内蔵しています。それを理解すれば、簡単なプログラムがとてもシンプルに作れることを、既に体験してもらっています。
Casio によれば、旧来の命令に慣れ親しんだユーザーの利便性を考えて、新世代 Casio Basic でも旧来の命令を残しているとのことです。私がこれまで調べてきた結果、旧来の命令の利便性を最もよく考えられているのが fx-5800P です。一方で、高機能で高価なグラフ関数電卓(fx-9860GII、fx-CG20/10)や fx-FD10 Pro では、旧来の命令は残っているものの、その詳細な機能は fx-5800P とは異なっていて、使いづらくなっています。私が自作プログラムを使うために fx-5800P を愛用している理由の1つが、旧来の命令の利便性が高い点にあります。詳しくは以下のエントリーをご覧ください。
⇒ (参考) fx-9860GII への移植 - 厄介な旧来の命令
話を元に戻します。
Locate の書式は、以下のようになります。
Locate [桁],[行],[表示内容]
・3つのパラメータ(引数)をコンマ , で区切って記述
・[桁] は、画面左端が 1、右端が 16 で、1~16 のいずれかの数
・[行] は、画面上端が 1、下端が 4 で、1~4 のいずれかの数
・[表示内容] には、文字列、数値、変数、式、戻り値のあるコマンド(Getkey)のいずれも設定できる
文字列を設定する場合は、" " の中に表示したい文字列を記述する。
※ 文字列表示の時の " " の中以外でスペースを入れるとエラーとなる。
※ 表示結果が、16桁、4行を超える場合はエラーとなる。
⇒ Casio Basic コマンドリファレンス - Locate
例えば、
"1:°C"
"2:°F"
Locate 6,1,C
Locate 6,2,F
を実行すると、Locate コマンドは、6桁目、1行目から変数 C に格納(代入)されている内容を表示します。
例えば、C に 38 が、F 100.4 が格納されている時、以下のように表示されます。
16桁x4行の画面
1 | : | ° | C | 3 | 8 | ||||||||||
2 | : | ° | F | 1 | 0 | 0 | . | 4 | |||||||
6桁目
実際の表示は以下のようになります。
1:°C 38
2:°F 100.4
こうしてみると、数値の後ろに単位(°C や °F)を表示したくなります。
そこで、Locate コマンドを使って、そのように表示を変更してみます。
"1: °C" (スペース11個)
"2: °F" (スペース11個)
Locate 4,1,C
Locate 4,2,F
16桁X4行の画面
1 | : | 3 | 8 | ° | C | ||||||||||
2 | : | 1 | 0 | 0 | . | 4 | ° | F | |||||||

この方が、自然な感じになります。
ここまでで、TC2 のプログラムをまとめます。
プログラム TC2
"1:°C"
"2:°F"
"INPUT MENU N°"?→M
Cls
If M=1:Then
"°C"?C
(9÷5)C+32→F
Else If M=2
Then
"°F"?F
5(F-32)÷9→C
IfEnd:IfEnd
Cls
"1:"
"2:"
Locate 4,1,C
Locate 4,2,F
Locate 13,1,"°C"
Locate 13,2,"°F"
TC2 を修正した目的は、複数の結果を表示させることでした。2つの温度を表示できたので、これを3つに増やすのは簡単です。
TC2 のプログラムを改造して、摂氏、華氏、絶対温度を換算するようにします。このプログラムを TC3 とします。
絶対温度を格納(代入)する変数を K とします。絶対温度 K は 摂氏温度 C と次の関係にあります。
C+273.15=K
或いは、
K-273.15=C
換算には、これらの式を使います。
さて、いきなり結論! 絶対温度を追加した換算プログラム TC3 を以下のようにしました。追加した部分を赤文字で示します。
プログラム 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"
プログラム TC3 の説明
メニュー選択
"1:°C"
"2:°F"
"3: K"
"INPUT MENU N°"?→M
赤文字部分を追加しただけです。メニュー選択では、1、2、3 のいずれかを入力することになります。
なお、追加した部分で、K の前にスペースを1つ入れて、単位のアルファベットが揃えています。
16桁x4行の画面
1 | : | ° | C | ||||||||||||
2 | : | ° | F | ||||||||||||
3 | : | K | |||||||||||||
?(入力)命令による入力待ちになり、プログラムはここで一旦停止して、以下のような表示になります。

メニュー番号に応じた換算
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
・M=1 つまり摂氏温度入力時は、華氏温度に加えて絶対温度を計算します。
・M=2 つまり華氏温度入力時は、摂氏温度に加えて絶対温度を計算します。
・M=3 つまり絶対温度入力時は、摂氏温度と華氏温度を計算します。
これらの計算を追加しています。
ところで、M の値による分岐処理を行う If 構文は、If が3つ使われているので、IfEnd も同数の3つ必要です。M=3 の時の Else If を1つ追加しているので、IfEnd も1つ追加しています。
If M=1:Then
[計算]
Else If M=2
Then
[計算]
Else If M=3
Then
[計算]
IfEnd:IfEnd
IfEnd
さて、この If 構文の構造は、上のような色分けで分かると思います。
赤のIf / Then / Else / IfEnd が一番外側にあって Else の中の処理に、緑の If / Then / Else / IfEnd が入っていて、さらに緑の Else の中の処理に、青の If // Then / IfEnd が入っています。
以下のようにスペースを入れて記述するとエラーになりますが、敢えてこのように書くと、3つの If 構文の入れ子構造が分かると思います。、
If M=1:Then
[計算]
Else
If M=2:Then
[計算]
Else
If M=3:Then
[計算]
IfEnd
IfEnd
IfEnd
但し、プログラムを書くたびに、このような入れ子構造を意識するのは面倒です。単純に If の数と IfEnd の数が同じになるようにするだけで良く、どの If と どの 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"
摂氏温度 38 ℃を入力した時、F は 100.4、K は 311.15 になるので、その時の表示は以下のようになります。
16桁X4行の画面
1 | : | 3 | 8 | ° | C | ||||||||||
2 | : | 1 | 0 | 0 | . | 4 | ° | F | |||||||
3 | : | 3 | 1 | 1 | . | 1 | 5 | K | |||||||

この表示を行った後、プログラムは終了します。
ところで、COMPモードで [FILE] キーによる Prog List から TC3 を実行すると、プログラムが終了しても、[EXE] キーを押すことで同じプログラムが再起動するので、TC3 を繰り返し実行できます。この場合、プログラムを終了させて、COMPモードの画面に戻るには [AC] キーを押します。
以上で、摂氏温度、華氏温度、絶対温度 の換算プログラムが一応完成しました。
?(入力)命令、→(代入)命令、Cls コマンド、Locate コマンドだけでも、実用的な換算プログラムができました。温度換算以外にも、長さや重さなどの換算プログラムを作ってみると面白いと思います。
ところで、このプログラムにはチョット気になる点があります。
普通に電卓を使ったり、他のプログラムを実行させた後に、今回のプログラムを使うと妙な表示になることがあります。
TC3 を起動すると、以下の画面になります。

そしてメニュー選択では、1、2、3 のいずれかを入力します。摂氏 38° と入力するつもりが、摂氏入力のための 1 と、温度の 38 を一気に入力、つまり 138 と入力してしまうことがありました。メニュー選択で 1~3 以外の数字を入力したわけです。
すると、以下のような表示になり、異常に気付きました。

これは、どう考えても換算値として異常ですのでバグと言えます。正しく入力しないことが原因なのは確かです。自分で作って自分で使うならば、使い方に気をつければ良いので、気にしないでも良いのかも知れません。
但し、このバグの原因は知っておいた方が良いでしょう。次回はバグの原因と修正について説明するので、一度ご自分でデバッグに挑戦してみてください。
自分で使うだけでは、大した問題にならない今回のバグも、原因を探してそれを修正する経験が、プログラミングの理解を深めると思います。
つづく...
⇒ Casio Basic入門41 / 目次
応援クリックをお願いします。励みになるので...
- 関連記事
-
-
Casio Basic入門42 2015/03/01
-
Casio Basic入門41 2015/02/21
-
Casio Basic入門40 2015/02/13
-
Casio Basic入門38 2015/02/11
-
Casio Basic入門39 2015/02/06
-