Casio Basic入門51

Casio Basic入門
<目次>

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

修正 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 を使わなければ実現できない換算プログラムを、簡単に作ってみます。入力ボックスの使い方のツボも併せて紹介します。



プログラムのコンセプトと画面構成

今回作ってみるのは、複利計算プログラムで、ローンを借りる時、元金、利率(年利)、返済期間(年)を入力すると、返済総額、月々返済額を表示します。

画面構成を示します。以下は実際に作ったプログラムの画面ですが、作る前は頭の中でこの画面構成を想像することから始まります。何度もプログラムを作っていると、さほど難しいことではないと思います。

CompInt_1 

ここでは、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年
の比較をしてみると、以下のような結果になります。

CompInt_8 CompInt_13 

このプログラムは、画面スクロールしないので、元金、年利、返済期間のどれかを変更すると、返済総額や月々返済額がどのように変わるかが、見やすいことがポイントです。

1-C: (元金)は、9桁を最大としていますが、10億円で9桁なので十分でしょう。[1]キーを押すと9桁の入力ボックスが現れ、そこに 14000000 を入力します。

2-R: (年利、%) を 1.2 から 0.95 に変える場合、[2] キーを押すと、入力ボックス >>>> (4桁) が現れ、そこに 0.95 と入力しますが、ここでは画面構成が崩れず、画面がスクロールしません。これが、入力ボックスを使うメリットです。Casio Basic の旧来の命令(入力命令 ? や出力命令 )を使えば、必ず画面スクロールするので、変化を比較しにくくなります。

CompInt_9 


ちなみに、急冷の命令を使うと入力時にスクロールして画面構成が崩れる実例、その対応について以下で具体的に紹介しています。

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





具体的なプログラミング

では、上のプログラム構造で具体的に作ってみましょう。

初期画面表示

以下のような画面を初期表示します。

CompInt_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"
[入力値の取得]


となります。

入力ボックスの表示位置は、変数 XY で指定します。
入力ボックスの桁数は、変数 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つでもあれば、TOTALMONTH に表示しないのが良いでしょう。そこでプログラムを変更してみます。

色々な方法がありますが、記述量の少ない方法の1つとして、BRN のいずれかが 0 の時、言い換えれば B x R x N0 でない時に、計算と表示を行うようにプログラムを変更します。

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

を追加します。K73 の時は、強制的に 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入門52Casio Basic入門G01 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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




関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

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

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

人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR