Casio Basic入門30

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門29 を見る


前回は、ヨーロッパのタイムゾーンを変更・設定する機能を詳細にみてみました。

今回は、アメリカのタイムゾーンを変更・設定する機能を追加してゆきます。

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



Chapter5-8
類似処理による機能追加

39-TZ5_main 

このメイン画面では、2:PST は、アメリカの太平洋標準時間を示しています。

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

タイムゾーン標準時間 夏時間 
太平洋時間PSTPDT
山岳部時間MSTMDT
中部時間CSTCDT
東部時間ESTEDT

US-TZ  
Time-J.net 世界時計 - 世界の時間と時差 - アメリカの時差と現在時刻 から引用


ここで [2] キーを長押しすると、下に示すような 「アメリカのタイムゾーン選択画面」を表示させることにします。

44-TZSelect_NA 

ここでの操作は、ヨーロッパのタイムゾーン設定と全く同様にします。

つまり、左矢印キー [◀] か 右矢印キー [▶] を押すと、⇒ マークが移動し、[EXE] キーを押すと ⇒ マークで示されているタイムゾーンが確定されるようにします。この追加はタイムゾーン設定サブルーチン TZS に追加します。

北米のタイムゾーン変数として、新たに変数 W を使い、夏時間フラグ T と合わせて、以下のように決めます。

タイムゾーン標準時間 (T=0)夏時間 (T=1) 変数 W の値
太平洋時間PSTPDT0
山岳部時間MSTMDT1
中部時間CSTCDT2
東部時間ESTEDT3

サブルーチン 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] キー長押しを検出して、メニュー変数 M7 を入れます。

長押し検出は、既に説明したものを [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 の値
太平洋時間PSTPDT0
山岳部時間MSTMDT1
 中央部時間CSTCDT2
東部時間ESTEDT3

タイムゾーンが変われば、略称の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,"⇒"
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=7 の時の処理として、アメリカのタイムゾーンの一覧表示を追加します。
・それ以外の処理は、既に作ったものをそのまま使えます...実際は、そのまま使えるように予め考えていたと言うのが正しいのですが...



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: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=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 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"
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

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,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,"⇒"
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入門31 / 目次




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

人気ブログランキングへ


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