Casio Basic入門28

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門27 を見る


前回までに、日本、ドイツ、ロサンゼルス(LA) の時間を夏時間を含めて換算できるようになりました。
今回は、ドイツ時間 (中央ヨーロッパ時間)  に限らず、ヨーロッパ内の4つのタイムゾーンを設定する機能を追加します。


今回までで完成させるプログラムを一番下に掲載しているので、先にそれを見てみて分かるなら、先に進むのも良いでしょう。



Chapter5-6
キー長押しによる機能呼び出し

39-TZ5_main 

このメイン画面では、1:CET は、中央ヨーロッパの標準時間を示しています。

ヨーロッパにあるタイムゾーンのうち、下記の4つのタイムゾーンに切り替えられるように機能を追加してゆきます。

タイムゾーン標準時間 夏時間 
西ヨーロッパ時間WETWEST
中央ヨーロッパ時間CETCEST
東ヨーロッパ時間EETEEST
極東ヨーロッパ時間FETFEST

EU-TZ 
Time-J.net 世界時計 - 世界の時間と時差 - ヨーロッパのタイムゾーンについて から引用


ここで [1] キーを長押しすると、下に示すような 「ヨーロッパのタイムゾーン選択画面」を表示させるようにします。

42-TZSelect_EU 

ここで、左矢印キー [◀] か 右矢印キー [▶] を押すと、⇒ マークが移動し、[EXE] キーを押すと ⇒ マークで示されたタイムゾーンが確定されるようにします。この追加機能は、サブルーチンで実現することにします。このサブルーチンを、ファイル名 TZS (タイムゾーン設定サブルーチン) とします。設定 = Setting なので、TZ + S = TZS です。

ヨーロッパのタイムゾーン変数に、新たに V を使い、その値を以下のように決めます。

タイムゾーン標準時間 変数 V の値
西ヨーロッパ時間WET0
中央ヨーロッパ時間CET1
東ヨーロッパ時間EET2
極東ヨーロッパ時間FET3

サブルーチン TZS では、変数 V の値を変更します。

TZS が終了してメインルーチンに戻ってきたら、必要な時間計算を行い、最後に時間表示サブルーチン TZD を呼び出して、変数 V の値に従って時間表示をさせます。そこで、TZD を修正します。

以上が今回の機能追加の内容で、具体的には以下のように進めます。

1.初期化処理
新たに、ヨーロッパのタイムゾーン変数 V を追加する。それに合わせて変数の初期化を見直す。
メイン画面表示サブルーチン TZM にも機能追加する。

2.メニュー番号取得処理
今回は、[1] キーの長押しを検出し、検出されたときに、メニュー変数 M に 6 を入れる(5 を飛ばして 6 としたが、違う処理によることから、6 とした)。

3.入力処理
M=6 の時は、キー入力処理は行なわない。但し、ヨーロッパのタイムゾーン変更に伴って、メイン画面のタイムゾーン表示を変更するために、メイン画面表示サブルーチン TZM を呼び出す(これに合わせて TZM を修正する)。

4.時間の計算
M=6 の時、タイムゾーン変更に合わせてヨーロッパ時間を計算する。日本時間と北米時間には影響が無いので、これらの計算は行わない。

5.時間表示の更新
時間表示サブルーチン TZD を用いて、日本時間、ヨーロッパ時間、アメリカ時間の表示を更新する。

6.ループ構造
既にある While 1 ~ WhileEnd ループの中に、上記追加コードを入れる。


メインルーチンの擬似的なプログラムは、以下になります。今回追加・修正するところが、はっきりと分かります。


[初期化処理]

Prog "TZM"  [メイン画面表示]

While 1

  [メニュー番号取得処理]

  
[ [1] キー長押しを検出し メニュー番号 M = 6 とする処理]

  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"  
[メイン画面表示]
  IfEnd:
IfEnd
  IfEnd:IfEnd
  IfEnd:IfEnd

  
Prog "TZD"    [時間の再表示]

WhileEnd


(赤文字は追加・修正部分)



1.初期化処理
ドイツの時差は8時間なので、これまでドイツの時差を示す変数 P を 8 で初期化していました。今後は、変数 P をヨーロッパの各タイムゾーンに合わせた時差として使います。一番西にある西ヨーロッパ標準時間の時差は9時間なので、P を 9 で初期化;
9→P 
と変更します。

プログラム起動時に、ドイツの時間を表示させたいと言う私の好みから、ヨーロッパのタイムゾーン変数 V を 1 で初期化しておき、P と V から P の初期値をドイツのある中央ヨーロッパ時間に設定します。
1→V
P-V→P

を追加します。

もし、プログラム起動時にイギリス時間を表示したい場合は、V を 0
で初期化しておきましょう。

次に、初期表示の変更を行います。初期表示はサブルーチン TZM で受け持っているので、これを複数タイムゾーンに対応するように修正します。 TZM 修正内容は以下で説明します。



2.メニュー番号取得処理 - キー長押し処理


[1] キー長押しを検出して、メニュー変数 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=35
Isz C
C=9⇒Break
WhileEnd
C=9⇒6→M


先ずは、これまで作った緑色の部分で、現在押されているキーを検出します。

その後に追加された6行のプログラム(赤文字)では、

[1] キーがまだ押されている時はWhile ループに入り、所定の回数(ここでは9回)ループを回った時だけメニュー変数 M に 6 が入り、それ以外は M は 1 のまま、となります。

C=9⇒BreakC=9⇒6→M の両方に出てくる C=9 の部分で、長押し検出のための判定時間を変えられます。私が実際に触ったところでは、C=9 程度が良いと思うので、9 にしていますが、少ない値にして反応を速くすることもできます。反応が早すぎると、[1] キーを短く押したと思っても長押しと判定されるので、操作性が悪くなります。

While ループは、ループ継続の判定をループの最初で行います。一方 Do ループは、ループの最後で継続判定を行います。
今回は、不必要ならループに入らないようにしたいので、While ループを使います。
 ⇒ Casio Basic コマンドリファレンス: While ~ WhileEnd
 ⇒ Casio Basic コマンドリファレンス: Do ~ LpWhile


Break コマンドは、While ループや Do ループから強制的に抜ける時に使います。
 ⇒ Casio Basic コマンドリファレンス: Break


キーの長押し判定のポイントは、

1) 長押し判定部より前に、通常のキー判定があること
長押し判定部に入る前に、メニュー番号 M は既に 1 と決まっている。

2) While ループに入る段階で、[1] キーが押されているかどうかを判定する
普通に [1] キーを押した場合と、他のキーが押されている場合は、このループに入らず、[1] キーの長押しではないと判断する。

3) While ループを出る条件が2つある
所定回数(9回)ループを回った時 (C=9⇒Break) と、[1] キーから指が離れた時 (Getkey が 35 を返さなくなった時) の2つが、ループを出る条件です。

4) While ループを出た後、ループを回った回数が9回かどうかで長押し判定を行う
ループから出たところに、C=9⇒6→M があります。ループを9回回った時のみ、メニュー番号 M に 6 を入れています。


これで、[1] キーが長押しされたことを確実に検出し、長押しの時だけ M = 6 となり、それ以外は M = 1 となります。
さらに、長押しの判定時間も変えられます(上で説明した通り)。

長押し判定部分は、以下のように書くこともできます。

0→C
While Getkey=35
Isz C:C=9⇒Break
WhileEnd:C=9⇒6→M


プログラムの行数が長くなるので、以降はこのような記述にします。


なお、キー長押しについては、同じ手法を以下でも紹介しています。
 ⇒ Casio Basic 入門22 - 和暦・西暦換算プログラムを作る



3.入力処理

入力処理を行わないので、[入力処理ブロック] には何もプログラムを書きません。



4.時間計算

先ず、タイムゾーン設定サブルーチン TZS を呼び出します。TZS はタイムゾーン変数 Z に 0、1、2、3 のいずれかの値を入れてから終了します。今回は、サブルーチン TSZ を新たに作ります。

次に、TZS が設定した変数 Z に基づいて、メインルーチンのヨーロッパタイムゾーン変数 V を設定し、ヨーロッパ時差変数 P を算出します。そして、時差 P から、選んだタイムゾーンの時間を計算します。

最後に、メイン画面表示サブルーチン TZM を呼び出して、選んだタイムゾーンに合わて画面を再表示します。これに合わせて 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"
IfEnd


最初に、タイムゾーン設定サブルーチン TZS を呼び出します。
  Prog "TZS"
TZS のプログラムを一番下に掲載していますので、とりあえず入力して使えるようにしてください。詳しくは次回説明します。TZS では、4つのタイムゾーンから1つ選んで確定すると、変数 Z にタイムゾーン値を入れて終了します。
ヨーロッパのタイムゾーン値 V は 0、1、2、3 のいずれかで、一番西が 0、東にゆくにつれて 1、2、3 となります。

変数 Z は使い捨て変数で、プログラムの動作中にその値が変化しても良いように使っている変数です。一方、変数 V はヨーロッパのタイムゾーン値を格納する予約変数として使っていて、その値は勝手に変更されては困ります。
そこで、TZS の直後で、Z の値を V に入れておきます。続いて、ヨーロッパ時差の変数 P を計算します。ここでは夏時間も考慮して、夏時間フラグ S も利用しています。ヨーロッパの西の端、つまり西ヨーロッパの時差は、日本からみて9時間です。夏時間では時差が1時間減り、タイムゾーン値を引き算すれば、選択したタイムゾーンの時差が分かります。
  Z→V:9-S-Z→P

タイムゾーンを変更しても、日本時間は変わりません。そこで、日本時間を基準に、時差 P から、選択したタイムゾーンの時間を計算します。現在の日本時間 J から「時」: A と 「分」: B を算出します。この計算は、既に他でも行っているのと同じです。
  Int(J÷100)→A
  J-100A→B


選択したタイムゾーンの時差が P なので、A - P が、その地域の「時」になります。但しこの結果が負になる場合があって、まだ前日であることを意味します。そこで、A - P が 0 未満の時は 24 を加えると正しい時間になります。この計算も、、これまでに行っているのと同じです。
  A-P→C
  C<0⇒C+24→C


選んだタイムゾーンの「時」: C が分かったので、ヨーロッパ時間 G が計算できます。これも、これまでに行っているのと同じです。
  100C+B→G

プログラムがここまで進んできても、タイムゾーン設定画面が表示されたままです。そこで、Cls コマンドで画面を消去します。
  Cls
 ⇒ Casio Basic コマンドリファレンス: Cls

最後に、メイン画面の際表示を行うために、メイン画面表示サブルーチン TZM を呼び出します。
  Prog "TZM"


TZS を、ヨーロッパの4つのタイムゾーンに合わせて変更します。
中央ヨーロッパ(ドイツ)の夏時間への対応は既に済んでいて、以下のような別のタイムゾーンの略称に対しても、夏時間への対応部分はそのまま使えます。

タイムゾーン標準時間 夏時間 変数 V の値
西ヨーロッパ時間WETWEST0
中央ヨーロッパ時間CETCEST1
東ヨーロッパ時間EETEEST2
極東ヨーロッパ時間FETFEST3

タイムゾーンが変われば、略称の1文字目を変更すれば良く、標準時間と夏時間の両方に対応できることが分かります。
そこで、V の値に応じて、赤く示したアルファベットのみを 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 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


(追加部分は赤文字



5.時間の再表示

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

サブルーチン 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




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

メインルーチン:TZ のプログラム
9→P:17→Q
-1→J:0→G:0→U
0→S:0→T
1→V
P-V→P

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=35
Isz C:C=9⇒Break
WhileEnd:C=9⇒6→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 S: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"

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 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
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,"⇒"
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




今回は、ヨーロッパのタイムゾーンを変更できるように、機能追加を行いました。
次回は、アメリカのタイムゾーンも変更できるようにします。



つづく...


Casio Basic入門29 / 目次




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

人気ブログランキングへ


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


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

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

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

人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR