Casio Basic入門31

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終更新: 2015/01/24

 4. CasioBasicを使ってみる(続き)

Chapter 5

◆ Chapter 5 の目標: サブルーチンを使いこなす

前回: Casio Basic入門30 を見る


前回までに、キー長押しによりタイムゾーンの変更・設定機能を呼び出すようにしました。


夏時間の開始と終了の日時は、毎年異なります。そこで2015年の夏時間の開始・終了日時を表示する機能を追加し、さらにチョットした仕上げを行ってプログラムを完成させます。

最終的に完成させるプログラムを一番下に掲載しているので、先にそれを見て分かれば、先へ進むのも良いでしょう。



Chapter5-9
キー長押しによる別機能の呼び出し

27-TZInfo  

このように、ヨーロッパとアメリカ(北米)について、それぞれの夏時間の開始と終了日時を表示する機能を追加します。

なお、この表示は 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] キーの長押しを検出し、検出されたときに、メニュー変数 M5 を入れる。

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] キーの長押しを検出して、メニュー変数 M5 を入れます。

長押し検出は、既に説明したものを適用するだけです。

メニュー番号取得処理のソースコード
-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 の変更点は、下記のようになります。

サブルーチン:TZS のプログラム (夏時間情報を追加)
Cls
Locate 15,4,"▶t"
Locate 16,4,"E"
Locate 1,4," <Lt-Rt>"   [ これは下へ移動 ]

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=6M=7 の時のみに必要です。そこで、上に示したように、実行する位置を変更します。





5.時間の再表示

時間の再表示は、サブルーチン TZD で行います。これについては変更の必要がありません。


以上で、プログラムが一応完成しました。




実際に、プログラムを実行していると、いくつか気になる点が出てきたので、最後の仕上げを行います。

ヨーロッパの夏時間か標準時間を切り替えるために、[3] キーを押すとき、1:CEST から 1:CET に表示を切り替わる際に、1:CEST の最後の T の表示がちらつくのが気になったので、以下のように変更しました。

表示サブルーチン TZM の上から2行目;

Locate 1,2,"1:CET"

を、以下のように、スペースを追加しました。

Locate 1,2,"1:CET "


さらに、夏時間と標準時間の切り替えのために [3] キー や [4] キーを押した時、3:ST3:DL の表示の切り替えがもたつく感じがします。 4:ST4:DL の表示の切り替えも同様です。

その原因は、TZM の中で、上記の表示切り替え処理が最後の方にあることにあります。fx-5800P の処理能力が低いためこのようなことになります。そこで、上記の表示の切り替え処理を、メインルーチンの [時間計算]ブロック にある If M=3 および If M=4 の時の処理に、上記の表示切り替えの処理を、敢えて追加します。無駄な処理ですが、これで表示切り替えのモタツキが少し解消しました。

この下に完成したプログラムを示します。今回、追加・修正した部分を赤文字で示しています。

最後に、メインルーチンのプログラム名を TIME ZONE に変更してください。これで完成とします。



完成したプログラム TIME ZONE は、以下の通り(今回追加した部分を赤文字で示す):

メインルーチン: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=25⇒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→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
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
Prog "TZM"
Else If M=4
Then
If S: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
Prog "TZM"
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→M: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: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,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




サブルーチン: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 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



カシオプログラム関数電卓 FX-5800P-N カシオプログラム関数電卓 FX-5800P-N
(2006/09/22)
CASIO(カシオ)

商品詳細を見る



keywords: fx-5800PCasioBasic、世界時間換算, プログラミング入門プログラム関数電卓

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



関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


プログラム電卓は、プログラムを使ってナンボ!

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

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR