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

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



関連記事

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

コメントの投稿

非公開コメント

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

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR