Casio Basic入門20
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
更新: 2019/05/04
更新: 2019/05/04
4. CasioBasicを使ってみる(続き)
Chapter 4
◆ Chapter 4 の目標: 換算プログラムを作る(令和対応版)
前回: Casio Basic入門19
サブルーチン: YRC
If N=1:Then
A-1911→T
Else If N=2
Then
A-1925→S
Else If N=3
Then
A-1988→H
Else If N=4
Then
A-2018→R
IfEnd:IfEnd
IfEnd:IfEnd
A-1911→T
A-1925→S
A-1988→H
A-2018→R
Locate 5,1," " (スペース5個)
A>0⇒Locate 5,1,A
Locate 4,2," " (スペース6個)
M>0⇒Locate 4,2,T
Locate 13,2," " (スペース4個)
T>0⇒Locate 13,2,S
Locate 4,3," " (スペース6個)
S>0⇒Locate 4,3,H
Locate 13,3," " (スペース4個)
H>0⇒Locate 13,3,R
プログラム名: CH4-2
0→A
Locate 1,1,"0:AD"
Locate 10,1,"▶DMS"
Locate 11,1,"EXIT
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
While 1
-1→N
Do
Getkey→K
LpWhile K=0
K=25⇒0→N
K=35⇒1→N
K=36⇒2→N
K=36⇒3→N
K=21⇒4→N
If N=0:Then
5→X:1→Y:4→D:1→E
Prog "INPI":Z→A
Else If N=1
Then
4→X:2→Y:4→D:1→E
Prog "INPI":Z→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd
If N=0:Then
Prog "YRC"
Else If N=1
Then
T+1911→A
T=0⇒Isz A
Prog "YRC"
Else If N=2
Then
S+1925→A
S=0⇒Isz A
Prog "YRC"
Else If N=3
Then
H+1988→A
H=0⇒Isz A
Prog "YRC"
Else If N=4
Then
R+2018→A
R=0⇒Isz A
Prog "YRC"
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd
WhileEnd
Chapter 4-3
今回は、オマケの "あの人の年齢いくつかな?" 機能を追加してゆきます。
項目5:
5:In
この表記の後に4桁の入力ボックスで入力させます。
ここには、任意の西暦年を入力します。
ここで入力した値は、変数B に格納します。
項目6:
6: y
この 6: と y の間に3桁の入力ボックスで、年齢を入力させます。
y は歳(years)の略です。ここで入力した値は、変数Gに格納します。
項目0の西暦年 (変数A) が0 (ゼロ) の時は、項目5と項目6の入力ができないようにします。
西暦年(変数A)が0でない時は、その値に基づいて、BからGを、またはGからBを計算して表示します。
Bが入力された時は、
B-A→G
により、西暦Bの時の年齢Gを計算します。
Gが入力された時は、
A+G→B
により、G歳の時の西暦年Bを計算します。
具体的に、各ブロックにコードを実装してみましょう。
[初期設定] ブロック
0→A:0→B:0→G
(追加部分を赤文字で示した)
BとGも 0 (ゼロ)で初期化しておきます。
[表示の初期化]
Locate 1,1,"0:AD"
Locate 10,1,"▶DMS"
Locate 11,1,"EXIT"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
Locate 1,4,"5:In(" ([In])
Locate 5,4," " (スペース2個)
Locate 10,4,"6:yσn"
Locate 14,4," " (スペース2個)
(追加部分を赤文字で示した)
特に説明は不要と思います。小文字の y を表示する時の裏技を思い出してください。
[メニュー番号取得]
-1→N
Do
Getkey→K
LpWhile K=0
K=25⇒0→N
K=35⇒1→N
K=36⇒2→N
K=36⇒3→N
K=21⇒4→N
K=22⇒5→N
K=23⇒6→N
(追加部分を赤文字で示した)
項目 5 と 6 を押した時、それぞれのメニュー番号を変数 N に代入しています。
[入力処理]
If N=0:Then
5→X:1→Y:4→D:1→E
Prog "INPI":Z→A
Else If N=1
Then
4→X:2→Y:4→D:1→E
Prog "INPI":Z→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R
Else If N=5
Then
If A:Then
5→X:4→Y:4→D:1→E
Prog "INPI":Z→B
IfEnd
Else If N=6
Then
If A:Then
12→X:4→Y:4→D:1→E
Prog "INPI":Z→G
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd
(追加部分を赤文字で示した)
項目5 と 6 の入力ボックスを用いた入力処理は、既に作った部分と同様です。追加部分に関する特別な処理はありせん。
[計算と出力処理]
If N=0:Then
Prog "YRC"
Else If N=1
Then
T+1911→A
T=0⇒Isz A
Prog "YRC"
Else If N=2
Then
S+1925→A
S=0⇒Isz A
Prog "YRC"
Else If N=3
Then
H+1988→A
H=0⇒Isz A
Prog "YRC"
Else If N=4
Then
R+2018→A
R=0⇒Isz A
Prog "YRC"
Else If N=5
Then
If A:Then
Prog "YRC"
IfEnd
Else If N=6
Then
If A:Then
Prog "YRC"
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd
(追加部分を赤文字で示した)
項目 5 と 6 に関する追加部分で、特別なものはなく、サブルーチン YRC を呼び出しているだけです。
具体的な細かい処理は、サブルーチン YRC が受け持ちます。
まずは、プログラムコードを一気に紹介します。サブルーチン YRC は、全ての表示を書き換えます。そして書き換える項目に、項目5と6を追加しています。
サブルーチン: YRC
If N=1:Then
A-1911→T
Else If N=2
Then
A-1925→S
Else If N=3
Then
A-1988→H
Else If N=4
Then
A-2018→R
Else If N=5
Then
B-A→G
Else If N=6
Then
A+G→B
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
A-1911→T
A-1925→S
A-1988→H
A-2018→R
Locate 5,1," " (スペース5個)
A>0⇒Locate 5,1,A
Locate 4,2," " (スペース6個)
T>0⇒Locate 4,2,T
Locate 13,2," " (スペース4個)
S>0⇒Locate 13,2,S
Locate 4,3," " (スペース6個)
H>0⇒Locate 4,3,H
Locate 13,3," " (スペース4個)
R>0⇒Locate 13,3,R
B-A→G
If G>999 Or G<-99:Then
Locate 12,4," yσn"
Locate 14,4," "
Return
IfEnd
If B Or G:Then
Locate 5,4," "
Locate 5,4,B
Locate 12,4," "
Locate 12,4,G
If Abs(G):Then
13+Int(log(Abs(G)))→D
Else 13→D:IfEnd
G<0⇒D+1→D
Locate D,4,"yσn" ([FUNCTION][7][2][6])
Locate D+1,4," "
IfEnd
(追加部分を赤文字、青文字、紫文字で示した)
サブルーチン YRC では、変数A、B、G に基づき、必要な計算を行って表示しています。
青文字の部分(エラー処理)
変数G(年齢)が大き過ぎ、あるいは小さ過ぎの場合は、3桁を超える表示になるので、正常な表示を行えません。これをエラーを考え、この部分では年齢の数値を表示させずに、空白を表示することにします。
項目6の年齢表示は、画面配置の都合上、3桁以内で表示を行います。 B-A により算出される年齢 G が3桁を超えるかどうかを判定します。年齢 G は、B-A により算出されるので、負の数になることもあり得ます。この場合は負記号 ”-”も1桁になります。
そこで、年齢G が3桁を超える条件は、以下のようになります。
・正の整数だと999が3桁の最大なので、これを超える場合として G>999、
・負の整数だと、-99が3桁の最大なので、これを下回る場合として G<-99
そして年齢Gが3桁を超える場合は、項目6(年齢表示)には空白を表示し、"y"を表示します。
エラーの場合は、以下に続く項目5と6の表示を行わずに、サブルーチンを終了させて、メインルーチンへ戻るようにします。そこで、Returnコマンドを用います。
⇒ CasioBasicコマンドリファレンス
赤色の部分
ここでは、項目5と項目6の計算結果を表示します。
但しプログラムを起動した時は、このおまけ機能はまだ使っていません。使っていないのに表示をするのはおかしい。
そこで、変数 G と B のいずれかが初期値(0)でない時にのみ、表示を行うことにし、具体的には以下のIf 文を使っています。
If B Or G Then
[項目5と6の表示]
IfEnd
紫色の部分
文字"y" の表示位置は年齢Gの桁数に応じて変化しますので、この部分で文字"y"を表示する桁を調べています。
この処理が面倒なら、最初から文字"y"を表示させないようにしても構いません。但し、fx-5800Pでプログラムを作る際には、表示変数の桁数が分かると便利なことがあるので、その方法を紹介します。
fx-5800P 搭載のCasioBasicには、文字列処理のコマンドがありません。そこで数学的に変数Gの桁数を調べる必要があります。
正の整数Gの桁数は 1 + Int(log(G)) で求まります。
Gの表示開始桁は 12 です。"y" の表示桁を D とすると、以下の式から D を計算します。
13+Int(log(Abs(G))→D
関数 Abs( ) は、 ( ) 内の数の絶対値を求めます。
対数関数 log( ) の ( ) 内は正の数でなければエラーになります。これは対数関数の数学的性質です。
そこで、まず年齢変数Gが0(ゼロ)でない時、つまり
If Abs(G) Then
の時に、Gを Abs( ) 関数で一旦正の数にして、対数関数 log( ) を使い、Gの桁数から "y" の表示桁を求めます。
そして、Else により G が 0 (ゼロ)の時の "y"の表示桁を 13→D で決定しています。
最後に、G が負の数の時は、マイナス記号が頭に追加されるので、"y" の表示桁数D を1つ増やしています。
※ 変数 G の桁数の求め方について
変数の桁数を求めて、それに関する表示桁を求める方法については、こちら で説明していますので、参考にしてください。
今回作成したプログラムコードを以下にまとめます。
プログラム名: CH4-3
0→A:0→B:0→G
Locate 1,1,"0:AD"
Locate 10,1,"▶DMS"
Locate 11,1,"EXIT
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
Locate 1,4,"5:In("
Locate 5,4," "
Locate 10,4,"6:yσn"
Locate 14,4," "
While 1
-1→N
Do
Getkey→K
LpWhile K=0
K=25⇒0→N
K=35⇒1→N
K=36⇒2→N
K=36⇒3→N
K=21⇒4→N
K=22⇒5→N
K=23⇒6→N
If N=0:Then
5→X:1→Y:4→D:1→E
Prog "INPI":Z→A
Else If N=1
Then
4→X:2→Y:4→D:1→E
Prog "INPI":Z→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R
Else If N=5
Then
If A:Then
5→X:4→Y:4→D:1→E
Prog "INPI":Z→B
IfEnd
Else If N=6
Then
If A:Then
12→X:4→Y:3→D:1→E
Prog "INPI":Z→G
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd
If N=0:Then
Prog "YRC"
Else If N=1
Then
T+1911→A
T=0⇒Isz A
Prog "YRC"
Else If N=2
Then
S+1925→A
S=0⇒Isz A
Prog "YRC"
Else If N=3
Then
H+1988→A
H=0⇒Isz A
Prog "YRC"
Else If N=4
Then
R+2018→A
R=0⇒Isz A
Prog "YRC"
Else If N=5
Then
If A:Then
Prog "YRC"
IfEnd
Else If N=6
Then
If A:Then
Prog "YRC"
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd
WhileEnd
プログラムの構造
[初期設定]
[表示の初期化]
While 1
WhileEnd
16桁・4行の限られた画面の中に、7つの項目を押し込んで全ての換算値を1画面に表示することができました。
このプログラムを使っていて、ふと思ったことがあります。
和暦は、きりの良い1月から変わるわけではなくて、天皇崩御により年号が変わるのだから、例えば昭和は、何年何月から何年何月までだろうか?
Googleなどで調べれば良いだけですが、今回のプログラムに各年号の始まりと終わりの年月日を表示する機能を組み込めないだろうか?
表示のための画面は、サブルーチンを利用してやればよく、表示が終われば、元の画面に戻すことはま、まぁできるでしょう。
それよりも、問題は呼び出すための番号を表示する場所がもう無いことです。
実は、うまい手があることに気がつきました。それを、次回紹介しようと思います。
つづく...
⇒ CasioBasic入門21 / 目次
応援クリックをお願いします。励みになるので...
- 関連記事
-
-
Casio Basic入門22 2019/05/04
-
Casio Basic入門21 2019/05/04
-
Casio Basic入門20 2019/05/04
-
Casio Basic入門19 2019/05/04
-
Casio Basic入門2 2018/11/05
-