Casio Basic入門51
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
修正 2016/07/17
修正 2016/07/17
4. CasioBasicを使ってみる(続き)
Chapter 9 - 初級
前回: Casio Basic入門50 を見る
◆ Chapter 9 の目標: 簡単な換算プログラム - 入力ボックスの活用
Chapter 9-1
fx-5800P で複利計算プログラムを作る
Chapter 7 から Chapter 8 では、fx-5800P で温度換算プログラムを作り、さらに当ブログオリジナルの汎用サブルーチン「入力ボックス 2.0」を使って、より使いやすいにプログラムに改造しました。そこで取り上げたプログラムは、わざわざ入力ボックス 2.0 を使わなくても、そこそこ使えるプログラムでした。
⇒ fx-5800P プログラムライブラリ - 入力ボックス
そこで、今回は入力ボックス 2.0 を使わなければ実現できない換算プログラムを、簡単に作ってみます。入力ボックスの使い方のツボも併せて紹介します。
後半は、桁数の大きな数を3桁区切りで表示する機能を追加してみます。
▋プログラムのコンセプトと画面構成
今回作ってみるのは、複利計算プログラムで、ローンを借りる時、元金、利率(年利)、返済期間(年)を入力すると、返済総額、月々返済額を表示します。
画面構成を示します。以下は実際に作ったプログラムの画面ですが、作る前は頭の中でこの画面構成を想像することから始まります。何度もプログラムを作っていると、さほど難しいことではないと思います。

ここでは、16桁 x 4行の画面に収めるために、各項目を省略記号で表示します。あとで簡単に分かる記号なら何でも良いのですが、ここは私の好みで以下のようにしてみました。
1-C: (元金) ... Capital から C としました。
2-R: (年利、%) ... Interest Rate から R としました。
3-Y: (返済期間、年) ... Year から Y としました。
TOTAL (返済総額)
MONTH (月々返済額)
例えば、1400万円のローンの場合、
1) 年利1.2%、返済10年
2) 年利0.95%、返済8年
の比較をしてみると、以下のような結果になります。


このプログラムは、画面スクロールしないので、元金、年利、返済期間のどれかを変更すると、返済総額や月々返済額がどのように変わるかが、見やすいことがポイントです。
1-C: (元金)は、9桁を最大としていますが、10億円で9桁なので十分でしょう。[1]キーを押すと9桁の入力ボックスが現れ、そこに 14000000 を入力します。
2-R: (年利、%) を 1.2 から 0.95 に変える場合、[2] キーを押すと、入力ボックス >>>> (4桁) が現れ、そこに 0.95 と入力しますが、ここでは画面構成が崩れず、画面がスクロールしません。これが、入力ボックスを使うメリットです。Casio Basic の旧来の命令(入力命令 ? や出力命令 ◢)を使えば、必ず画面スクロールするので、変化を比較しにくくなります。

ちなみに、旧来の命令を使うと入力時にスクロールして画面構成が崩れる実例、その対応について以下で具体的に紹介しています。
⇒ Casio Basic入門43
旧来の命令は多彩な機能が盛り込まれていて利便性が高いので、プログラミングが楽になりますが、画面構成を自分で思い通りにできません。そこで、Casio BasicのBasicコマンドを使うことで、旧来の命令を置き換えられることを上記の記事から始まる Chapter 8 で紹介しています。余裕があれば、一度ご覧ください。
ここでは、ファイル名を COMPINT とします。 「複利」は、Compound Interest なので、 COMP + Int で COMPINT です。
FUKURI など好きなプログラム名で大丈夫です。
▋変数を決める
さて、このプログラムで使う変数を決めます。
1-C: (元金)に、変数 C を使おうと思ったのですが、変数 C は入力ボックスが動作するとその値が変化するので、別の変数にする必要があります。そこで、借入金 = Borrowed Money なので、変数 B を使うことにします。
fx-5800P プログラムライブラリ - 入力ボックス を参照すれば、このように変化する変数を書いてありますので、参考にしてください。
2-R: (年利、%)には、そのまま R を使うことにします。
3-Y: (返済期間、年)に Y を使おうと思いましたが、変数 Y は入力ボックスの表示位置を指定するために使うので、代わりに N を使うことにします。
以上、1 ~ 3 は、[1] ~ [3] キーで入力項目を選びます。
TOTAL (返済総額)には、T を使うことにします。
MONTH (月々返済額)には、M を使うことにします。
▋複利計算方法
本来なら、ボーナス払いなどを含めると現実的なプログラムになりますが、ここでは簡単にするために均等払いを前提にします。
また、実際のローン契約には、金利以外に種々な手数料があって、それらを含めた実質金利が使われますが、プログラムを簡単にするために、表面金利で計算を簡単にします。
最も簡単な複利計算は、
返済総額 T = B x (1 + R/100)N
となり、これを採用します。但し円単位なので、小数以下は切り捨てにすることにします。
Casio Basic では、以下のようにして T を計算します。
Int(B(1+R÷100)^(N))→T
月々返済額 M = T/N/12
なので、Casio Basic では、以下で M を計算します。これも円単位なので、小数以下は切り捨てます。
Int(T÷N÷12)→M
この複利計算プログラムは、条件を色々と変えてみて、自分に合った総額や毎月の負担を概算比較するのが目的なので、正確さよりもわかりやすさを優先させます。従って、小数点以下を切り捨てて問題無いと決めます。切り捨ての代わりに四捨五入でも良いと思いますが、少数ではなくて整数を表示することを優先させることにします。
▋プログラム構造
プログラム全体の方針として、以下のプログラム構造で作り始めることにします。
[初期画面表示]
[変数の初期化]
Do
[入力]
[計算と数値表示]
LpWhile 1
▋具体的なプログラミング
では、上のプログラム構造で具体的に作ってみましょう。
▍初期画面表示
以下のような画面を初期表示します。

Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"
特に難しいところは無いと思います。
▍変数の初期化
変数 B、R、N、T、M を全て 0 で初期化します。
0→B:0→R:0→N:0→T:0→M
▍入力
おそらく、ここが今回のプログラムの中心になると思います。
この部分のプログラム構造を決めます。
[入力したキーを調べる]
If 押したキーが[1]ならば
1-C: の右に9桁の入力ボックスを表示し、入力値を変数 B に格納する
Else If 押したキーが[2]ならば、
2-R: の右に4桁の入力ボックスを表示し、入力値を変数 R に格納する
Else If 押したキーが[3]ならば、
3-Y: の右に3桁の入力ボックスを表示し、入力値を N に格納する
IfEnd:IfEnd
IfEnd
▶ 入力したキーを調べる
Getkey コマンドを使って、押したキーのキーコードを調べれば良いので、以下のようにします。
0→K:Do
Getkey→K
LpWhile K=0
何もキーが押されない時は、Getkey は 0 を返すので、変数 K は 0 のままで、K が 0 であれば Do ループを継続します。
従って、この Do ループに入る前に、K を 0 で初期化しておく必要があります。
何かキーが押されたら、K にはそのキーのキーコードが入り、K が 0 でなくなるので、Do ループを終了して、プログラムは下へ進みます。
⇒ Casio Basic コマンドリファレンス - Getkey
▶ 入力されたキーに従って、数値を入力させる
fx-5800P では、[1]キーのキーコードは 35、[2]キーのキーコードは 36、[3]キーのキーコードは 37 です。
従って以下のコードになります。
If K=35
Then
[1-C: の右に9桁の入力ボックス]
Else If K=36
Then
[2-R: の右に4桁の入力ボックス]
Else If K=37
Then
[3-Y: の右に3桁の入力ボックス]
IfEnd:IfEnd
IfEnd
ここで使う入力ボックスは、0以上の少数入力に対応した INP を使うことにします。
fx-5800P プログラムライブラリ - 入力ボックス 参照。
入力ボックスの使い方は、、
[入力ボックスの表示位置、桁数、インジケータの設定]
Prog "INP"
[入力値の取得]
となります。
入力ボックスの表示位置は、変数 X と Y で指定します。
入力ボックスの桁数は、変数 D で指定します。
入力ボックスのインジケータの種類は、変数 E で指定します。
そして、入力ボックスで入力された値は変数 Z に格納されているので、Zの値を それぞれ変数 B, R, N に代入します。
⇒ Casio Basic コマンドリファレンス - Prog
具体的には、以下になります。
▶ 1-C: の右に9桁の入力ボックス
5→X:1→Y:9→D:1→E
Prog "INP"
z→B
▶ 2-R: の右に4桁の入力ボックス
5→X:2→Y:4→D:1→E
Prog "INP"
Z→R
▶ 3-Y: の右に3桁の入力ボックス
14→X:2→Y:3→D:1→E
Prog "INP"
Z→N
以上をまとめると、入力ブロックは以下になります。
0→K:Do
Getkey→K
LpWhile K=0
If K=35
Then
5→X:1→Y:9→D:1→E
Prog "INP":Z→B
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd
▍計算と数値表示
返済総額と月々返済額の計算は、上で紹介しています。
その結果を表示するには、既に表示されている数値をスペースで上書きして消した後、表示します。
Int(B(1+R÷100)^(N))→T
Locate 7,3," " (スペース9個)
Locate 7,3,T
Int(T÷N÷12)→M
Locate 7,4," " (スペース9個)
Locate 7,4,M
但し、これだけだとたまにエラーが発生します。
返済期間 N が 0 の時、T÷N÷12 の計算で、0で割り算するエラーです。
そこで、N が0の時は、上の計算を行わないようにすれば良いですね。
さらに、3つの条件、つまり 元本 B、年利 R、返済期間 N のいずれかが 0 (ゼロ)の時は、上の計算と表示を行わない方が良いと思います。
というのも、プログラムを起動した直後は、3つの条件全てが空欄になっていて、順に入力してるとき、空欄が1つでもあれば、TOTAL と MONTH に表示しないのが良いでしょう。そこでプログラムを変更してみます。
色々な方法がありますが、記述量の少ない方法の1つとして、B、 R、N のいずれかが 0 でない時、言い換えれば B x R x N が 0 でない時に、計算と表示を行うようにプログラムを変更します。
BRN が 0 でない時 [...] を実行させるのは、
If BRN
Then
[...]
IfEnd
と書けば良いですね。
If の後に来るのは判定条件ですが、[判定条件] が正しい時、あるいは 0 でない時に、Then 以下を実行するのが、If 文の仕様です。
計算と数値表示のブロックは以下のようになります。
If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3," " (スペース9個)
Locate 7,3,T
Int(T÷N÷12)→M
Locate 7,4," " (スペース9個)
Locate 7,4,M
IfEnd
▋目標のプログラム
目標のプログラムが完成しました。
ファイル名: COMPINT
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"
0→B:0→R:0→N:0→T:0→M
Do
0→K:Do
Getkey→K
LpWhile K=0
If K=35
Then
5→X:1→Y:9→D:1→E
Prog "INP":Z→B
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd
If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3," " (スペース9個)
Locate 7,3,T
Int(T÷N÷12)→M
Locate 7,4," " (スペース9個)
Locate 7,4,M
IfEnd
LpWhile 1
今回の複利計算プログラムも換算プログラムの一種です。換算プログラムは、だいたい似たようなプログラム構造で書けます。
逆に言えば、今回のように大まかなプログラムの構造を考え、それに従って細かいところを書けば、換算プログラムは慣れれば色々と作りやすいと思います。
入力ボックスの利点と注意点もお分かりだと思います。
▋仕上げ
実は、fx-5800P を持っている知り合いがローンの組み替えを検討していたので、そのために作ったものです。
基本的な機能には関係ありませんが、ちょっとだけ変更して、仕上げを行いました。
まず、[EXIT] キーを押してプログラム終了できるようにしました。これはご本人の希望でした。ついでにプログラム終了時に、画面に BYE! と表示するようにしてみました。
このプログラムでは、Getkey でキーコードを取得しているので、[EXIT] キーを押せば、そのキーコード(73)を取得して、変数 K に格納されています。
[以下 2016/07/18 修正]
これを利用して、K=73 の時、Do ループから外へ抜けるようにします。
入力したキーを調べる内側の Do ループの直後に、
K=73⇒Break
を追加します。K が 73 の時は、強制的に Do ループから抜けて、一番下の LpWhile 1 の次までジャンプします。
そして、最後の LpWhile 1 の下に、一旦画面をクリアして (Cls) から、BYE! を表示するように追加しました。
ファイル名: COMPINT
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"
0→B:0→R:0→N:0→T:0→M
Do
0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break
If K=35
Then
5→X:1→Y:9→D:1→E
Prog "INP":Z→B
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd
If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3," " (スペース9個)
Locate 7,3,T
Int(T÷N÷12)→M
Locate 7,4," " (スペース9個)
Locate 7,4,M
IfEnd
LpWhile 1
Cls
Locate 7,2,"BYE!"
これで、fx-5800P で動作する複利計算プログラムができました。
ボーナス払いなどの場合に対応するなど、改造してみては如何でしょうか?
次回は、このプログラムをさらに見やすくなる工夫をしてみようと考えています。
つづく...
⇒ Casio Basic入門52 / Casio Basic入門G01 / 目次
応援クリックをお願いします。励みになるので...
- 関連記事
-
-
Casio Basic入門3 2016/12/17
-
Casio Basic入門52 2016/07/17
-
Casio Basic入門51 2016/07/17
-
Caso Basic入門G14 2015/11/03
-
Casio Basic入門G13 2015/11/03
-