Casio Basic入門31
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終更新: 2018/11/03
最終更新: 2018/11/03
4. CasioBasicを使ってみる(続き)
Chapter 5
◆ Chapter 5 の目標: サブルーチンを使いこなす
前回: Casio Basic入門30 を見る
[2018/11/03 追記]
▶ ソースコードの誤記を見直しました
▶ CcLinker を使ってfx-5800Pに転送して使えるプログラムファイル(CCLファイル)をダウンロードできます。
前回までに、キー長押しによりタイムゾーンの変更・設定機能を呼び出すようにしました。
夏時間の開始と終了の日時は、毎年異なります。そこで2015年の夏時間の開始・終了日時を表示する機能を追加し、さらにチョットした仕上げを行ってプログラムを完成させます。
最終的に完成させるプログラムを一番下に掲載しているので、先にそれを見て分かれば、先へ進むのも良いでしょう。
Chapter5-9
キー長押しによる別機能の呼び出し

なお、この表示は 2014 年のヨーロッパやアメリカの夏時間の期間を示しますが、もう 2015年がやってきます。
そこで、2015年の夏時間の期間を表示するようにします。
2015年の夏時間の期間
・ヨーロッパ: 2015年3月29日 午前2時開始、2015年10月25日 午前3時終了
・アメリカ : 2015年3月9日 午前2時開始、2015年11月1日 午前2時終了
※ 夏時間終了の時間がヨーロッパとアメリカで1時間違う)
実際問題、現地の人は深夜は寝ているので、アメリカでは 10月25日の朝以降は夏時間ではありません。ヨーロッパでも同様に 11月1日の朝は夏時間ではありません。そこで、本プログラムでは、朝の時点で夏時間かどうかの基準で表示(下記)を行うことにします。
DLS IN 2015
EUR: 3-20⇒10-24
USA: 2-9 ⇒10-31
2016年には、ここの表示を更新する必要があります。
さて、この表示を呼び出すためにはメイン画面で [3] か [4] キーを長押しすることにします。そして、その表示は 画面表示ルーチン TZS で行うことにします。
以上が今回の機能追加の内容で、具体的には以下のように進めます。
1.初期化処理
特に変更なし。
2.メニュー番号取得処理
今回は、[3] キー と [4] キーの長押しを検出し、検出されたときに、メニュー変数 M に 5 を入れる。
3.入力処理
M=5 の時は、単に情報を表示するだけで、キー入力処理は行なわない。
4.時間の計算
M=5 の時は、情報を表示するだけなので、何も計算することはない。
5.時間表示の更新
一旦画面全体を消去し、夏時間の情報を表示したのち、メイン画面を再表示する。再表示は 画面表示サブルーチン TZM を用いる。TZM の変更はない。
6.ループ構造
既にある While 1 ~ WhileEnd ループの中に、上記追加コードを入れる。
メインルーチンの擬似的なプログラムは、以下になります。追加・修正するところが分かると思います。
[初期化処理]
Prog "TZM" [メイン画面表示]
While 1
[メニュー番号取得処理]
[ [3] および [4] キー長押しを検出し 両方ともメニュー番号 M=5 とする処理]
If M=0:Then
[日本時間入力処理] (時間から「時」と「分」の分離も行う)
Else If M=1:Then
[ドイツ時間入力処理] (時間から「時」と「分」の分離も行う)
Else If M=2:Then
[LA時間入力処理] (時間から「時と「分」の分離も行う)
Else If M=3:Then
キー入力処理は行わない。時間から「時」と「分」の分離のみ行う
Else If M=4:Then
キー入力処理は行わない。時間から「時」と「分」の分離のみ行う
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd
If M=0:Then
[時間計算]
Else If M=1:Then
[時差計算]
Else If M=2:Then
[時間計算]
Else If M=3:Then
[時間計算]
Else If M=4:Then
[時間計算]
Else If M=5:Then
Prog "TZS" [夏時間情報の表示]
Cls
Prog "TZM" [メイン画面表示]
Else If M=6:Then
Prog "TZS" [ヨーロッパタイムゾーン設定]
[時間計算]
Prog "TZM" [メイン画面表示]
Else If M=7:Then
Prog "TZS" [アメリカタイムゾーン設定]
[時間計算]
Prog "TZM" [メイン画面表示]
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
Prog "TZD" [時間の再表示]
WhileEnd
(赤文字は機能追加部分)
1.初期化処理
変更なし。
2.メニュー番号取得処理 - キー長押し処理
[3] キー と [4] キーの長押しを検出して、メニュー変数 M に 5 を入れます。
長押し検出は、既に説明したものを適用するだけです。
メニュー番号取得処理のソースコード
-1→M
Do
Getkey→K
LpWhile K=0
K=25⇒0→M
K=35⇒1→M
K=36⇒2→M
K=37⇒3→M
K=21⇒4→M
0→C
While Getkey=37
Isz C:C=9⇒Break
WhileEnd:C=9⇒5→M
0→C
While Getkey=21
Isz C:C=9⇒Break
WhileEnd:C=9⇒5→M
0→C
While Getkey=35
Isz C
C=9⇒Break
WhileEnd
C=9⇒6→M
0→C
While Getkey=36
Isz C
C=9⇒Break
WhileEnd
C=9⇒7→M
(赤文字は追加部分)
3.入力処理
入力処理を行わないので、[入力処理ブロック] は何も変更しません。
4.時間計算
時間計算は行いませんが、ここで表示サブルーチン TZS を呼び出し、TZS で夏時間情報を表示させます。TZS 変更については、以下で説明します。
次に、TZS での表示が終わり、メインルーチンに戻ってきたら、一旦画面表示全体を消去 (Cls コマンドを使用)し、メイン画面表示サブルーチン TZM を呼び出して、選んだタイムゾーンに合わて画面を再表示します。TZM の変更は不要です。
メインルーチンに追加するプログラムを示します。今回変更するメインルーチン全体は、一番下に掲載しています。
メインルーチンに追加するプログラム
Else If M=5
Then Prog "TZS"
Cls:Prog "TZM"
IfEnd
タイムゾーン設定サブルーチン TZS を呼び出します。TZS の変更点は、以下で説明します。
Prog "TZS"
TZS から戻ってきた時、夏時間情報が表示されたままです。そこで、Cls コマンドで画面を消去します。
Cls
⇒ Casio Basic コマンドリファレンス: Cls
最後に、メイン画面の際表示を行うために、メイン画面表示サブルーチン TZM を呼び出します。
Prog "TZM"
サブルーチン:TZS のプログラム (夏時間情報を追加)
Cls
Locate 15,4,"▶t"
Locate 16,4,"E"
If M=5:Then
Locate 1,1," DLS IN 2015"
Locate 1,2,"EUR: 3-29⇒10-24"
Locate 1,3,"USA: 3-8 ⇒10-31"◢
Return
Else If M=6
Then V→Z
Locate 1,1," EUR TIME ZONE"
If S:Then
Locate 1,2," WEST CEST"
Locate 1,3," EEST FEST"
Else
Locate 1,2," WET CET"
Locate 1,3," EET FET"
IfEnd
Else If M=7
Then W→Z
Locate 1,1," USA TIME ZONE"
If T:Then
Locate 1,2," PDT MDT"
Locate 1,3," CDT EDT"
Else
Locate 1,2," PST MST"
Locate 1,2," CST EST"
IfEnd
IfEnd:IfEnd
IfEnd
Locate 1,4," <Lt-Rt>" [ これは、上からここへ移動 ]
2+6Z-12Int(Z÷2)→X
2+Int(Z÷2)→Y
Locate X,Y,"⇒"
Do
Getkey→K
If K=86:Then
Locate X,Y," "
If Z=3:Then 0→Z
Else Z+1→Z
IfEnd
2+6Z-12Int(Z÷2)→X
2+Int(Z÷2)→Y
Locate X,Y,"⇒"
Else If K=83
Then
Locate X,Y," "
If Z=0:Then 3→Z
Else Z-1→Z
IfEnd
2+6Z-12Int(Z÷2)→X
2+Int(Z÷2)→Y
Locate X,Y,"⇒"
IfEnd:IfEnd
LoWhile K≠47
(追加部分を赤文字で示す)
・ メニュー番号 M=5 の時の処理として、ヨーロッパとアメリカ(北米)それぞれの夏時間が開始・終了する日時を表示します。
・表示の最後に、◢ 命令を使って、プログラムの実行を一時停止させます。[EXE}キーを押せば一時停止が解除されるので、Returnコマンドで強制的に TZS を終了させ、メインルーチンに戻します。
⇒ Casio Basic コマンドリファレンス: ◢ (出力命令)
⇒ Casio Basic コマンドリファレンス: Return
なお、M=5 の時、夏時間情報を表示させるので、この時は Locate 1,4," <Tl-Rt>" の表示は邪魔になります。この表示はタイムゾーンを選択させると時に、左矢印と右矢印を使え、と言う操作ガイドなので、M=6 と M=7 の時のみに必要です。そこで、上に示したように、実行する位置を変更します。
5.時間の再表示
以上で、プログラムが一応完成しました。
実際に、プログラムを実行していると、いくつか気になる点が出てきたので、最後の仕上げを行います。
ヨーロッパの夏時間か標準時間を切り替えるために、[3] キーを押すとき、1:CEST から 1:CET に表示を切り替わる際に、1:CEST の最後の T の表示がちらつくのが気になったので、以下のように変更しました。
表示サブルーチン TZM の上から2行目;
Locate 1,2,"1:CET"
を、以下のように、スペースを追加しました。
Locate 1,2,"1:CET "
さらに、夏時間と標準時間の切り替えのために [3] キー や [4] キーを押した時、3:ST と 3:DL の表示の切り替えがもたつく感じがします。 4:ST と 4:DL の表示の切り替えも同様です。
その原因は、TZM の中で、上記の表示切り替え処理が最後の方にあることにあります。fx-5800P の処理能力が低いためこのようなことになります。そこで、上記の表示の切り替え処理を、メインルーチンの [時間計算]ブロック にある If M=3 および If M=4 の時の処理に、上記の表示切り替えの処理を、敢えて Locate コマンドを追加し、Prog "TZM" を削除します。これで表示切り替えのモタツキが少し解消しました。
[0]キー、[1]キー、[2]キーを押して入力ボックス INPI を呼び出すと >>>> と表示されますが、ここで何も入力せずに [EXE]キーを押すと 時刻が 0000 になります。この操作は入力キャンセルなので、入力ボックスを呼び出す前の時刻に戻るのが自然です。そこで何も入力しないで戻る特、つまり Z = 0 の時は、時刻変数 J, G, U を更新計算しないようにします。M = 0, 1, 2 の時のそれぞれの処理を、Z が ゼロでない時に実行されるように If Z:Then と IfEnd で挟みます。
このプログラム起動直後は、時刻表示されません。この時、[0]、[1]、[2]を押すと >>>> が表示されますが、数字を何も入力せうずに [EXE] を押した時は、Z = 0 となりますが、この時は時刻を示す4桁の数字を表示しないのが自然です。時刻表示サブルーチン TZD は J = -1 の時は Return して何もせず戻るようになっています。そこで、M = 0, 1, 2 の時 時刻変数 J を更新しないように以下のように Z⇒ を追加します。
Z⇒Z→J
Z⇒Z→G
Z⇒Z→U
この下に完成したプログラムを示します。今回、追加・修正した部分を赤文字で示しています。
最後に、メインルーチンのプログラム名を TIME ZONE に変更してください。これで一旦完成とします。
今回のプログラムに少し手を入れ、今年の夏時間に対応したものをプログラムライブラリに収録しています。
▶ 世界の時差換算 - Time Zone (fx-5800P用)
▶ 世界の時差換算 - Time Zone (fx-9860Gシリーズ/fx-CG20/fx-CG50用)
完成したプログラム TIME ZONE は、以下の通り(今回追加した部分を赤文字で示す):
▶ CcLinkerを使ってfx-5800Pに転送できるCCLファイルのダウンロード
※ CcLinker の紹介
メインルーチン:TIME ZONE のプログラム
9→P:17→Q
-1→J:0→G:0→U
0→S:0→T
1→V:0→W
P-V→P:Q-W→Q
Prog "TZM"
While 1
-1→M
Do
Getkey→K
LpWhile K=0
K=25⇒0→M
K=35⇒1→M
K=36⇒2→M
K=37⇒3→M
K=21⇒4→M
0→C
While Getkey=37
Isz C:C=9⇒Break
WhileEnd:C=9⇒5→M
0→C
While Getkey=21
Isz C:C=9⇒Break
WhileEnd:C=9⇒5→M
0→C
While Getkey=35
Isz C:C=9⇒Break
WhileEnd:C=9⇒6→M
0→C
While Getkey=36
Isz C:C=9⇒Break
WhileEnd:C=9⇒7→M
If M=0:Then
8→X:1→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z⇒Z→J
Else If M=1
Then
8→X:2→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z⇒Z→G
Else If M=2:
Then
8→X:3→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z⇒Z→U
Else If M=3 Or M=4
Then
Int(J÷100)→A
J-100A→B
IfEnd:IfEnd
IfEnd:IfEnd
If M=0:Then
If Z:Then
A≧24⇒A-24→A
100A+B→J
A-P→C
C<0⇒C+24→C
100C+B→G
A-Q→C
C<0⇒C+24→C
100C+B→U
IfEnd
Else If M=1
Then
If Z:Then
A≧24⇒A-24→A
100A+B→G
A+P→C
C≧24⇒C-24→C
100C+B→J
A+P-Q→C
C<0⇒C+24→C
C≧24⇒C-24→C
100C+B→U
IfEnd
Else If M=2
Then
If Z:Then
A≧24⇒A-24→A
100A+B→U
A+Q→C
C≧24⇒C-24→C
100C+B→J
A+Q-P→C
C<0⇒C+24→C
C≧24⇒C-24→C
100C+B→G
IfEnd
Else If M=3
Then
If S:Then
0→S:P+1→P
Locate 5,2,"T "
Locate 15,2,"ST"
Else
1→S:P-1→P
Locate 5,2,"ST"
Locate 15,2,"DL"
IfEnd
A-P→C
C<0⇒C+24→C
100C+B→G
Else If M=4
Then
If T:Then
0→T:Q+1→Q
Locate 4,3,"S"
Locate 15,3,"ST"
Else
1→T:Q-1→Q
Locate 4,3,"D"
Locate 15,3,"DL"
IfEnd
A-Q→C
C<0⇒C+24→C
100C+B→U
Else If M=5
Then Prog "TZS"
Cls:Prog "TZM"
Else If M=6
Then Prog "TZS"
Z→V:9-S-Z→P
Int(J÷100)→A
J-100A→B
A-P→C
C<0⇒C+24→C
100C+B→G:Cls
Prog "TZM"
Else If M=7
Then Prog "TZS"
Z→W:17-T-Z→Q
Int(J÷100)→A
J-100A→B
A-Q→C
C<0⇒C+24→C
100C+B→U:Cls
Prog "TZM"
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
Prog "TZD"
WhileEnd
サブルーチン:TZM のプログラム (画面表示)
Locate 1,1,"0:JST"
Locate 1,2,"1:CET "
Locate 1,3,"2:PST"
Locate 13,2,"3:"
Locate 13,3,"4:"
Locate 1,4,"<AC>:QUIT"
If V=0:Then
Locate 3,2,"W"
Else If V=1
Then Locate 3,2,"C"
Else If V=2
Then Locate 3,2,"E"
Else If V=3
Then Locate 3,2,"F"
IfEnd:IfEnd
IfEnd:IfEnd
If W=0:Then
Locate 3,3,"P"
Else If W=1
Then Locate 3,3,"M"
Else If W=2
Then Locate 3,3,"C"
Else If W=3
Then Locate 3,3,"E"
IfEnd:IfEnd
IfEnd:IfEnd
If S:Then
Locate 5,2,"ST"
Locate 15,2,"DL"
Else
Locate 5,2,"T "
Locate 15,2,"ST"
IfEnd
If T:Then
Locate 4,3,"D"
Locate 15,3,"DL"
Else
Locate 4,3,"S"
Locate 15,3,"ST"
IfEnd
サブルーチン:TZS のプログラム (タイムゾーン設定)
Cls
Locate 15,4,"▶t"
Locate 16,4,"E"
If M=5:Then
Locate 1,1," DLS IN 2014"
Locate 1,2,"EUR: 3-30⇒10-26"
Locate 1,3,"USA: 3-9 ⇒11-2"◢
Return
Else If M=6
Then V→Z
Locate 1,1," EUR TIME ZONE"
If S:Then
Locate 1,2," WEST CEST"
Locate 1,3," EEST FEST"
Else
Locate 1,2," WET CET"
Locate 1,3," EET FET"
IfEnd
Else If M=7
Then W→Z
Locate 1,1," USA TIME ZONE"
If T:Then
Locate 1,2," PDT MDT"
Locate 1,3," CDT EDT"
Else
Locate 1,2," PST MST"
Locate 1,3," CST EST"
IfEnd
IfEnd:IfEnd
IfEnd
Locate 1,4," <Lt-Rt>"
2+6Z-12Int(Z÷2)→X
2+Int(Z÷2)→Y
Locate X,Y,"⇒"
Do
Getkey→K
If K=86:Then
Locate X,Y," "
If Z=3:Then 0→Z
Else Z+1→Z
IfEnd
2+6Z-12Int(Z÷2)→X
2+Int(Z÷2)→Y
Locate X,Y,"⇒"
Else If K=83
Then
Locate X,Y," "
If Z=0:Then 3→Z
Else Z-1→Z
IfEnd
2+6Z-12Int(Z÷2)→X
2+Int(Z÷2)→Y
Locate X,Y,"⇒"
IfEnd:IfEnd
LpWhile K≠47
サブルーチン:TZC のプログラム (時間を「時」と「分」に分離):変更なし
If Z<100:Then
Z→X:0→Y
Else
Int(Z÷100)→X
Z-100X→Y
IfEnd
サブルーチン TZD のプログラム (時間の表示):変更なし
J=-1⇒Return
Locate 8,1,"0000"
J⇒Locate 11-Int(log(J)),1,J
Locate 8,2,"0000"
G⇒Locate 11-Int(log(G)),2,G
Locate 8,3,"0000"
U⇒Locate 11-Int(log(U)),3,U
世界の時差換算プログラム TIME ZONE が完成しました。
「入力ボックス」は、以下にあります。
⇒ プログラムライブラリ - 入力ボックス
今回 fx-5800P 用に作ったものは、プログラムライブラリ - Time Zone にもまとめています。
このプログラムを fx-9860GII や fx-CG20 に移植したものは、こちら のプログラムライブラリにまとめていて、プログラムファイルをダインロードして電卓に転送してすぐに使えます。
次回からは、入力ボックスの高速化と、正負全小数へ対応するための拡張を試みます。
つづく...
⇒ Casio Basic入門32 / 目次
応援クリックをお願いします。励みになるので...
- 関連記事
-
-
Casio Basic入門20 2019/05/04
-
Casio Basic入門19 2019/05/04
-
Casio Basic入門31 2018/11/03
-
Casio Basic入門30 2018/11/03
-
Casio Basic入門29 2018/11/03
-