Casio Basic入門30
Casio Basic入門
誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終更新: 2018/11/03
最終更新: 2018/11/03
4. CasioBasicを使ってみる(続き)
Chapter 5
◆ Chapter 5 の目標: サブルーチンを使いこなす
前回: Casio Basic入門29 を見る
[2018/11/03 追記]
▶ ソースコードの誤記を見直しました
▶ CcLinker を使ってfx-5800Pに転送して使えるプログラムファイル(CCLファイル)をダウンロードできます。
前回は、ヨーロッパのタイムゾーンを変更・設定する機能を詳細にみてみました。
今回は、アメリカのタイムゾーンを変更・設定する機能を追加してゆきます。
今回完成させるプログラムを一番下に掲載しているので、先にそれを見て分かれば、先へ進むのも良いでしょう。
Chapter5-8
類似処理による機能追加

アメリカにあるタイムゾーンのうち、下記の4つのタイムゾーンに切り替えられるように機能を追加してゆきます。
タイムゾーン | 標準時間 | 夏時間 |
太平洋時間 | PST | PDT |
山岳部時間 | MST | MDT |
中部時間 | CST | CDT |
東部時間 | EST | EDT |

Time-J.net 世界時計 - 世界の時間と時差 - アメリカの時差と現在時刻 から引用
ここで [2] キーを長押しすると、下に示すような 「アメリカのタイムゾーン選択画面」を表示させることにします。

ここでの操作は、ヨーロッパのタイムゾーン設定と全く同様にします。
つまり、左矢印キー [◀] か 右矢印キー [▶] を押すと、⇒ マークが移動し、[EXE] キーを押すと ⇒ マークで示されているタイムゾーンが確定されるようにします。この追加はタイムゾーン設定サブルーチン TZS に追加します。
北米のタイムゾーン変数として、新たに変数 W を使い、夏時間フラグ T と合わせて、以下のように決めます。
タイムゾーン | 標準時間 (T=0) | 夏時間 (T=1) | 変数 W の値 |
太平洋時間 | PST | PDT | 0 |
山岳部時間 | MST | MDT | 1 |
中部時間 | CST | CDT | 2 |
東部時間 | EST | EDT | 3 |
サブルーチン TZS でアメリカのタイムゾーンを設定した場合は、変数 W の値を変更します。
TZS が終了してメインルーチンに戻ってきたら、必要な時間計算を行い、最後に時間表示サブルーチン TZD を呼び出して、変数 W の値に従って、時間表示サブルーチン TZD で時間表示を更新します。
以上が今回の機能追加の内容で、具体的には以下のように進めます。
1.初期化処理
新たに、アメリカのタイムゾーン変数 W を追加する。それに合わせて変数を初期化する。
メイン画面表示サブルーチン TZM にもアメリカの異なるタイムゾーン略称を表示するように機能追加する。
2.メニュー番号取得処理
今回は、[2] キーの長押しを検出し、検出されたときに、メニュー変数 M に 7 を入れる。
3.入力処理
M=7 の時は、キー入力処理は行なわない。但し、アメリカのタイムゾーン変更に伴って、メイン画面のタイムゾーン表示を変更するために、メイン画面表示サブルーチン TZM を呼び出す(これに合わせて TZM を修正する)。
4.時間の計算
M=7 の時、タイムゾーン変更に合わせて北米時間を計算する。日本時間とヨーロッパ時間には影響が無いので、これらの計算は行わない。
5.時間表示の更新
時間表示サブルーチン TZD を用いて、日本時間、ヨーロッパ時間、アメリカ時間の表示を更新する。
6.ループ構造
既にある While 1 ~ WhileEnd ループの中に、上記追加コードを入れる。
メインルーチンの擬似的なプログラムは、以下になります。追加・修正するところが分かると思います。
[初期化処理]
Prog "TZM" [メイン画面表示]
While 1
[メニュー番号取得処理]
[ [1] および [2] キー長押しを検出し それぞれメニュー番号 M=6, 7 とする処理]
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=6:Then
Prog "TZS" [ヨーロッパタイムゾーン設定]
[時間計算]
Prog "TZM" [メイン画面表示]
Else If M=7:Then
Prog "TZS" [アメリカタイムゾーン設定]
[時間計算]
Prog "TZM" [メイン画面表示]
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd
Prog "TZD" [時間の再表示]
WhileEnd
(赤文字は機能追加部分)
1.初期化処理
プログラム起動時に、太平洋時間を表示させたいと言う私の好みから、北米のタイムゾーン変数 W を 0 で初期化しておき、Q と W から Q の初期値を太平洋時間に設定します。
1→W
Q-W→Q
を追加します。
次に、初期表示を受け持っているサブルーチン TZM をアメリカの複数タイムゾーンに対応するように修正します。 TZM 修正内容は以下で説明します。
2.メニュー番号取得処理 - キー長押し処理
[2] キー長押しを検出して、メニュー変数 M に 7 を入れます。
長押し検出は、既に説明したものを [2] に対応したものを追加するだけです。
メニュー番号取得処理のソースコード
-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=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 はタイムゾーン変数 Z に 0、1、2、3 のいずれかの値を入れてから終了します。今回は、サブルーチン TSZ にアメリカのタイムゾーン選択に関する部分を追加します。TZS 変更については、以下で説明します。
次に、TZS が設定した変数 Z に基づいて、メインルーチンの北米タイムゾーン変数 W を設定し、北米時差変数 Q を算出します。そして、時差 Q から時間を計算します。
最後に、メイン画面表示サブルーチン TZM を呼び出して、選んだタイムゾーンに合わて画面を再表示します。TZM の変更点は、以下で説明しますす。
メインルーチンの [時間計算] ブロック に追加するプログラムを示します。今回変更するメインルーチン全体は、一番下に掲載しています。
メインルーチンに追加するプログラム
Else If M=7
Then Prog "TZS"
Z→W:17-S-Z→Q
Int(J÷100)→A
J-100A→B
A-Q→C
C<0⇒C+24→C
100C+B→U
Cls
Prog "TZM"
IfEnd
タイムゾーン設定サブルーチン TZS を呼び出します。TZS の変更点は、以下で説明します。
Prog "TZS"
変数 Z は使い捨て変数で、プログラムの動作中にその値が変化しても良いように使っている変数です。一方、変数 W はヨーロッパのタイムゾーン値を格納する予約変数として使っていて、その値は勝手に変更されては困ります。
そこで、TZS の直後で、Z の値を W に入れます。続いて、ヨーロッパ時差の変数 Q を計算します。ここでは夏時間も考慮して、夏時間フラグ T も使います。アメリカの西の端、つまり太平洋時間の時差は、日本からみて17時間です。夏時間では時差が1時間減るので、タイムゾーン値を引き算すれば、選択したタイムゾーンの時差が分かります。
Z→W:17-T-Z→Q
タイムゾーンを変更しても、日本時間は変わりません。そこで、日本時間を基準に、時差 Q から、選択したタイムゾーンの時間を計算します。現在の日本時間 J から「時」: A と 「分」: B を算出します。この計算は、既に他でも行っているのと同じです。
Int(J÷100)→A
J-100A→B
選択したタイムゾーンの時差が Q なので、A - Q が、その地域の「時」になります。但しこの結果が負になる場合があって、まだ前日であることを意味します。そこで、A - Q が 0 未満の時は 24 を加えると正しい時間になります。この計算も、、これまでに行っているのと同じです。
A-Q→C
C<0⇒C+24→C
選んだタイムゾーンの「時」: C が分かったので、アメリカ時間 U が計算できます。これも、これまでに行っているのと同じです。
100C+B→U
プログラムがここまで進んできても、タイムゾーン設定画面が表示されたままです。そこで、Cls コマンドで画面を消去します。
Cls
⇒ Casio Basic コマンドリファレンス: Cls
最後に、メイン画面の際表示を行うために、メイン画面表示サブルーチン TZM を呼び出します。
Prog "TZM"
TZS を、アメリカの4つのタイムゾーンに合わせて変更します。
太平洋時間(ロサンゼルス)の夏時間への対応は既に済んでいて、以下のような別のタイムゾーンの略称に対しても、夏時間への対応部分はそのまま使えます。
タイムゾーン | 標準時間 | 夏時間 | 変数 W の値 |
太平洋時間 | PST | PDT | 0 |
山岳部時間 | MST | MDT | 1 |
中央部時間 | CST | CDT | 2 |
東部時間 | EST | EDT | 3 |
タイムゾーンが変われば、略称の1文字目を変更すれば良く、標準時間と夏時間の両方に対応できることが分かります。
そこで、W の値に応じて、赤く示したアルファベットのみを Locate コマンドで上書きします。
画面表示サブルーチン 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 の変更
前回つくった、ヨーロッパのタイムゾーンを変更する TZS のプログラムを示します。ココに、今回追加する部分を赤文字で追加してみます。
Cls
Locate 15,4,"▶t"
Locate 16,4,"E"
Locate 1,4," <Lt-Rt>"
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
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,"⇒"
Then
Locate X,Y," "
If Z=0:Then 3→Z
Else Z-1→Z
IfEnd
2+Int(Z÷2)→Y
Locate X,Y,"⇒"
LoWhile K≠47
・ メニュー番号 M=7 の時の処理として、アメリカのタイムゾーンの一覧表示を追加します。
・それ以外の処理は、既に作ったものをそのまま使えます...実際は、そのまま使えるように予め考えていたと言うのが正しいのですが...
5.時間の再表示
サブルーチン TZD のプログラム: 変更なし
J=-1⇒Return
Locate 8,1,"000"
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
今回までに作成したプログラムは、以下の通り(今回追加した部分を赤文字で示す):
▶ CcLinkerを使ってfx-5800Pに転送できるCCLファイルのダウンロード
※ CcLinker の紹介
メインルーチン:TZ のプログラム
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=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→J
Else If M=1
Then
8→X:2→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z→G
Else If M=2:
Then
8→X:3→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B: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
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
Else If M=1
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
Else If M=2
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
Else If M=3
Then
If S:Then
0→S:P+1→P
Else
1→S:P-1→P
IfEnd
A-P→C
C<0⇒C+24→C
100C+B→G
Prog "TZM"
Else If M=4
Then
If T:Then
0→T:Q+1→Q
Else
1→T:Q-1→Q
IfEnd
A-Q→C
C<0⇒C+24→C
100C+B→U
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
X<0⇒C+24→C
100C+B→U:Cls
Prog "TZM"
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"
Locate 1,4," <Lt-Rt>"
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
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,"⇒"
Then
Locate X,Y," "
If Z=0:Then 3→Z
Else Z-1→Z
IfEnd
2+Int(Z÷2)→Y
Locate X,Y,"⇒"
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
今回は、アメリカのタイムゾーンを変更できるように、機能追加を行いました。
次回は、ヨーロッパやアメリカのタイムゾーンの開始と終了日時を表示する機能を追加します。
つづく...
⇒ Casio Basic入門31 / 目次
応援クリックをお願いします。励みになるので...
- 関連記事
-
-
Casio Basic入門2 2018/11/05
-
Casio Basic入門31 2018/11/03
-
Casio Basic入門30 2018/11/03
-
Casio Basic入門29 2018/11/03
-
Casio Basic入門28 2018/11/03
-