Casio fx-JP900

2015/01/06 追記
2015/01/26 追記
2015/05/20 追記

カシオから、最新の関数電卓 fx-JP900 が発表されました。
最初にお断りしておきますが、fx-JP900 にはプログラミング機能はありません。プログラム電卓を扱う当ブログで fx-JP900/700/500 に関する記事を書くのは、これらの製品の際だった新機軸が将来のプログラム電卓に与える影響が無視できないからです。



2015/05/20 追記: 購入したので実際に使ってみた結果を公開しました ⇒ Casio fx-JP900(その2)

fx-JP900


2015年2月
 発売予定とのこと(2014年12月19日から fx-JP500を先行して販売の模様)。
 ⇒ カシオのニュースリリース

中国を含めて海外のカシオサイトではまだリリース情報が無いようです。
[2014/12/01 追記] sentaro様の情報では、中国では fx-991CN と言う型式で先行販売されているようです。

型式に JP と付き、日本語表示なので日本専用モデルですが、おそらく中文対応が準備されていると思われます。先ずは日本市場でバグ出しを行ってからと言うことも考えられます。

スタンダード関数電卓として初めて採用されるアイコンメニューは、グラフ関数電卓には既に採用されているので、
プログラム関数電卓やグラフ関数電卓への波及効果が気になるところです。


最近のカシオの関数電卓に対して、以前から問題だと思っていたのは以下の3点:

- 3桁区切りのコンマを付けて欲しい。昔のモデルにあったのに、なぜか最近のモデルには無い。


- 見にくくて安っぽい青液晶ではなくて、見やすい黒液晶にして欲しい。

- fx-993ESは半年使い込むとキートップの印刷が消え始める。昔のモデルではこのようなことは全くなかった。


この最新モデルでは、上から2つが実現しています。特に3桁区切りはとても重要です。技術計算にしてもお金の計算にしても、桁数の多い計算を行う時に3桁区切りが無いと、まともに使いづらい。敢えて Eng表示にして確認することが多く、確認しないと読み取りを間違ってしまいます。fx-5800P にも3桁区切りがありません。関数電卓として利用する際には、このうえなく不便なわけです。

黒液晶は、fx-993ES や fx-995ES と fx-5800P を比べると一目瞭然、fx-5800P の黒液晶は飛躍的に視認性が良いのです。

キートップの印刷については、使い込まないと分かりませんので、判断は保留です。


先週、ドイツ出張の機会があり、そこで家電量販店 SATURN に立ち寄る時間があり、プログラム関数電卓やグラフ関数電卓が、どの程度の価格が調べようと思っていました。すると、グラフ関数電卓は全く置いておらず、プログラム関数電卓は fx-5800P ただ1機種でした。価格は46ユーロ、6,700円程度でした。特に安くもなく、国内ではもう少し安く購入できるレベル。

このお店は、全体をみてみると売れ筋の製品に特化しておいてあるようで、電卓もスタンダード関数電卓 fx-995ES などのカシオ品のみが展示、販売されていました。グラフ関数電卓はより専門性の高いお店で売っているものと思われます。

言い換えると、fx-5800P は売れ筋とお店で判断したのかも知れません。或いは在庫一掃セールかもしれず、そうなればプログラム関数電卓の後継機が控えていることになります(思いっきり希望的観測)。

fx-JP900 を Amazonで見てみると 5,702円とあり、関数電卓としては高価です。発売開始後、値下げは必ずあると思います。

国内メーカーで電卓に力を入れて開発を進めているのは、カシオのみとなってしまっています。プログラム関数電卓にも開発資源を注いで欲しいと思う次第。


[2015/01/06 追記]
高機能電卓の情報 のブログにて、新しい情報を入手しました。ここによれば、関数電卓マニア のサイトで fx-JP500 の評価記事があり、数値積分計算の結果がかなり速くなっているとの情報があります。同じ計算を fx-5800P で行うと1.6倍も時間がかかります。つまり、それだけ高速化されており、同時に太陽電池で間に合うだけの省電力化も果たしていると思われます。

以前のプログラム関数電卓のヒット作 FX-603P が10年以上も販売が継続され、fx-5800P にその座を譲り渡したのが 2006年。そして、fx-5800P は来年で10年目に入ります。fx-5800P は、同年のグラフ関数電卓 CFX-9850GC PLUS に搭載された Casio Basic からグラフィックスとI/O関係のコマンド類を除外した以外は同等の Casio Basicを搭載。この
 Casio Basic は、初めて Getkey と Locate コマンドを備えた、いわば新世代 Casio Basic の最初のバージョンです。但し、CFX-9850GC PLUS では 空白行がエラーとなり、Then や Else の直後での改行もエラーとなるので、構造化Basic としては可読性の悪いものです。この点は fx-5800P で確実に改善されています。fx-5800P も CFX-9850GC PLUS も文字列関連のコマンドはありません。

このようにして、fx-5800P は、Casio Basic の大幅な進化とともに登場したと言えます。

そして、fx-JP500/700/900 の登場。高精細液晶と高速省電力CPUが搭載されました。また昨年登場した fx-FD10 Pro は fx-5800P にしか無かった利便性(プログラムリストボタンと ?(入力)命令)を採用した高性能機です。fx-5800P の良さを高機能機で検証した形になっています(惜しいことに、◢ (出力)命令実行時の- DISP -表示だけは、fx-9860GII や fx-CG20 の悪い癖がそのまま残っていて使いづらいままです)。グラフ関数電卓は旧来の命令を使うな、と言うことだとしても、fx-5800P の良さを取り入れた fx-FD10 Pro では非常にもったいないと思います。
[2015/01/26 追記] 上記青文字部分

一方で、fx-5800Pの最大の弱点は I/O 関係です。
 
高精細液晶に加えて低消費うI/Oの搭載による、次世代プログラム関数電卓の登場の材料が揃ったように思えます。今年が楽しみです。


関連記事:
- Casio fx-JP900(その2)
- Casio fx-JP900(その3)
- fx-JP900 と fx-5800P 後継機への期待




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


人気ブログランキングへ





keywords: fx-JP900関数電卓

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

続きを読む

関連記事

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

fx-5800P でピタゴラス数

最終:2015年3月11日

プログラムにバグがあったので修正しました [2014/12/03]


a2 + b2 = c2 となる自然数の組 (a, b, c) をピタゴラス数といいます。(3, 4, 5) がピタゴラス数と言うのは、直角三角形の3平方の定理で有名です。

そこで、ピタゴラス数を調べる Casio Basic プログラムを fx-5800P で作ってみました。

実際の計算には、以下のようなピタゴラス数の性質を利用しました。

ピタゴラス数の性質 

例えば、(3, 4, 5)(6, 8, 10) は、いずれもピタゴラス数ですが、1つめを2倍すると2つめになり、これらは同じと見なすことにするので、「a, b, c の最大公約数は 1」と言う条件を付けています。(6, 8, 10) の最大公約数は、2 なので、条件から外れます。最大公約数が 1 の (a, b, c) を原始ピタゴラス数と言います。

m n の組み合わせに重複がなければ、全ての原始ピタゴラス数が重複なく得られると言うのが特長なので、この性質を利用して上の条件に合うような、mn を探して、見つかった mn からピタゴラス数 (a, b, c) を計算する作戦です。

先に M を決めて、そこから条件に合う N を探索し、N が 1 になった時はNの探索を終えて、次の M を決めて条件に合う N を探索する....これを繰り返します。



1) 最初、M を 3 とし、N を 1 とする。

2) 現在の M N からピタゴラス数を計算し、表示する

3) N 0 にならない範囲で 2 減らして、M÷N が割り切れないとき(MN が互いに素のとき)、その N を採用。割り切れる時は 3) を繰り返す。割り切れるかどうかは、M÷N の小数部分が 0 かどうかで判定。但し N が0 になると M÷N でエラー(0 で割り算できない)ので、その1歩手前の N が 1 の時には、Nの探索を終了する。

4) N0 以下になるとき、M を 2 つ増やし、M-2N に代入して、3) に戻り、正しい MN が見つかるまで 3) を繰り返す。

5) 2) へ戻る。 

文章よりも、2) ~ 4) のプログラムを見た方が分かりやすいでしょう。

Do
N-2→N
If N<0:Then
M+2→M:M-2→N
IfEnd
N=1⇒Break
LpWhile Frac(M÷N)=0




ピタゴラス数プログラム
3→M:1→N:1→D     (初期化処理)
Locate 1,2,"A="    
(初期画面表示)
Locate 1,3,"B="
Locate 1,4,"C="

Lbl 0

(M2-N2)÷2→A       
(ピタゴラス数の計算)
MN→B
(M2+N2)÷2→C

Locate 1,1,D        (見つかった回数の表示)
Locate 3,2,"       " (スペース14個)
Locate 3,2,A        
(ピタゴラス数の表示)
Locate 3,3,"       " (スペース14個)
Locate 3,3,B        (ピタゴラス数の表示)
Locate 3,4,"       " (スペース14個)
Locate 3,4,C        (ピタゴラス数の表示)

Locate 7,1,"EXE:Next"◢  
(操作法表示&プログラム一時停止)

Do               
(次の M と N を探す)
N-2→N
If N<0:Then
M+2→M:M-2→N
IfEnd
N=1⇒Break
LpWhile Frac(M÷N)=0
Isz D             
(見つかった回数を1つ増やす)

Goto 0


このプログラムは、Lbl 0 / Goto 0 の無限ループが基本構成ですので、終了するには [AC] キーを押します。

プログラムを起動すると、画面は以下のようになります。

Pytha1 

最初の原始ピタゴラス数 (4, 3, 5) が表示されています。
※ 左上: 探したピタゴラス数の個数。起動時なので 1
※ 右上: [EXE] キーを押すと次のピタゴラス数を探す


ここで、[EXE] キーを押すと、以下のように2つめのピタゴラス数がわかります。

Pytha2 

さらに、[EXE] キーを押すと、3つめのピタゴラス数を探します。

Pytha3 
※ 画像修正



今のプログラムだと、[EXE] キーを叩き続けなければ、大きなピタゴラス数が分からず、ちょっと物足りない。

そこで、[EXE] キーを長押しすると、ピタゴラス数の探索&表示を連続して行うように機能追加しました(連続モードの追加)。


※ 動画修正



使い方:
・起動すると、最初に作った「ステップモード」で、右上に EXE:Next  と表示。
[EXE] キーを押すと、次のピタゴラス数を計算して、表示します。

[EXE] キーを長押しすると「連続モード」になり、右上に (-): Stop と表示。
・連続モードでは、次々とピタゴラス数を計算して表示し続けます。
[(-)] キーを押すと「ステップモード」に戻り、右上の表示が EXE:Next に戻ります。

右上に EXE:Next と表示されていると、ステップモードだと分かります。(-):Stop と表示されていると、連続モードだとわかります。


連続表示のまま、しばらく置いておくと、以下のようになります。


※ 動画更新

ピタゴラス数が次々と表示されるのを見ていると、チョット面白いですね。


さて、キー長押しで機能選択する方法は、これまでも紹介していますが、今回のプログラムでも利用しています。この方法を知っていると、とても便利です。連続モードの機能追加には、[(-)] キーの通常押しの検出、[EXE] キーの長押しの検出を追加し、連続モードなら変数 E=0 、通常モードだと E=1 とし、表示を E の値に従って変更するようにしました。

これらのキー入力検知は以下のプログラムで処理します。

Getket=57⇒1→E
0→K
While Getkey=47
Isz K:K=7⇒Break
WhileEnd:K=7⇒0→E


次の短いプログラムを入力して、実際に遊んでみてください。

ピタゴラスの綴りが PYTHAGORAS なので、そのままファイル名としました。

(プログラム修正)

Pythagoras_Source 

※ Locateコマンドの空白は16個




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

人気ブログランキングへ


FC2ブログランキングへ


keywords: プログラム関数電卓、fx-5800P、キー長押し、CasioBasic、 ピタゴラス数

リンク集 | ブログ内マップ
関連記事

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

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、世界時間換算, プログラミング入門プログラム関数電卓

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



関連記事

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

Casio Basic入門27

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門26 を見る


前回は、ドイツ時間を夏時間や標準時間に切り替える機能、それに伴って正しい時間を表示する機能を追加しました。
今回は、前回とほど同様の方針で、LA時間を夏時間に切り替える機能を追加してゆきます。


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



Chapter5-5
少し異なるルーチンを、わかりやすく追加する(2)

ロサンゼルス時間の夏時間切り替え機能をメニュー番号4にします。同時に、現在は夏時間なのか、標準時間なのかを表示するようにします。

今回は、以下のように 2:PST の右に LA時間の夏時間l設定用のメニューを追加します。

39-TZ5_main    


標準時間を ST、夏時間を DL と表示することにしています。
ST は Standard Time (標準時間) の略で、DL は Daylight Saving (アメリカ流の夏時間の表現) からとっています。

上の画面は、起動時の初期表示で、起動時には標準時間となるようにします。そして、[4] キーを押したら夏時間に切り替わり、もう一度押したら標準時間に戻る...といった動作(トグル動作)にします。

プログラム内部で、現在がLAの夏時間かどうかがわかるようにするために、新しい変数 T を夏時間フラグとして用い、

T = 0 時は標準時間で、T = 1 の時は夏時間

と決めます。


今回は、[4] キーを押してLA時間を夏時間に変更し、ロサンゼルス時間を計算し、その結果を画面表示する機能を追加します。

1.初期化処理
先ず、今回追加する新しい変数 T (ヨーロッパの夏時間フラグ)の初期化を行う。
次に、初期表示の変更を行います。初期表示はサブルーチン TZM で受け持っているので、これを修正する。

2.メニュー番号取得処理
ループの中で Getkey コマンドを使って、[4] キーが押された時、メニュー変数 M4 を入れる。
なお、この処理では、何かキーが押されるまでプログラムは先に進まず、入力待ちの状態になる。

3.入力処理
M=4 の時は、キー入力処理は行なわない。但し、LA時間 U が、夏時間か標準時間に変更されるので、U から「時」と「分」を分離する。

4.時間の計算
M=4 の時、変更されたLA時間を計算する。日本時間とドイツ時間には影響が無いので、これらの計算は行わない。

5.時間表示の更新
時間表示サブルーチン TZD を用いるので、これまでのように日本時間、ドイツ時間、LA時間の表示を更新する。

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


メインルーチンの擬似的なプログラムは、以下になります。今回の機能追加に必要な修正部分がはっきりします。

[初期設定]

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

While 1

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

  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
    [時間計算]
  IfEnd:
IfEnd
  IfEnd:IfEnd
  IfEnd

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

WhileEnd


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



1.初期化処理
今回は、ドイツの夏時間フラグ T を追加したので、これを 0 で初期化しておきます。
T = 0 は、標準時間であることを示します。

0→T

を追加します。



2.メニュー番号取得処理


[4] キーを押すと、メニュー変数 M に 4 を設定する。

メニュー番号取得処理のプログラム
-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 
[今回追加]


[4] キーのキーコードは 21 です。




3.入力処理

ドイツ時間を、夏時間 - 標準時間 に切り替えるのみで、キー入力処理は行いません。ドイツ時間が切り替わっても、日本時間やロサンゼルス時間には影響が無いので、この時点での日本時間 J を分離して、「時」を 変数 A に、「分」を変数 B に入れておきます。

Int(J÷100)→A
J-100A→B"


この部分は、M = 3 の時のドイツの夏時間設定と同じなので、Else If M=4IdEnd を追加せずに、以下のようにします。

Else If M=3
Then
Int(J÷100)→A
J-100A→B
IfEnd


この部分を以下のように修正します。

Else If M=3 Or M=4
Then
Int(J÷100)→A
J-100A→B
IfEnd


Or M=4 を追加するだけです。



4.時間計算

最初に、今回追加するプログラムを示します。

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"
IfEnd


ドイツの夏時間計算のルーチンで、P を Q に置き換え、G を U に置き換えるだけです。つまり、基本ロジックは全く同じです。

一応、説明をします。

最初の部分は、夏時間フラグの変更と時差の変更を行います。

  If T:Then
  0→T:Q+1→Q
  Else
  1→T:Q-1→Q
  IfEnd


現状が夏時間の時は、T=1 になっています。
  If T:Then
は、T1 の時の分岐処理なので、
夏時間フラグ:0 にし、時差:Q を1時間増やします。

Else 以下は、現状が標準時間の時の処理で、
夏時間フラグ:T1 にし、時差:Q を1時間減らしています。


この後に続く処理では、LA時間を計算し、時間表示サブルーチン TZM を呼び出します。

  A-Q→C
  C<0⇒C+24→C
  100C+B→U
  Prog "TZM"


入力処理のところで、現在の日本時間 J から「時」:A と「分」 B を算出しています。
LA時間は、日本時間の「時」 A と時差 から計算するので、A - Q でLA時間の「時」が得られます。

この計算の結果が負の数になる場合は、LAはまだ前日と言うことになります。この場合は、得られた負の数に 24 を足せば、24時制の「時」になります。

そこで、A - Q を一旦変数 C に入れておき、それが負の数なら 24 を足しておきます。
   A-Q→C
   C<0⇒C+24→C


LA時間:U は、100C + B で計算できます。
   100C+B→U 

最後に、サブルーチン TZM を呼び出す
   Prog "TZM"


さて、画面表示サブルーチン TZM をLAの夏時間に対応するように変更します。

サブルーチン 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 S:Then
Locate 5,2,"ST"   
[1:CET を 1:CEST に表示を切り替える]
Locate 15,2,"DL"  
[3:ST を 3:DL に表示を切り替える]
Else
Locate 5,2,"T "   
[1:CEST を 1:CET に表示を切り替える]
Locate 15,2,"ST"  
[3:DL を 3:ST に表示を切り替える]
IfEnd


If T:Then
Locate 4,3,"D"    
[2:PST を 2:PDT に表示を切り替える]
Locate 15,3,"DL"  
[4:ST を 4:DL に表示を切り替える]
Else
Locate 4,3,"S"    
[2:PDT を 1:PST に表示を切り替える]
Locate 15,3,"ST"  
[4:DL を 4:ST に表示を切り替える]
IfEnd


(赤文字は追加分)

アメリカの標準時間と夏時間の略称は、以下のように共に3文字です。

そこで、略称の2文字目を T と D で切り替えると、標準時間と夏時間の略称表示を切り替えられ、上のプログラムをこれを実行しています。

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



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 のプログラム
8→P:17→Q
-1→J:0→G:0→U
0→S:0→T
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

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"

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 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




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




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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



関連記事

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

Casio Basic入門26

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門25 を見る


前回は、日本時間、ドイツ時間、LA時間のいずれかを入力すると、換算したそれぞれの時間を表示するところまで作りました。
今回は、ドイツ時間を夏時間や標準時間に切り替える機能、それに伴って正しい時間を表示する機能を追加してゆきます。

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



Chapter5-4
少し異なるルーチンを、わかりやすく追加する

今回は、ドイツの夏時間切り替え機能をメニュー番号3にします。同時に、現在は夏時間なのか、標準時間なのかを表示するようにします。

具体的には、以下のように 1:CET の右に ドイツ時間の夏時間設定用のメニューを追加表示します。

38-TZ4_main   


標準時間を ST、夏時間を DL と表示することにします。
ST は Standard Time (標準時間) の略で、DL は DayLight saving (アメリカでの夏時間の表現) からとりました。

上の画面は、起動時の初期表示で、起動時には標準時間となるようにします。そして、[3] キーを押したら夏時間に切り替わり、もう一度押したら標準時間に戻る...といった動作(トグル動作)にします。

プログラム内部で、現在がドイツの夏時間かどうかがわかるようにするために、新しい変数 S を夏時間フラグとして用い、

S = 0 時は標準時間で、S = 1 の時は夏時間

と決めます。


今回は、[3] キーを押してドイツ時間を夏時間に変更し、ドイツ時間を計算し、その結果を画面表示する機能を追加します。

1.初期化処理
先ず、今回追加する新しい変数 S (ヨーロッパの夏時間フラグ)の初期化を行う。
次に、初期表示の変更を行います。初期表示はサブルーチン TZM で受け持っているので、これを修正する。

2.メニュー番号取得処理
ループの中で Getkey コマンドを使って、[3] キーが押された時、メニュー変数 M に 3 を入れる。
なお、この処理では、何かキーが押されるまでプログラムは先に進まず、入力待ちの状態にする。

3.入力処理
M=3 の時は、入力処理は行なわない。但し、ドイツ時間 G が、夏時間か標準時間に変更されるので、G から「時」と「分」を分離する。

4.時間の計算
M=3 の時、変更されたドイツ時間を計算する。日本時間とロサンゼルス時間には影響が無いので、これらの計算は行わない。

5.時間表示の更新
時間表示サブルーチン TZD を用いて、これまでのように日本時間、ドイツ時間、ロサンゼルス時間の表示を更新する。

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


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

[初期設定]

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

While 1


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

  If M=0:Then
    [日本時間入力処理] (時間から「時」と「分」の分離も行う)
  Else If M=1:Then
    [ドイツ時間入力処理] (時間から「時」と「分」の分離も行う)
  Else If M=2:Then
    [ロサンゼルス時間入力処理] (時間から「時と「分」の分離も行う)
  
Else If M=3:Then
    入力処理は行わず、時間から「時」と「分」の分離のみ行う
  IfEnd:
IfEnd
  IfEnd:IfEnd

  If M=0:Then
    [時間計算]
  Else If M=1:Then
    [時差計算]
  Else If M=2:Then
    [時間計算]
  
Else If M=3:Then 
    [時間計算] 

  IfEnd:
IfEnd
  IfEnd:IfEnd

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

WhileEnd

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



1.初期化処理
今回は、ドイツの夏時間フラグ S を追加して、これを 0 で初期化しておきます。
S = 0 は、標準時間であることを示します。

0→S

を追加します。



2.メニュー番号取得処理


[3] キーを押すと、メニュー変数 M に 3 を設定する。

メニュー番号取得処理のプログラム
-1→M
Do
Getkey→K
LpWhile K=0
K=25⇒0→M
K=35⇒1→M
K=36⇒2→M
K=37⇒3→M 
[今回追加]


[3] キーのキーコードは 37 です。




3.入力処理

ドイツ時間を、夏時間 - 標準時間 に切り替えるのみで、キー入力処理は行いません。ドイツ時間が切り替わっても、日本時間やロサンゼルス時間には影響が無いので、この時点での日本時間 J を分離して、「時」を 変数 A に、「分」を変数 B に入れておきます。

Else If M=3
Then
Int(J÷100)→A
J-100A→B
IfEnd



4.時間計算

夏時間になると時差が1時間減り、標準時間に戻る時は時差が1時間増えます。
但し、ドイツ時間が変わるだけで、日本時間やロサンゼルス時間は変化しません。

これを具体的にプログラムにすると、以下のようになります。

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"
IfEnd


この中で、以下の部分は、夏時間フラグの変更と時差の変更を行います。

  If S:Then
  0→S:P+1→P
  Else
  1→S:P-1→P
  IfEnd


現状が夏時間の時は、S=1 になっています。
  If S:Then
は、S1 の時の分岐処理なので、
夏時間フラグ:S 0 にし、時差:P を1時間増やします。

Else 以下は、現状が標準時間の時の処理で、
夏時間フラグ:S1 にし、時差:P を1時間減らしています。


この後に続く処理では、ドイツ時間を計算し、時間表示サブルーチン TZM を呼び出します。

  A-P→C
  C<0⇒C+24→C
  100C+B→G
  Prog "TZM"


入力処理のところで、現在の日本時間 J から「時」:A と「分」 B を算出するようにしました。
ドイツ時間は、日本時間の「時」 A と時差 P から計算するので、A - P でドイツ時間の「時」が得られます。

この計算の結果が負の数になる場合は、ドイツはまだ前日と言うことになります。この場合は、得られた負の数に 24 を足せば、24時制の「時」になります。

そこで、A - P を一旦変数 C に入れておき、それが負の数なら 24 を足しておきます。
   A-P→C
   C<0⇒C+24→C


ドイツ時間:G は、100C + B で計算できます。
   100C+B→G 

最後に、サブルーチン TZM を呼び出す
   Prog "TZM"


さて、画面表示サブルーチン TZM をドイツの夏時間に対応するように変更します。

サブルーチン TZM のプログラム
Locate 1,1,"0:JST"
Locate 1,2,"1:CET"
Locate 1,3,"2:PST"
Locate 13,2,"3:"
Locate 1,4,"<AC>:QUIT"

If S:Then
Locate 5,2,"ST"   [1:CET を 1:CEST に表示を切り替える]
Locate 15,2,"DL"  [3:ST を 3:DL に表示を切り替える]
Else
Locate 5,2,"T "   [1:CEST を 1:CET に表示を切り替える]
Locate 15,2,"ST"  [3:DL を 3:ST に表示を切り替える]
IfEnd


(赤文字は追加分)

下から3行目で表示するのは "T " で、 T の後に空白1文字が付加されていることに注意してください。この空白文字があることで、"ST" と表示されている2文字を"T " で上書きして、 表示を 1:CEST から 1:CET に変更できるわけです。


ヨーロッパの標準時間と夏時間の略称は、以下のように標準時間は3文字、夏時間は4文字の表記になっています。
そこで、略称の2文字目以降を T と ST で切り替えると、標準時間と夏時間の略称表示を切り替えられます。

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



5.時間の再表示


時間の再表示は、サブルーチン TZD で行います。これまでに作った 時間表示サブルーチン TZD のソースコードを示します。

サブルーチン TZD のプログラム
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


プログラムを起動した直後は、以下の画面になっています。

38-TZ4_main 

先に、ドイツを夏時間に切り替えてから、時間を入力しようとします。つまりこの画面で [3] キーを押すと、以下のような画面になってしまいます。

40-TZ5_problem 

日本時間が 0000、ドイツ時間が 1700、ロサンゼルス時間が 0000 となっているのは、明かに異常です。

しかし、プログラムを上から順に見ながら確かめると、この状態ではどの地域の時間も入力していないので、当然このような表示になります。では、何が悪いのか?

要するに、この時点で各地域の時間を表示する意味がありません。むしろ表示してはいけない、と考えます。

仮に、どこかの地域に時間を入力すれば、正しい時間が計算される筈です。試しに、日本時間に 20:00 を設定してみます。

41-TZ5_normal 

正しい時差で、時間が表示されているのが分かります。

どの地域にも時間を入力していない状態、つまりプログラム起動直後の状態では、サブルーチン TZD による時間表示が行われないようにすれば、この問題を解決できます。

このような細かい処理は、メインルーチンを変更するよりも、サブルーチンで対処した方が、プログラムは分かりやすくなるので、TZD をどのように変更すべきかを考えます。


1つの方法として、日本時間の変数 J を -1 で初期化する手があります。プログラムを走らせている時は、J が -1 になることは絶対にありません。と言うのも、INPI は仕様上、負の値を戻すことが無いからです。一回でも、どこかの地域に時間を入力すれば、J0 か正の値になるわけで、-1 は初期状態を示すためだけに使えます。敢えて、J-1 で初期化するのが、今回の作戦です。

言い換えれば、変数 J に、初期状態フラグとしての働きも持たせるわけです。
そこで、サブルーチン TZD では、J の異常値 -1 を検出させて、異常値なら何も動作しないで終了し、メインルーチンに戻るようにします。TZD の最初の行に、以下のコードを追加します。

J=-1⇒Return

Return コマンドは、プログラムを強制終了させます。サブルーチン内では、Return コマンドがあると、そのサブルーチンを直ちに終了させ、メインルーチンに戻ります。
 ⇒ Casio Basicコマンドリファレンス: Return


サブルーチン 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 の [初期化処理] ブロックでの J の初期化を -1→J に変更しておきます。

では、TZ を起動し、いきなり最初に [3] キーを押して、ドイツを夏時間にしてみます。以下のように、時間が表示されないことを確認してください。次に、日本時間を 20:00 にしてみます。ドイツ時間が 1300、ロサンゼルス時間が 0300 になっていれば正常です。

41-TZ5_normal 

では、[3] キーをもう一度押して、夏時間から標準時間へ戻してください。日本時間とロサンゼルス時間は、当然変化なしで、ドイツ時間が 1200 と表示され、プログラムが正しく動作していることがわかります。



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

メインルーチン:TZ のプログラム
8→P:17→Q
-1→J:0→G:0→U
0→S
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

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
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"
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 1,4,"<AC>:QUIT"

If S:Then
Locate 5,2,"ST"
Locate 15,2,"DL"
Else
Locate 5,2,"T "
Locate 15,2,"ST"
IfEnd




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




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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



関連記事

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

海外コミュニティ (UCF) での近況

 

海外の Casio電卓ファンのコミュニティーは幾つかありますが (リンクはこちら) 、いづれも国内では入手しにくい貴重な情報が得られるので、定期的にチェックしています。

中でも、UCF (Universal Casio Forum) は、投稿ペースがゆっくりなので、じっくり読んでじっくりと投稿できるスローペースが好きで、従って言語の壁もあまり苦にならず助かります。

本ブログで紹介したネタから、以下を投稿していますが、それなりに閲覧数が増えている(コメントはとても少ないものの...)ので、ネタとしてはオモシロイと受け止めて貰っているのだと、勝手に思っています。

- Fx-5800P: Secret Of Keycode (キーコードの秘密): 閲覧数 2205

- Whack-A-Mole (もぐら叩き): 閲覧数 2061

ここでは、Your Project のコーナーで自分のプログラムを紹介したり、Casio Basic の質問コーナーで回答をもらえたりします。

質問コーナーを見てみますと、洋の東西に関わらず同じような疑問が出て参ります。それに対して、色々な方が回答を寄せています(私も、たまに回答しています)。

最近、fx-5800P 使いで、プログラミングに結構詳しい方(IT企業で仕事をしているプロの方)が現れ、色々と面白いプログラムを投稿するようになっていて、私としてはとても楽しみになっています。

1つ紹介すると、モンテカルロ法で円周率を求める計算を fx-5800P でやってみた、と言うのがあります。
「そのプログラムは何の目的か?」という無粋な質問に対して、「単なる興味」とあっさり切り捨てる一コマもあり、投稿者の人柄を想像できて面白いです。私も、自分なりにプログラムを改造して、さっそくやってみました。

0→I:0→O:1→D
Lbl 1
Ran#2+Ran#2<1⇒Isz I

Isz O:Isz D
Locate 1,1,D
Locate 1,2,(I÷O)X4
Getkey=0⇒Goto 1


短いプログラムですが、表示が段々円周率に近づいてゆくのを眺めるのも、チョット面白いものです。

円とそれに外接する正方形があって、その正方形にランダムに玉を投げつけます。そして玉数が増えてくると、玉が当たった跡が、全体にランダムですが均等に増えてゆきます。そして、正方形全体に当たった跡の数と、円内に当たった跡から、円周率を計算すると言うのが、モンテカルロ法です。ヤタラメッタラ玉を投げつけるだけで、円周率が分かると言うのも面白いですね。

あまり精度良く計算する方法ではありませんが、簡単なプログラムで数字の動きを眺められるわけです。


英語という大きな壁がありますが、ご覧になってみるのも一興です。
e-Gadgetをご覧頂いている方のお一人が、最近UCFでプログラムを投稿なさっているのは、しっかりチェックしていたりして...(^^;)

関連記事

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

Casio Basic入門25

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門24


前回は、日本時間を入力したら、ドイツ時間とロサンゼルス時間を表示するところまで、作りました。
今回は、ドイツ時間やロサンゼルス時間を入力したら、日本、ドイツ、ロサンゼルスの時間を表示するように、プログラムを書き足してゆきます。

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



Chapter5-3
同様の機能を追加する

起動時の画面は以下のようになります。

35-TZ1_main  

今回追加する機能は、[1] キーを押してドイツ時間 (CET) を入力させ、[2] キーを押してLA時間を入力させ、それぞれの場合に日本時間、ドイツ時間、ロサンゼルス時間を計算し、その結果を画面表示する機能を作ります。


1.初期化処理
新たに追加する変数は、予期しない値にならないように、初期化しておく。

2.メニュー番号取得処理
ループの中で Getkey コマンドを使って、[1] キーが押された時、メニュー変数 M1 を設定する。
さらに、[2] キーが押された時、メニュー変数 M2 を設定する。
なお、この処理では、何かキーが押されるまでプログラムは先に進まず、入力待ちの状態にする。

3.入力処理
M=1 の時、入力処理を行い、その結果を ドイツ時間の変数 G に入れる。さらに、G から「時」と「分」を分離する。
M=2 の時、入力処理を行い、その結果をLA時間の変数 U に入れる。さらに U から「時」と「分」を分離する。

4.時間の計算
M=1 の時、入力されたドイツ時間に基づき、日本時間とロサンゼルス時間を計算する。
M=2 の時、入力されたロサンゼルス時間に基づき、日本時間とドイツ時間を計算する。

5.時間表示の更新
日本時間、ドイツ時間、ロサンゼルス時間の表示を更新する。

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


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

[初期設定]

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

While 1


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

  If M=0:Then
    [日本時間入力処理] (時間から「時」と「分」の分離も行う)
  
Else If M=1:Then
    [ドイツ時間入力処理] (時間から「時」と「分」の分離も行う)
  Else If M=2:Then
    [ロサンゼルス時間入力処理] (時間から「時」と「分」の分離も行う)
  IfEnd:IfEnd

  IfEnd:

  If M=0:Then
    [時間計算]
  
Else If M=1:Then
    [時差計算]
  Else If M=2:Then
    [時間計算]
  IfEnd:IfEnd

  IfEnd

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

WhileEnd

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


この方針で、プログラムを具体的に書いてゆきます。



1.初期化処理


今回は、ドイツ時間の変数 G とロサンゼルス時間の変数 U を追加します。
前回、J を 0 で初期化したのと同じ理由で、GU0 で初期化しておきます。

0→G:0→U

を追加します。



2.メニュー番号取得処理


[1] キーを押してドイツ時間入力をさせ、[2] キーでロサンゼルス時間を入力させるので、この部分を追加します。

メニュー番号取得処理のプログラム
-1→M
Do
Getkey→K
LpWhile K=0
K=25⇒0→M
K=35⇒1→M  [今回追加分]
K=36⇒2→M  
[今回追加分]


[1] キーのキーコードは 35 、 
[2] キーのキーコードは 36 です。



3.入力処理

ここで用いる「入力ボックス:INPI 」 については、以下を参照してください。
 ⇒ fx-5800P プログラムライブラリ - 入力ボックス
 ⇒ Casio Basic入門24: 世界時間換算プログラムを作る の Chapter 5-2


ドイツ時間の入力処理
1:CET の右横、(X, Y) = (8, 2) の位置に、4桁の入力ボックスを表示し、小さいインジケータ(▶E)を表示するので、ソースコードは以下のようになります。変数 G は、ドイツ時間を格納する変数です。
省略入力への対応、時間から「時」と「分」を分離する処理は、前回作った日本語入力処理と同様に、サブルーチン: TZC が受け持ちます。

8→X:2→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
Z→G


ロサンゼルス時間の入力処理
2:PST の右横、(X,Y) = (8, 3) の位置に、4桁の入力ボックスを表示し、小さい確定ガイド(▶E) を表示するので、プログラムは以下のようになります。変数 U は、ロサンゼルス時間を格納する変数です。
上と同様にして、サブルーチン: TZC を使います。

8→X:3→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
Z→U



以上を追加すると、入力処理は以下のようになります。

メインルーチン [入力処理] ブロックのプログラム
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
IfEnd:IfEnd

IfEnd


(赤文字は今回追加分)


サブルーチン:TZC のプログラム
If M=0:Then
8→X:1→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z→J
IfEnd


(変更はありません)



4.時間計算

メインルーチン TZ に処理を追加します。

M=1 の時、入力したドイツ時間から日本時間とロサンゼルス時間を得る処理
サブルーチン TZC での簡易入力機能の結果、0:05 としたい場合は 2405 と入力する必要があり、その場合は A の値が 24 を超えることになります。

・ドイツ時間:
  - 「時」 = A (サブルーチン TZC で、時間から「時」を分離して得た値)
   但し、A が 24以上になる場合は、24 を引く
   プログラムは、
    A≧24⇒A-24→A
   
となる。
  - 「分」 = B (サブルーチン TZC で得られた値)
  - ドイツ時間: G = 100A + B
   プログラムは、
    100A+B→G 
   
となる。


・日本時間: ドイツ時間に時差 P (8時間) を足す
 - 「時」 = A + P (一旦、変数 C に代入しておく)
  但し、A + P = C が 24以上になる場合は、24 を引く (この場合は日付が変わる)
  プログラムは、
   A-P→C
   C≧24⇒C-24→C
  
となる。
 - 「分」 = B
 - 日本時間: J = 100C + B (サブルーチン TZC で得られた値)
  プログラムは、
   100C+B→J 
  
となる。

・ロサンゼルス時間: 日本時間から時差 Q (17時間) を引く
 - 「時」 = A + P - Q (一旦、変数 C に代入しておく)
  但し、A + P - Q の結果が 0 未満になる場合は、24 を足す (この場合は日付が変わる)
  また、A + P -Q24 以上になる場合は、24 を引く (この場合も日付が変わる)
  プログラムは、
   A+P-Q→C
   C<0⇒C+24→C
   C≧24⇒C-24→C

  
となる。
 - 「分」 = B
 - ロサンゼルス時間: U = 100C + B
  プログラムは、
   100C+B→U
  
となる。

以上のようにして、J (日本時間)、G (ドイツ時間)、U (ロサンゼルス時間) が計算できます。ここまでを、まとめておきます。

日本、ドイツ、ロサンゼルスの時間を計算するプログラム
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
IfEnd:
IfEnd


(赤文字は追加分)


M=2 の時、入力したロサンゼルス時間から、日本時間とドイツ時間を得る処理

M=1
の時とほぼ同様の処理となります。

・ロサンゼルス時間:
  - 「時」 = A
   但し、A が 24以上になる場合は、24 を引く (この」場合は日付が変わる)
   プログラムは、
    A≧24⇒A-24→A
   
となる。
  - 「分」 = B
  - ロサンゼルス時間: U = 100A + B
   プログラムは、
    100A+B→U 
   
となる。

・日本時間: ロサンゼルス時間に時差 Q (17時間) を足す
 - 「時」 = A + Q (= C とおく)
  但し、A + Q の結果が 24以上になる場合は、24 を引く (この場合は日付が変わる)
  プログラムは、
   A+Q→C
   C≧24⇒C-24→C
  
となる。
 - 「分」 = B
 - 日本時間: J = 100C + B
  プログラムは、
   100C+B→J 
  
となる。

・ドイツ時間: 日本時間から時差 P (8時間) を引く
 - 「時」 = A + Q - P ( = C とおく)
  但し、A + Q - P の結果が 0 未満になる場合は、24 を足す (この場合は日付が変わる)
  また、A + Q - P が 24 以上になる場合は、24 を引く (この場合も日付が変わる)
  プログラムは、
   A+Q-P→C
   C<0⇒C+24→C
   C≧24⇒C-24→C

  
となる。
 - 「分」 = B
 - ドイツ時間: G = 100C + B
  プログラムは、
   100C+B→G 
  
となる。

以上のようにして、J (日本時間)、G (ドイツ時間)、U (ロサンゼルス時間) が計算できます。ここまでを、まとめておきます。

メインルーチン [時間計算] ブロックのプログラム
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
IfEnd:
IfEnd
IfEnd


(赤文字は追加分)



5.時間の再表示


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

サブルーチン TZD のプログラム
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




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

メインルーチン:TZ のプログラム
8→P:17→Q
0→J:0→G:0→U
Prog "TZM"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
K=25⇒0→M
K=25⇒1→M
K=36⇒2→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
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
IfEnd:IfEnd

IfEnd

Prog "TZD"

WhileEnd




サブルーチン:TZM のプログラム (メイン画面表示):変更なし
Locate 1,1,"0:JST"
Locate 1,2,"1:CET"
Locate 1,3,"2:PST"
Locate 1,4,"<AC>:QUIT"




サブルーチン:TZC のプログラム (時間を「時」と「分」に分離):変更なし
If Z<100:Then
Z→X:0→Y
Else
Int(Z÷100)→X
Z-100X→Y
IfEnd




サブルーチン TZD のプログラム (時間の表示):変更なし
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




今回は、ドイツ時間やロサンゼルス時間を入力した時の処理を追加しました。
次回は、ドイツ時間の夏時間設定機能を追加してゆきます。



つづく...


CasioBasic入門26 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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



関連記事

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

fx-5800P 素因数分解 - バグ修正と表示変更

2014/11/15: 掲載プログラムの転記ミスを修正しました。


素因数分解再び の記事で紹介したプログラムについて、すけっぴぃさんから、バグの報告 (「素因数分解再び」のコメント) を頂きました。

素因数分解した結果に、素数の2乗が含まれる時、その素数の2乗が素数に分解されず、そのまま残って、素数でないのに素数として結果表示されると言う問題です。

例えば、45 ( = 32 × 5) の素因数分解の結果が 9 × 5 となってしまうが、135 ( = 33 × 5) は、正しく結果表示されると言う問題です。


かなり前に頂いたご指摘なのに、すぐに対処できないまま時間が経ってしまい申し訳ありません。最近時間に余裕が少しできたので、調べたところ、原因が分かりました。


本文にあるコードの赤文字の部分の1行目(あるいは以下のプログラムの10行目)にある

Y≦D



Y<D

に変更することで、バグの解消ができました。


これまでのプログラムは、素因数を見つけるたびに表示するようにしていましたが、実はこの仕様にしっくりきていませんでした。
そこで、素因数分解の計算を終了後、まとめて結果を表示するように変更してみました。


プログラムを起動した時の画面:

素因数分解Startup


数を入力する:

素因数分解Input 


素因数分解を最後まで計算したあとで、結果を表示:

素因数分解DisplayResult 

1行表示されたら [EXE] キーを押して次の行を表示させます。
これを繰り返して、上のように <EXE> が表示されたらそれが最後の素因数です。
ここで、 [EXE] キーを押せば最初の入力画面に戻ります。

4行を超える結果になる場合は、再び1行目から上書きします。


プログラムは以下のようにしました。かなりヒドイ転記ミスがありましたので、修正したものを再掲載します [2014/11/15]

 素因数分解_改造版ソース 
 
LpWhile Y≧1 の下に、表示のための処理を追加してみました。
 
また、17行目、Do ループの中に表示のために必要な配列変数への代入処理を入れています。

配列変数は、通常の変数よりもアクセスにかなり時間がかかることが分かっていますので、今回の改造で、全体の計算速度が低下する筈です。

そこで、計算速度を、前回のプログラムと比較してみました。

入力した自然数結果前回プログラムでの計算時間今回プログラムでの計算時間
123453 x 5 x 8232.5秒2.2秒
12345626 x 3 x 6433秒2.6秒
1234567127 x 972176.5秒
123456782 x 32 x 47 x 145938秒6.6秒
12345678932 x 3607 x 38033分2分43秒
98765432132 x 172 x 37972133秒28秒
9876543223 x 37 x 33366743秒27秒
98765433 x 227 x 1450312秒11秒
9876542 x 3 x 97 x 16976.5秒5秒
987655 x 197538秒7秒
987622 x 3 x 8233秒2秒

それほど大きな違いは出ていません。結果として、Doループを何度も回る時間に比べて配列変数アクセスによる速度低下が無視できる程度だと思います。

fx-5800P は同じ計算でも計算時間に結構なバラツキがあることが、最近分かってきました。これについては、クロック回路に起因する可能性が考えられるとの情報があり、その場合はクロック精度が数%バラツクのも説明できそうで、温度の影響もありそうです。

このあたりは、こちら (fx-5800Pの速度差) (fx-5800P プログラムのバックアップ のコメント) が 情報源です。

従って、今回の測定から、処理速度はほぼ同じ、と言うべきでしょう。但し、1234567 の素因数分解だけは、どうもよく分からない結果ですね。

手元で測り直したら7秒程度でした。本エントリーはボロボロでした(-_-;)

ご指摘頂いた santaro様、ありがとうございます。



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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



keywords: fx-5800P素因数分解、プログラム関数電卓

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


関連記事

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

Casio Basic入門24

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門23 を見る

「世界時間表示プログラム TIME ZONE 」 を実際に作ってゆきます。

Chapter 5 では、以前実際に考えたり作ったりしたことを振り返るために、以前の記事やCasio Basicコマンドリファレンスへのリンクも紹介してゆきます。

プログラムを作る時は、できるだけわかりやすくソースコードを書く ことを心がけます。機能追加が楽になり、バグの発生も少なくなるからです。そして、最初から欲張って多くの機能を盛り込もうとはせずに、全体の骨組みになる部分から作り始めます。その後、徐々に機能を追加するのが確実です。今回は、サブルーチンをうまく使ってゆきます。

そこて、最初に大まかな方針を作ります。


大まかな方針

方針1. 1 画面内で表示と入力を行う。
  → 入力ボックスを使う

方針2. 最初に、日本・ドイツ・ロサンゼルス(LA)時間の換算プログラムを作り、後から機能追加して夏時間の計算とヨーロッパ・北米のそれぞれのタイムゾーンへの変更と計算をできるようにする。

方針3. ドイツは8時間、ロサンゼルスは17時間だけ日本時間から戻せば(引き算)すれば良い。これは夏時間でない時。

方針4. 時間は24時制を使う。

方針5. 時間は 1024、930 といった整数で扱い、時間を格納する変数には、この整数を入れる。

方針6. 時間表示は、必ず4桁表示とする。例えば 1024、0930、0010 、0004 など、3~1桁の場合は頭に 0 を付加する。4桁に揃えないと、一覧表示が見づらく、勘違いする可能性が増える。

方針7. 大きな骨組みとして、プログラム構造を考える。

 [初期設定] 
 [初期表示]
 While 1
   [メニュー番号取得処理]
   [メニュー番号に応じた入力処理]
   [メニュー番号に応じた時間計算]
   [時間表示の更新]
 WhileEnd


方針8. あとは、実際に作りながら考え、細かいところは必要に応じて変更する。


今回作成するのは、日本時間を入力すると、中央ヨーロッパ時間と北米太平洋時間を表示する機能です。

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



Chapter5-2
Getkey、入力ボックス、Locate の活用

では、大まかな方針に従って、具体的にプログラムを書いてゆきます。

先ず最初に、日本時間を入力すると、ドイツとロサンゼルスの時間を表示する機能を作ります。

画面デザイン

メイン画面を以下のようにします。

35-TZ1_main   

0:JST
これは日本時間です。[0] キーを押すと日本時間を入力します。項目 1 や 2 で海外の時間を設定した場合は、それに合った日本時間を、ここに表示します。

1:CET
これは、中央ヨーロッパ時間 (Central Europe Time)で、プログラム起動時の初期設定を CET とします(私の好みです...)。[1] キーを押すと CET の時間を入力します。ドイツ、フランス、イタリアなど多くの国がこのタイムゾーンに含まれます。項目 0 や 2 で時間を設定した場合は、それに合った CET 時間がここに表示されます。ドイツが含まれるので、しばらくはドイツ時間と言うことにします。

2:PST
これは、アメリカの太平洋時間 (Pacific Standard Time)で、プログラム起動時の初期設定を PST とします。[2] キーでの入力や表示については、上と同様です。ロサンゼルス(LA)が含まれるので、しばらくはロサンゼルス時間と言うことにします。


この画面を作るプログラムは、以下の通り。

Locate 1,1,"0:JST"
Locate 1,2,"1:CET"
Locate 1,3,"2:PST"
Locate 1,4,"<AC>:QUIT"


上の方針で決めたように、後で機能追加する時に、夏時間を設定する機能や、タイムゾーンを変更する機能を追加します。その時、前回紹介したようにタイムゾーンの略称を現地で使われるように変更する予定なので、画面表示を変える必要がでてきます。つまり、上の5行のプログラムは、徐々に複雑になることが予想されるので、画面の表示をサブルーチンにしてメインルーチンから呼び出すようにします。

このようにすると、画面の表示を変える場合でも、メインルーチンを変更せずに済むので、プログラムがわかりやすいままで、バグの発生も抑えられる筈です。

画面表示サブルーチンのファイル名を TZM とします(メイン画面 → MainM なので、TZ + M )。
ちなみに、TZTIME ZONE の略称。

TZM のプログラム
Locate 1,1,"0:JST"
Locate 1,2,"1:CET"
Locate 1,3,"2:PST"
Locate 1,4,"<AC>:QUIT"



次に、メインルーチンを作ってゆきます。
メインルーチンのファイル名を TZ とします。TIME ZONE だから、TZ です。

ドイツと日本の時差は、夏時間でない時は8時間、ロサンゼルスとの時差は17時間です。この値は、プログラムで絶対に使うので、変数に入れておきます。ドイツとの時差を変数 P として 9 で初期化、ロサンゼルスとの時差を変数 Q として 17 で初期化します。
8→P:17→Q


ここまでの TZ のプログラム
8→P:17→Q
Prog "TZM"




今回具体的に作るのは、[0] キーを押した時、日本時間 (JST) を入力させ、ドイツ時間とロサンゼルス時間を計算し、その結果を画面表示する機能を作ります。

1.メニュー番号取得処理
ループの中で Getkey コマンドを使って、[0] キーが押された時、メニュー変数 M0 を設定する。なお、この処理では、何かキーが押されるまでプログラムは先に進まず、入力待ちの状態にする。

2.入力処理
M=0 の時、入力処理を行い、その結果を 日本時間を格納する変数 J に入れ、0:JST の右に入力した時間を表示する。

3.時差計算
M=0 の時、入力された日本時間に対応したドイツ時間とLA時間を計算する。

4.時間表示の更新
日本、ドイツ、LAの時間の表示を更新する。

5.ループ構造
項目1~3の処理は繰り返し行うので、これらを While 1 ~ WhileEnd ループの中に入れる。


以上を、擬似的なプログラムで表現してみます。

While 1

   [メニュー番号取得処理] (ここで入力待ち)

  If M=0:Then
     [日本時間の入力処理
  IfEnd

  If M=0:Then
     [時間の計算] 
  IfEnd

  [時間表示の更新]


WhileEnd



While 1WhileEnd は無限ループです。PCなどのプログラムでは、無限ループはCPUパワーを無駄に食いつぶすだけでなく、プログラムを正常終了できなくなる可能性もあるので、基本的に使うべきではありません。特に Windows プログラミングでは、できるだけ速やかに制御を Windows (OS) に戻すのが作法です。

しかし、Casio Basic の場合は、[AC] キーを押せば、いつでもプログラムを終了可能で、終了のための特別な処理が不要です。従って、これまでに作ってきたプログラムも、[AC] キーで終了させるようにしています。従って、Casio Basic を用いた電卓プログラムでは、無限ループを積極的に利用します。




1.メニュー番号取得処理

Getkeyコマンドの使い方は、以下に詳しく説明していますので、まだよく分からない場合は参照してください。
 ⇒Casio Basic コマンドリファレンス: Getkey
 ⇒Casio Basic入門3: Getkey と Locate コマンドを使いこなす


条件ジャンプの ⇒命令については、以下のコマンドリファレンスや、過去のCasio Basic入門を参考にしてください。
 ⇒Casio Basic コマンドリファレンス: ⇒命令


メインルーチンTZ:メニュー番号取得処理のプログラム
-1→M
Do
Getkey→K
LpWhile K=0
K=25⇒0→M


[0] キーのキーコードは 25 です。


ここで、1つ大切な注意点:

最初に、変数 M を -1 で初期化しています。キーコード取得のための Do ループは、K の値が 0 の時ループを継続します。キーコードが 0 と言うのは、キーが何も押されていない状態を示します。

さて、このプログラムを起動する前に、電卓を様々な用途で使うわけで、その際に変数 M に 0 以外の何かの値が入ることが十分有り得ます。

もし、-1で M を初期化しておらず、M に 0 が入っていた場合、[0] 以外の何かキーが押されたことを想定します。その場合、このループを脱出して先に進み、M には想定外の値 0 が入っています。すると、[0]を押していないのに、メニュー番号0が選択されたと誤判定されます。このように想定外の M の値によって、プログラムが意図しない動作をするわけです(要するにバグ)。
そこで、変数 M を完全に把握して制御することで、プログラムを意図に従った動作以外できなくします。

このバグは簡単に発生します。メニュー番号変数 M は、0 以上の整数とするつもりなので、絶対にメニュー番号になり得ない -1 で初期化しておきます。

使う変数は、使う前に初期化をする癖を付けると、バグが入りにくくなってプログラミングが楽になります。



2.入力処理

本プログラム TIME ZONE では、時間を24時制とし、4桁の数字で時間を表すことにしています。
 ・10:24 は、1024
 ・9:30 は、0930
 ・0:20 は、0020
 ・6:00 は、0600
 ・0:05 は、0005


INPI の使い方

入力には、入力ボックス:INPI を使います。
Chapter 3 / Chapter 6 で 入力ボックス:INPI を作りました。その時に作ったプログラムが fx-5800P に残っていない場合は、先ず入力してください。INPI のソースコードは、以下にあります。

 ⇒ fx-5800P プログラムライブラリ - INPI 
INPI はバージョンアップ (Ver 2.0/2.1) し [Chapter 6 参照]、キー入力の反応が大幅に改善しています。 

INPI の使い方や動作について、詳しくは上記プログラムライブラリーを参照してください。


サブルーチン:INPIメインルーチンから呼び出す直前に、4つの変数 XYDE の値を設定します。INPI はこれらの変数を参照して動作します。

 ・X: 入力ボックス開始位置の X 座標
 ・Y: 入力ボックス開始位置の Y 座標
 ・D: 入力ボックスの桁数
 ・E: インジケータの表示方法(サイズ)を設定するフラグ、0 で大きな表示、1 で小さな表示

サブルーチン:INPI は、入力確定してメインルーチンに戻る時、変数 Z に入力値を格納します。従って、INPI の直後で、変数 Z の値を、メインルーチンで使用する変数に代入しておく必要があります。

INPI を使う時は、5つの変数(XYDEZ)は、その値が変化します。つまり、これらの変数をメインルーチンで使う時は、値が変化することを前提にしてください。

0:JST の横、(X, Y) = (8, 1) の位置に、4桁の入力ボックスを表示させ、小さいインジケータ(▶E)を表示させるので、プログラムは以下のようになります。変数 J は、上でも述べたように、日本時間を格納する変数です。

8→X:1→Y:4→D:1→E
Prog "INPI"
Z→J


INPI の変数とメインルーチンの予約変数
メインルーチンでは、日本時間 J、ドイツ時間 G、ロサンゼルス時間 U、時差 P, Q など、他のサブルーチンで勝手に変更されては困る変数があります。これを予約変数と呼び、他で値が変更されても構わない変数を使い捨て変数と呼んでいます。
INPIで使う変数は当然それらの値は変更されるので、メインルーチンの予約変数には使えません。

メインルーチンの予約変数は、以下のINPIで使う変数を避けて使います。

INPI で使う変数
 C: 入力中の桁数
 D: 入力ボックスの桁数
 E: 確定ガイドフラグ
 I: for文制御変数、入力キー
 K: キーコード
 X: 入力開始桁
 Y: 入力開始行
 Z: 入力数値
 配列変数 Z[n]n = 21~23, 25, 31~33, 35~37


・時間から「時」と「分」を分離して計算する

本プログラムでは、時差の計算が最も重要な仕事です。

時差は時間単位で決まっています。そこで、日本時間 10:24 に対して、例えばドイツ時間は 2:24 であり、「分」はそのままで、「時」だけが 8 減っています。

そこで、時間から「時」と「分」を分離して、「時」を変数 A に入れ、「分」を変数 B に入れておくと、時差計算が便利になります。

時間の変数に格納される整数について、下位2桁が「分」となります。例えば日本時間 J については、以下のようにすれば「時と「分」が得られます。

Int(J÷100)→A
J-100A→B


J の値が、3桁 (0905など)、2桁(0020など)、1桁(0005など)でも、この計算が正しいことは、試してみると分かります。

ここで使っている Int( ) 関数は、( ) 内の数値の整数部分を取り出すものです。
 ⇒ Casio Basicコマンドリファレンス: Int( ) / Frac( )


・省略した入力への対応

例えば、9:00 を入力したい時、900 と 3桁を入力するよりは、9 と1桁の入力で済ませた方が楽です。6:30 を入力するには、630 と 3桁入力が楽です。

INPI の最初のバージョンは fx-5800P では応答性があまり良くなく、キー入力が速すぎると、処理が追いつかずに入力を取りこぼすことがありました。そこで入力桁数を少なくできる省略入力機能をつけました。しかしその後バージョンアップして充分な応答性が実現しましたが、利便性を考えて、この機能を残します。

入力を省略できるのは、1桁および2桁入力の時で、入力したものを「時」として判断するようにします。そこで、入力して得られた数が2桁以下の時、つまり 100未満の数の時、その数は「時」であると判断させます。具体的には、以下のプログラムになります。

If J<100:Then
J→A:0→B

Else
Int(J÷100)→A
J-100A→B
IfEnd


これには、上記の「時」と「分」の分離計算を含みます。

但し、この計算は日本時間を入力する時だけでなく、ドイツ時間やLA間の入力時にも使いますので、サブルーチンにしておくことにします。

そこで、INPI 実行直後は、変数 Z は入力した時間になっているので、このサブルーチンでは、変数 Z で時間の値を受け取ります。サブルーチン実行後は、「時」を変数 X に、「分」を変数 Y に入れることにして、サブルーチン直後で、X→A:Y→B とすれば、メインルーチンの変数 A B に「時」」と「分」を受け渡しできます。

※ このロジックだと、例えば0時20分を入力するために 0020 と入力したり、0時5分を入力するために 0005 と入力すると、おかしなことになります。0020 と入力して [EXE] キーを押すと 2000 と表示され、0005 と入力して [EXE] キーを押すと 0500 と表示されます。0時xx分のときだけは、24xx と入力する必要があります。0時台の時間入力を例外的に 24xx と入力させるのですが、他の時間の入力の利便性を優先させることにします。

このサブルーチンのファイル名を TZC とします。計算 (Calculation) の C を使って、TZ + CTZC です。

サブルーチン:TZC のプログラム
If Z<100:Then
Z→X:0→Y
Else
Int(Z÷100)→X
Z-100X→Y
IfEnd



以上をまとめると、日本時間の入力処理は以下のようになります。

メインルーチンTZ:入力処理のプログラム

If M=0:Then
8→X:1→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z→J
IfEnd




3.時間の計算

・入力した日本時間からドイツ時間とLA時間を得る方法

さて、今後使う予定のメインルーチンの予約変数を先に決めておきます。

 ・J: 日本時間
 ・G: ドイツ時間 (中央ヨーロッパ時間)、実はドイツ = Germany から変数を G にしました。
 ・U: LA時間 (アメリカ太平洋時間)、アメリカ = USA から変数を U にしました。
 ・A: 入力した時間を分割した「時」
 ・B: 入力した時間を分割した「分」
 ・P: 日本とドイツとの時差
 ・Q: 日本とLAとの時差

AB、P、Q  から、J、G、 U を計算して、それを表示するのが、ここでの処理です。

・日本時間:
  - 「時」 = A
   但し、A が 24以上になる場合は、24 を引く (この場合は日付が変わる)
   コードは、
    A≧24⇒A-24→A
   
となる。
  - 「分」 = B
  - 時間: J = 100A + B
   コードは、
    100A+B→J
   
となる。

上記の省略入力機能では、0:05 と設定するために 0005 や 005 と入力すると 5:00 と認識され、このままだと 0:05 と設定できません。そこで、0:05 の代わりに、24:05 と設定すると、つまり 2405 と入力すれば 0:05 と認識できれば良いわけです。そこで、

A≧24⇒A-24→A

としました。

・ドイツ時間: 日本時間から時差 P (9時間) を引く
 - 「時」 = A - P (= C とおく)
  但し、A - P の結果が 0 未満になる場合は、24 を足す (この場合は日付が変わる)
  プログラムは、
   A-P→C
   C<0⇒C+24→C
  
となる。
 - 「分」 = B
 - 時間: G = 100C + B
  プログラムは、
   100C+B→G
  
となる。

・LA時間: 日本時間から時差 Q (17時間) を引く
 - 「時」 = A - Q ( = C とおく)
  但し、A - Q の結果が 0 未満になる場合は、24を足す (この場合は日付が変わる)
  プログラムは、
   A-Q→C
   C<0⇒C+24→C

  
となる。
 - 「分」 = B
 - 時間: U = 100C + B
  プログラムは、
   100C+B→U
  
となる。

日本時間が 7:00 の時、ドイツは時差8時間なので、「時」から 8 を引き算するのですが、7 - 8 = -1 となります。これは前日の 23:00 である筈なので、7 に 24 を足した上で、8 を引けば 23 が得られます。

日本時間が 7:00 の時、LAでは 前日の 14:00 ですが、7 から時差の 17 を引くと、-10 となってしまうので、上と同様にして、一旦 24 を足してから 10 を引く計算をします。

これが、C<0⇒C+24→C とした理由です。

以上のようにして、J (日本時間)、G (ドイツ時間)、U (LA時間) を計算できるようになりました。これをまとめておきます。

メインルーチン TZ:日本、ドイツ、LAの時間を計算するプログラム
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

Prog "TZD"
IfEnd



4.得られた時間を更新表示

時間を更新表示する部分は、何度も繰り返し使うので、サブルーチンにします。

ファイル名: TZD
表示 = Display なので、TZ + D から TZD としました。

先ずは、以下のプログラムが出発点です。

Locate 8,1,J
Locate 8,2,G
Locate 8,3,U


ここで、J は日本時間、G はドイツ時間、U はLA時間です。


時間の変数 J、G、U には、4桁だけでなく、3桁や 2桁、さらに1桁の場合もあります。一方で、大まかな方針で決めたように、表示は必要なら頭に 0 を加えて、必ず4桁の表示にします。

そこで、一旦 0000 と表示したところに、上書きして時間を表示します。

サブルーチン TZD のプログラム
Locate 8,1, "0000"
Locate 8,1,J
Locate 8,2,"0000"
Locate 8,2,G
Locate 8,3,"0000"
Locate 8,3,U



一旦、ここまでで メインルーチンTZのプログラムをまとめてみます。

メインルーチンTZ のプログラム
8→P:17→Q
Prog "TZM"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
K=25⇒0→M

If M=0:Then
8→X:1→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z→J
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
IfEnd

Prog "TZD"

WhileEnd



これを実行してみます。

日本時間を 8:04 にするとき、804 と3桁を入力してみると、以下のような表示になりました。

36-TZ1_wrong_time  

本来は、以下の表示になるべきなので、プログラムに問題があります。

0:JST      0804
1:CET     0004
2:PST     1504
<AC>:QUIT


日本時間の変数 J には 804 が、ドイツ時間の変数 G には 4 が、LA時間の変数 U には 1504 が入っています。
従って、
 ・Locate 8,1,J 804 を8桁目から表示
 ・Locate 8,2,G4 を8桁目から表示
しているので、おかしくなります。

Locate 8,3,U
は、変数 U に入っている4桁の数 1504 を表示するので、たまたま問題ない、と言うことが分かります。

そこで Locate コマンドでは、
 ・表示する数が、1桁の場合は、11桁目から表示
 ・表示する数が、2桁の場合は、10桁目から表示
 ・表示する数が、3桁の場合は、9桁目から表示
 ・表示する数が、4桁の場合は、8桁目から表示

となるようにすれば良いことが分かります。

そこで、変数 JGU の桁数が分かれば、それぞれ

 ・Locate 12-[J の桁数],1,J
 ・Locate 12-[G の桁数],2,G
 ・
Locate 12-[U の桁数],3,U

に変更できれば、うまくゆきます。あとは、数の桁数を知る方法があれば、問題解決です。

・・・・・・・・・・

いきなり解決策を提示します。
J に入っている数の桁数は、下記の式で求められます。

1+Int(log(J))

これは、自分のプログラムで多用しており、非常に便利なものです。この式について、詳しくは以下を参考にしてください。

Casio Basic入門: Locate

fx-5800P: Locate【桁数のコントロール】


これで、Locate で正しく時間を表示できるようになりました。

Locate 8,1,"0000"
Locate 11-Int(log(J)),1,J
Locate 8,2,"0000"
Locate 11-Int(log(G)),2,G
Locate 8,3,"0000"
Locate 11-Int(log(U)),3,U


但し、このままですと、日本時間を 0:00 にするために、0 を入力するとエラーが発生します。

実は、対数関数 log( ) を使う際の非常に重要なポイントを忘れていたからです。

対数関数 log( ) は、( ) の中の数は正の数でなければなりません。これは fx-5800P 固有の問題ではなくて、対数関数の定義です。時間は 0:00 となることがあり、日本時間の変数 J は、0:00 にするために、0 と入力すれば、0 になることがあります。日本時間が 8:00 の時は、ドイツ時間は 0:00 となり、ドイツ時間の変数 G の値は 0 になります。

幸いなことに、上の時間表示のソースでは、先ず最初に 0000 と表示してから、Locate コマンドで時間を上書きするようになっているので、時間の変数が 0 の時は、上書き表示を行わないようにすれば 0000 の表示のままで、00:00 を示します。

そこで、J が 0 でない時に時間表示を行うようにします。

例えば、Locate 11-Int(log(J)),1,J を

If J≠0:Then
Locate 11-Int(log(J)),1,J
IfEnd


とすれば良いわけです。

If 文の条件判定は、その条件が「真」なら Then 以下の処理を実行し、「真」でない( = 「偽」) ならば実行しないとなっています。

そこで、以下のようにしても良いですね。

If J:Then
Locate 11-Int(log(J)),1,J
IfEnd


「真」とは、J0 でないことで、J0 だと「偽」となります。


この3行の処理を、以下のように、スッキリと1行に記述することもできます。

J⇒Locate 11-Intlog(J)),1,J

条件ジャンプ命令 ⇒ を使っています。実は、上の If 文よりも ⇒ 命令の方が、処理速度が少し速くなります。

そこで、今回は ⇒命令を使ったコードを採用します。


If 文や ⇒命令について、詳しくは以下を参考にしてください。

Casio Basic コマンドリファレンス: If ~ then ~ IfEnd

Casio Basic コマンドリファレンス: ⇒ 命令 (条件ジャンプ)


そこで、TZD は以下のようになります。

サブルーチン TZD のプログラム
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


では、変更した TZD の動作確認のために、TZ を起動し、[0] キーを押して日本時間として 804 と入力してみます。
以下のように、目標通りに表示することを確認できました。

37-TZ1_correct_time 


log(J) は、J が正の数の時のみ正しく計算します。J が負の数の時はエラーとなります。
上のソースでは、J が 0 でない時に Locate 11-Int(log(J)),1,J を実行するようにしました。

J⇒Locate 11-Int(log(J)),1,J

対数関数 log( ) の定義では、J>0 とすべきです。これを具体的に書けば、

If J>0:Then
Locate 11-Intlog(J)),1,J
IfEnd


とすべきです。すでに、気付いて、オカシイと思われた方もいらっしゃるでしょう。


大きなうっかりミス

INPI は、負の数を扱わない仕様なので、INPI で入力すれば必ず 0 か正の数が得られます。プログラム上 J が負になる可能性はゼロです。

上の If J>0 を使ったソースのままで、もし万一 J が負になる場合は、表示が 0000 のままになります。エラーが出ずに、間違った結果を表示することになり、このバグに気付かないかも知れません。

従って、プログラム上は、絶対に J が負にならないが、他の理由で J が負いなることがあるかどうか?
もしあれば、その原因を最初から潰す必要があります。

・・・・・・・


正直に言えば、私は当初 J が負になるケースを全く想定していませんでした。でも、何度か使っているうちに、Argument ERROR (引数エラー) が発生し、問題に気付きました。うっかりしていました。

J が負になる可能性が、1つ残っていました。

電卓で他のプログラムを走らせたり、何か計算を行っている時に、J に負の数が入る可能性があります。しかし、本プログラムが起動した直後は J の値は決まっていません。と言うのも J が初期化されていないからです。

J が 0 の時は、上記のサブルーチン:TZD で対数関数 log( ) を使う時の対処で、 問題に対処できています。
プログラムが起動する前に J に負の数が入っている可能性を取り除くには、初期化処理において J を 0 で初期化します。

0→J

を、初期化処理に追加することにします。


使う変数は、できるだけ初期化してその値を確定しておくのが安全だと、再認識しました。



ここまでで、作ったプログラムは、以下の通り:

メインルーチン TZ のプログラム
9→P:17→Q
0→J
Prog "TZM"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
K=25⇒0→M

If M=0:Then
8→X:1→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z→J
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
Prog "TZD"
IfEnd

WhileEnd




サブルーチン:TZM のプログラム (メイン画面表示)
Locate 1,1,"0:JST"
Locate 1,2,"1:CET"
Locate 1,3,"2:PST"
Locate 1,4,"<AC>:QUIT"




サブルーチン:TZC のプログラム (時間を「時」と「分」に分離)

If Z<100:Then
Z→X:0→Y
Else
Int(Z÷100)→X
Z-100X→Y
IfEnd




サブルーチン TZD のプログラム (時間の表示)
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





今回は、日本時間を入力したら、ドイツ時間とLA時間が表示されるところまで、作りました。
次回は、ドイツ時間やLA時間を入力した時の処理も追加してゆきます。



つづく...


Casio Basic入門25 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



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

商品詳細を見る



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

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


関連記事

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

Casio Basic入門23

Casio Basic入門
<目次>

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


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

前回: Casio Basic入門22 - Chapter 4


Chapter 5

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

スマホや携帯電話には、世界の主要都市の時間を教えてくれるアプリがあります。私がスマホで使っている「世界時計アプリ」を紹介します。

SmartPhoneHomePage 

ベルリン、ロサンゼルス、日本の現在の時間が一目瞭然です。

では、ロサンゼルスの朝9時に合わせて電話したいけど、日本時間で何時になるのか?
世界時計は、その答えを教えてはくれません。

さらに、サンフランシスコ、オックスフォード(イギリス)、日本の三カ所の人が、Skypeで会議をしたいけど、全員に負担のない時間帯にするには、何時に電話会議を設定したらいいのか?
答えを知るには、苦労するのではありませんか?

これらの問題を解決するのが、今回紹介するプログラムです。


時差について

まず時差について、簡単に整理してみます。

アメリカの大陸部では、西の端と東の端では時差が3時間あり、これらの地域の間には4つのタイムゾーンがあります。これに加えてアラスカ、ハワイなどのタイムゾーンがあります。ニューヨークの朝10時はロサンゼルスでは朝7時になります。

カナダは6つのタイムゾーンがありますが、そのうち4つは、アメリカの大陸部と同じです。そこで、アメリカとカナダの大陸部をひっくるめて、北米と言うことにします。

ヨーロッパはもっと複雑で、5つ以上のタイムゾーンがあります。

さらに、北米やヨーロッパには夏時間があり、夏と冬では1時間時間が変わります。夏時間が始まる時と終わる時は、北米とヨーロッパでは異なる日時が設定され、それらは毎年異なります。従って、時差の計算は結構面倒で、うっかりすると間違えてしまいます。



世界の時間換算プログラム:TIME ZONE

私は日常的に海外とのやりとりをしているので、各国の時間を調整するのがいつも面倒でした。慣れていて頭の良い人なら、パッパッパと暗算できるのですが、見ていると計算を間違えることがよくあります。

そんなことから、日本、ヨーロッパ、北米のどれかの時間を入力したら、他の時間が連動して表示される「世界の時間換算プログラム」が欲しくなり、Casio fx-5800P の Casio Basic で作ったプログラムが、TIME ZONE です。

ほぼ毎日愛用しています。

以下からソースコードのPDFをダウンロードできます。
fx-5800P Casio Basic ソースコードのダウンロード ⇒ TimeZone


以下のような画面です。

34-Get Good_Time 

操作も表示も1画面内に収まっていて、ダラダラとスクロールすることもありません。これも換算プログラムの一種で、これまでに作った入力ボックス INPI を利用しますので、必要になります。
入力ボックス fx-5800P 専用


メニュー番号は、0 から 4 の5つ。これらの数字キーを普通に押してそれぞれの機能を呼び出します。さらに、これらのキーを長押しすることで、別の機能を呼び出せるように作っています。

換算プログラムは、類似の機能を積み重ねて作る傾向の高いプログラムなので、サブルーチンをうまく使うことがポイントになります。Chapter 5 では、この「世界の時間換算プログラム:TIME ZONE」をつくりながら、サブルーチンの使いこなしを紹介します。

先ずは、入力して使ってみるのも良いと思います。

TIME ZONE 操作一覧

0:JST - 
日本時間 の入力と表示
       [0] キー: 日本時間入力

1:CET - ヨーロッパ時間の入力と表示
       [1] キー:    ヨーロッパ時間入力
       [1] キー長押し: ヨーロッパ内のタイムゾーン設定
       [3] キー:    ヨーロッパの夏時間ON/OFF
       [3] キー長押し: 夏時間の期間を表示
     
2:EDT
- 北米時間の入力と表示
       [2] キー:    北米時間入力
       [2] キー長押し: 北米内のタイムゾーン設定
       [4] キー:    北米の夏時間ON/OFF 
       [4] キー長押し: 夏時間の時間を表示



Chapter5-0
プログラムの仕様

1. 基本機能
 日本、ヨーロッパ、北米の3地域の時間を、同時に表示する。
 どれかの時間を変更すると、他の2つの時間も連動して変わる。

2. タイムゾーンの設定
 ヨーロッパと北米については、それぞれ4つのタイムゾーンから選択できる。

3. 夏時間の設定
 ヨーロッパと北米については、それぞれ夏時間かそうでないかを設定できる。

4. 夏時間の開始 / 終了日時
 ヨーロッパと北米については、夏時間の開始と終了の日時を表示する。

5. 時間入力の方法
 e-Gadget オリジナルの入力ボックス INPI を使う。



Chapter 5-1
TIME ZONE プログラムの完成形

先ずは、最終的に完成したプログラム TIME ZONE の使い方から説明します。


TIME ZONE の起動

[FILE] キーを押して、プログラムリストを表示、TIME ZONE を選びます。

1-Menu 

プログラムが起動すると、以下のような表示になります。

2-Startup 

ここで、メニュー番号 0 ~ 2 は、
0: 日本時間)
1: ヨーロッパ時間
2: 北米時間
に対応しています。

0:JST
JST は、日本標準時(Japan Standard Time)の略称です。海外では JST と呼ばれます。

1:CET
CET は、中央ヨーロッパ時間(Central Europe Time)の略称で、現地で広く使われている名称です。

2:PST
PST は、北米の太平洋標準時間(Pacific Standard Time)の略称、現地で広く使われている名称です。

メニュー番号 3 と 4 は、それぞれヨーロッパの夏時間設定、北米の夏時間設定を行います。

アルファベットと数字のみの表示で、一見よくわからないかも知れません。fx-5800P はアルファベットと数字の表示しかできませんので、しかたありません。大きさが限られた画面の中で、うまく使うために、メニュー項目には、ヨーロッパや北米でよく使われているタイムゾーンの略称を使っています。タイムゾーンは、同じ時差の地域をまとめた地域を意味します。

調べたい都市や国が、どのタイムゾーンに入るかを調べておいて、それを使うようにします。タイムゾーンについては以下で説明します。


時間の入力

[0]
 キーを押すと、日本標準時の入力ボックスが現れ、4ケタの数字を入力できます。

3-JST_inputBox 

ここで、4桁の数字 1420 を入力し、

4-JST_inputBox2 

[EXE]キーを押して入力を確定すると、ヨーロッパと北米の時間も同時に表示されます。

5-JST_input 

日本時間 14:20 は、中央ヨーロッパ時間で 6:20 、北米の太平洋時間では 21:20 だと分かります。



夏時間の設定

ここで、[3] キーを押すと、ヨーロッパ時間が夏時間になります。

6-DL_at_EU 

1:CET  0620



1:CEST 0720

に、その表示が変化します。

CET は中央ヨーロッパ標準時間で6:20だったのが、夏時間に変えると、中央ヨーロッパ夏時間の略称の CEST に変わって、時間が 7:20 に変わりました。このように、メニュー3 とメニュー4 は、それぞれヨーロッパ時間と北米時間の夏時間の設定を行います。

[3] キーと[4]キーをもう一度押すと、夏時間から標準時間へ戻ります。

ヨーロッパと北米では、夏時間の開始と終了の日時が異なるので、メニュー3 と 4 でそれぞれ別に設定します。

ところで、
ST は Standard Time の略で標準時間のことです。
DL は Daylight Saving の略で夏時間のことです。

夏時間を、よくサマータイムとも言いますが、この言葉を略すると ST となり、標準時間と区別がつきません。

ヨーロッパではサマータイムと言うことがありますが、アメリカでは デイライト・セービング と言います。そこで、夏時間をデイライトセービングの略を使って、DL として、標準時間の ST と区別することにしました。

上の写真を見ると、3:ST3:DL に変わってるのが分かり、現在は夏時間を示していることが分かります。

[3] と [4] は、押すたびに STDL が切り替わる「トグル動作」をします。

[3] をもう一度押して、標準時間に戻しました。

5-JST_input 



タイムゾーンの設定と変更

ヨーロッパのタイムゾーンのうち、TIME ZONE では、以下の4つを選んで変更できます。
- WET: 西ヨーロッパ時間、West Europe Time: イギリスやポルトガルなど
- CET: 中央ヨーロッパ時間、Central Europ Time: ドイツ、フランス、イタリアなど
- EET: 東ヨーロッパ時間、East Europe Time: フィンランド、トルコ、ウクライナ、ギリシャなど
- FET: 極東ヨーロッパ時間、Fareast Europe Time: モスクワなど


ヨーロッパのタイムゾーンは、以下のようになっています。
EU-TZ 
Time-J.net 世界時計 - 世界の時間と時差 - ヨーロッパのタイムゾーンについて から引用


イギリスのタイムゾーンを GMT と言うことが多いのですが、同じタイムゾーンにはポルトガルなども含まれますので、今回はGMTではなくて、WET (西ヨーロッパ時間、West Europe Time) という略称を使うことにしました。

モスクワ時間 (MSK UTC+3)という略称もよく使われますが、TIME ZONEでは極東ヨーロッパ時間 (FET) という略称を採用しました。モスクワ以外にもこのタイムゾーンに属する地域があるので、このようにしました。

なお、都市名で時差を設定する仕様にすると、fx-5800P の Casio Basic では、多くの主要都市名をプログラム中に書き込む必要があり、このように予め用意した都市名以外の時間を知りたい場合は、ネットなどでタイムゾーンを調べる必要があります。どうせ、タイムゾーンを調べる必要があるのならば、いきなりタイムゾーンの名称で設定しても労力は同じです。

従って、TIME ZONE プログラムでは、都市名ではなくてタイムゾーンを選択する仕様にして、汎用性を優先させました。


ヨーロッパのタイムゾーン設定を変更したい時は、[1] キーを長押し。すると以下のような「ヨーロッパのタイムゾーン設定画面」に切り替わります。

8-Select_EU_TimeZone 

現在設定されているタイムゾーンは、⇒ マークが示しています。ここで、矢印キーの左 [◀] か 右 [▶] を押して ⇒ マークを移動させます。この画面では、CET (中央ヨーロッパ標準時間) に設定されていることが分かります。

なお、夏時間に設定されているときは、ヨーロッパの各タイムゾーンの略称は、以下のような少し異なる略章で表示されます。

- WET (西ヨーロッパ標準時間) ←→ WEST (西ヨーロッパ夏時間)
- CET (中央ヨーロッパ標準時間) ←→ CEST (中央ヨーロッパ夏時間)
- EET (東ヨーロッパ標準時間) ←→ EEST (東ヨーロッパ夏時間)
- FET (極東ヨーロッパ標準時間) ←→ FEST (極東ヨーロッパ夏時間)

ヨーロッパでは夏時間をサマータイムと言って、各略称に S が加わります。


さて、タイムゾーン設定画面で、左矢印 [◀] を一回押すと、⇒マークが WET へ移動します。

9-Select_EU_TimeZone2 

ここで、右下の ▶E は、[EXE] キーを押すと、設定が確定することを示しています。

では、[EXE] キーを押して、タイムゾーンを WET で確定すると、時間表示の画面に戻ります。

10-WET 

CET (中央ヨーロッパ標準時間)では 6:20 だったものが、WET (西ヨーロッパ標準時間)では 5:20 に変化しました。CET のドイツでの 6:20 は、WET のイギリスでは 5:20 だと言うことも分かります。
この時 JST (日本)では 14:20であることは変化していません。
また、2:PDT  4:DL と表示されており、北米の太平洋夏時間では 22:20 だと示しています。

夏時間でのヨーロッパのタイムゾーン設定画面は以下のようになります。

18-TZSelect_EU_DL 

このように、タイムゾーンの設定を変える際に、夏時間であることが分かるので、勘違いを防げます。


ここで、例題です。
イギリスの朝9:30に電話で話をしたいと思えば、日本時間で何時に電話をかければ良いのか?

先ず、[1] キーを押して、入力モードに入ります。

11-inputWET  

4桁の「入力ボックス」が表示されたので、ここで 930 と3桁だけ入力します。

12-inputWET2 

これで、[EXE] キーを押して確定すると、

13-WET930 

1:WET の右には、0930 と表示されました。4桁すべてを入力せず、3桁入力も受け付けるようにしています。

日本時間 0:JST のところは、1830 と変わりました。日本の夕方の6:30に電話すれば、イギリスの朝 9:30 に話が出来ることが簡単に分かります。

入力の省略機能ですが、次のようなこともできます。

[1] キーを押して、ヨーロッパ時間を入力モードにし、2桁の 10 とだけ入力します。

14-WET1000input 

そして [EXE] キーで確定すると、以下の画面のように 1:WET  1000 と表示されます。

15-WET1000input3 

入力時に省略したものは 0 と判断しています。

では、9:00 を入力するのに、1桁の 9 とだけ入力しても、0900 と判断される筈です。

16-WET900input 

このように、4桁の入力ボックスに、1桁の 9 を入力して、[EXE] キーで確定すると、

17-WET900input2 

1:WET のところは、0900 となります。

このような入力の省略機能は、数行のプログラムコードで、とても簡単に実現できます。


次に、北米のタイムゾーンについて説明します。

北米には、アメリカとカナダでは、それぞれ異なるタイムゾーンがありますが、大陸部は共通した4つのタイムゾーンがあり、プログラム TIME ZONE では、以下の共通した4つのタイムゾーンを設定できるようにしています。

- PST: 太平洋標準時間(Pacific Time): シアトル、サンフランシスコ、ロサンゼルスなど
- MST: 山岳部標準時間(Mountain Time): ソルトレイクシティー、デンバーなど
- CST: 中部標準時間(Central Time): シカゴ、ダラス、ヒューストンなど
- EST: 東部標準時間(Eastern Time): ボストン、ニューヨーク、マイアミなど

プログラム起動時はPSTになっています。おおよそロッキー山脈より西側、例えばサンフランシスコはPST(太平洋時間)です。ロッキー山脈やそれより東側のふもと、例えばコロラド州などはMST(山岳部時間)です。それより東のシカゴやテキサスなどはCST(中部時間)です。一番東の大西洋側、例えばニューヨークやフィラデルフィアなどはEST(東部時間)です。

北米のタイムゾーンは以下のようになっています。

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

おおよそ南北の境界線で、4つのタイムゾーンに分けられていますので、ヨーロッパよりは分かりやすいと思います。


[2] キーを長押しすると、北米のタイムゾーン設定画面に切り替わります。

TZSelect_NA 

今は、⇒ マークが PST についており、太平洋標準時間に設定されていることが分かります。

矢印キー [◀][▶] を使って、⇒ マークを他のタイムゾーンに移動させ、[EXE] キーで確定します。

以下の画面では、2:PDT   4:DL と表示されており、北米は太平洋夏時間に設定されていることが分かります。

20-DL_NA 

ここで、[4] キーを使って、北米の標準時間と夏時間を切り替えることもできます。


同じ英語でもヨーロッパと北米では夏時間の言い方が変わるようで、北米では夏時間をサマータイムとは呼ばず、デーライトセービングタイム(Daylight Saving Time)と言い、各タイムゾーンの夏時間の略称は SD に置き換えて以下のように呼ばれます。

- PST (太平洋標準時間) ←→ PDT (太平洋夏時間)
- MST (山岳部標準時間) ←→ MDT (山岳夏時間)
- CST (中部標準時間) ←→ CDT (中部夏時間)
- EST (東部標準時間) ←→ EDT (東部夏時間)



夏時間開始と終了の日時を調べる

[3] キーか [4] キーのいずれかを長押しすると、以下の画面が表示され、ヨーロッパと北米の夏時間の開始と終了の日時が分かります。

27-TZInfo 

この表示内容は、プログラム中に書き込んであります。夏時間開始と終了の日時は毎年変わりますので、新しい年の開始と終了日時が分かれば、プログラムを変更して、表示内容を更新しておきます。



使い方の例

課 題
明日は2014年10月30日。モントリオールに出張中の担当者と、日本の居る私、そしてドイツのメンバーとで電話会議を行いたい。出張者は午前中に訪問先との約束があるので、早朝が良い。そこで、明日の2014年10月30日にモントリオール、ドイツ、日本のそれぞれの参加者の都合が良く、無理のない電話会議開始時間を決めたい。


まず、TIME ZONE を起動します。

2-Startup 


さて、2014年10月30日では、ヨーロッパと北米の夏時間がどうなっているのか、最初に知る必要があります。

上で紹介した Time-J.net などを利用して調べても良いのですが、それも面倒なので TIME ZONE には、夏時間の開始と終了の日時を表示する機能を持たせています。[3] キーか [4] キーを長押しすると、この情報を表示します。

27-TZInfo 

これを見ると、2014年10月30日時点で、ヨーロッパでは夏時間が終わって標準時間になっており、北米ではまだ夏時間です。

そこで、[4] キーで北米を夏時間にします。

28-Set_NA_DL   


2:PDT と表示されているので、太平洋夏時間です。モントリオールは東部時間のタイムゾーンにあるので、東部時間に切り替えます。

[2] キーを長押し、

21-TZSelect_NA_DL 

矢印キーで、東部発時間の EDT を選びます。

左矢印 [◀] キーを一回押すだけで、⇒ マークは右下へ移動します。

左矢印 [◀] キーを、ポン、ポン と叩き続けると、⇒ マークは、グルグルと巡回するようになっています。


⇒ マークを EDT に合わせた後、

22-TZSelect_NA_DL2 

[EXE] キーで確定すると、

29-Set_NA_EDT  

このように、タイムゾーンと夏時間の設定が終わりました。

なお、ヨーロッパは、1:CET、2:ST となっているので中央ヨーロッパ標準時、つまり2014年10月30日のドイツ
 の設定になっているので、ここは変更する必要はありません。

ここで、モントリオール時間を試しに、6:00 とします。
そこで、[2] キーを押して、入力ボックスさせ、

30-Input_NA_EDT  

6 と入力し、

31-Input_NA_EDT2 
  
[EXE] キーで確定すると、

32-Set_NA_EDT_at_600 
 
モントリオールの時間とともに、日本とドイツの時間も表示されました。

日本とヨーロッパの人は、この時間で良いのですが、モントリオールの人は、チョット朝が早すぎるようです。

そこで、6:30 に変更してみましょう。

[2] キーを押して、入力ボックスに 630 と入力し、

Change_NA_EDT_to_630 

[EXE] キーで確定すると、

34-Get Good_Time 

日本は19:30、ドイツは11:30、モントリオールは6:30なので、これで電話会議開始時間としましょう....

...といった使い方になります。


Chapter 5 では、このような「世界時間表示プログラム TIME ZONE」 を紹介してゆきます。




つづく...



Casio Basic入門24 / 目次




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

人気ブログランキングへ


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