Casio Basic入門29

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門28 を見る


前回は、ドイツ時間 (中央ヨーロッパ時間)  に限らず、ヨーロッパ内の4つのタイムゾーンを設定する機能を追加し、新たにタイムゾーン設定サブルーチン TZS のプログラムを提示しました。

今回は、矢印キーで項目を選択させるサブルーチン TZS の作り方を説明します。

今回までに作るプログラムを一番下に掲載しています(前回と同じ)。



Chapter5-7
矢印キーの活用

ヨーロッパのタイムゾーン設定画面を以下のように作ります。

42-TZSelect_EU   

⇒ マークが、現在設定されているタイムゾーンを示しています。

この画面は、S=, V=1 の時、中央ヨーロッパの標準時間を示しています。

サブルーチン TZS が起動する時、夏時間フラグ S の値が 0 か 1 かで表示を変えるようにします。さらに、タイムゾーン変数 V の値に応じて、⇒ マークの位置を買えるようにします。

46-TZSelct_EU_summer2   

この画面は、S=1, V=0 の時、夏時間の西ヨーロッパを示してます。

<Lt-Rt>

は、本来 <左-右> として、左矢印と右矢印を使って選択 ⇒ マークを動かすように説明を入れたかったのですが、fx-5800P は数字とアルファベットしか使えないので、左 = Left = Lt、左 = Right = Rt と勝手に決めて、表示したものです。

右下にある、

▶E

は、確定するには [EXE] キーを押すことを説明しています。

このあたりの表示は、単に私のこだわりですが、私が作るプログラムは操作性を統一し、簡単でも良いから操作説明を表示したいと思っているからです。

これから、TZS を作ってゆく際、動作確認のために、簡単なメインルーチンを使うことにします。

ここでは、仮にファイル名を A としますが、名前は何でもかまいません。

仮メインルーチン: A
0→S
1→V
6→M
Prog "TZS"


S は夏時間フラグで、標準時間の時は 0、夏時間では 1 です。
V はタイムゾーン変数で、0、1、2、3 のいずれかの値になります。
本来のメインルーチン TZ では、メニュー番号 M=6 の時、ヨーロッパのタイムゾーン設定を行います。
北米のタイムゾーンを設定する場合は、M=7 にする予定です。

メインルーチンでは、3つの変数 SVMTZS の動作を決めます。

タイムゾーン V 標準時間: S=0 夏時間: S=1 
西ヨーロッパ時間0WETWEST
中央ヨーロッパ時間1CETCEST
東ヨーロッパ時間2EETEEST
極東ヨーロッパ時間3FETFEST

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



1.初期表示

先ずは、変数の関係無く表示する部分の操作説明の表示を作ります。

Cls
Locate 15,4,"▶t"

Locate 16,4,"E"
Locate 1,4," <Lt-Rt>"


Cls で画面全体の表示をクリアします。

次の2行は、▶E を表示するためのものです。
2行目の ▶t は、プログラム編集画面で、以下の順にキーを押すと入力できます。

[FUNCTION]

[7] - 7:STAT

[3] - 3:DISTR

[4] - 4:▶t

このように、キーボードから入力できる 数字とアルファベット大文字以外の文字を使うことができます。
詳しくは、以下を参照してください。
 ⇒ Casio Basic入門14 - Chapter 2-10
 ⇒ 楽屋裏 - スプラッシュ


次に、メニュー番号 M が 6 の時、ヨーロッパのタイムゾーン選択画面を表示するので、先ずは M による条件分岐を行います。

Else If M=6:Then
[画面表示]
[項目選択]
IfEnd


変数 S と V の値に従って表示を行う [画面表示] の処理は、以下のプログラムになります。

Else If M=6
Then
V→Z
Locate 1,1," EUR TIME ZONE"
If S:Then
Locate 1,2," WEST  CEST"  (WESTの前にスペース2つ)
Locate 1,3,"  EEST   FEST"  (EESTの前にスペース2つ)
Else
Locate 1,2,"  WET    CET"  (WETの前にスペース2つ)
Locate 1,3,"  EET     FET"  (EETの前にスペース2つ)
IfEnd




2.項目選択

矢印キーを押したことを知るためには、キーコードを利用します。


左矢印キー [◀] のキーコードは 83、右矢印キー [▶] のキーコードは 86 です。

これまでもキーコードが出てきましたが、キーコードは取扱説明書に記載されています。
或いは、キーコードを調べるプログラムを使うのも便利です。

キーコードを調べるプログラムはとてもコンパクトなので、入力も楽です。Casio Basic入門3 ~ 8 で、その作り方を紹介しています。
 ⇒ fx-5800P プログラムライブラリ - キーコード取得
 ⇒ Casio Basic入門3


さて、[項目選択] 処理は、以下のような構造で作ります。ここで 変数 Z は、タイムゾーン変数です。

[変数 Z に基づく座標に ⇒マークを表示]
Do
Getkey→K

If K=86:Then
[右矢印キーが押された時の処理]
  1) ⇒マークを消去
  2) 変数 Z の値を更新
  3) 変数 Z に基づく新座標に⇒マークを表示

Else If K=83:Then
[左矢印キーが押された時の処理]
  1) ⇒マークを消去
  2) 変数 Z の値を更新
  3) 変数 Z に基づく新座標に⇒マークを表示

IfEnd:IfEnd
LpWhile K≠47


Do ~ LpWhile ループは、中に Getkey→K が入っていて、 [EXE] キー (キーコード 47) が押されない限り、ループを継続します。つまり、[EXE] キーを押すと、ループから抜け出て、タイムゾーン選択が確定するわけです。


Getkey で得られたキーコード(K) が86の時は、[右矢印キーが押された時の処理] を行います。
キーコード(K)が83の時は、[左矢印キーが押された時の処理] を行います。


矢印キーが押された時の処理
S=0、V=1 の状態で、タイムゾーン設定画面が表示されると、以下のようになります。


 EUR TIME ZONE
  WET  ⇒CET
  EET    FET
 <Lt-Rt>       ▶E


ここで、右矢印 [▶] キーが押されると、⇒ マークが左下の EET へ移動し、その後押されるたびに
EET → FET → WET → CET → EET (戻ってくる) → ・・・ 以降繰り返し・・・

ここで、左矢印 [◀] キーが押されると、⇒ マークが左の WET へ移動し、その後押されるたびに逆回りで、
WET - FET - EET - CET - WET (戻ってくる) - ・・・ 以降繰り返し ・・・

⇒ マークがそれぞれの位置へ移動する時の、タイムゾーン変数 Z の値、⇒ マークの位置(座標)は、以下のようになる。

変数⇒ の座標位置K=86K=83
タイムゾーン Z  X  Y [▶][◀]
WET022
CET182
EET223
FET383
 

Z の値の変化は、以下のプログラムで書けます。

[変数 Z に基づく座標に ⇒マークを表示]
Do
Getkey→K

If K=86:Then
[⇒マークの消去]
If Z=3:Then 0→Z
Else Z+1→Z
IfEnd

[⇒マークを移動先に表示]

Else If K=83:Then
[⇒マークの消去]
If Z=0:Then 3→Z
Else Z-1→Z
IfEnd

[⇒マークの表示位置移動]

IfEnd:IfEnd
LpWhile K≠47



⇒マークの位置は、現在選択されているタイムゾーンに対応します。つまり、タイムゾーン変数 Z の値から ⇒マークの座標を計算する作戦です。Z は、0 → 1 → 2 → 3 → 0 → 1 ・・・ と循環するので、その規則性を利用して計算できる筈です。

変数⇒ の座標位置K=86K=83
タイムゾーン Z  X  Y [▶][◀]
WET022
CET182
EET223
FET383
[▶][◀] キーが押された時、マークが移動する順序を、↓ で示しています。 

要するに、Z の値から、XY の値を計算できれば、とても簡単です。

正解(の1つ)を示します。

X = 2 + 6Z -12Int(Z/2)
Y = 2 + Int(Z/2)


この式は、基本的な考え方を知っていれば、簡単に導くことができます。

説明は後にして、先ずはプログラムを完成させます。⇒マークの消去と表示に関する部分を青文字で示します。

タイムゾーン設定サブルーチン 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

LpWhile K≠47



式を使って Z から XY を求めなくても、If 文で書くことも出来ます。ただその場合は12個の If 文が必要となり、プログラムの記述量が多くなり入力も大変になります。

ちなみに、計算式の代わりに If 文を多く使ったプログラムは、以下になります。以下の記述方法ですと、計算式が合計6行で済むところ、If 文を使って同じことをするにのに30行の記述が必要になります。


If 文を多用した 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

If Z=0
Then 2→X:2→Y
Else If Z=1
Then 8→X:2→Y
Else If Z=2
Then 2→X:3→Y
Else If Z=3
Then 8→X:3→Y
IfEnd:IfEnd
IfEnd:IfEnd
Locate X,Y,"⇒"


Do
Getkey→K

If K=86:Then
Locate X,Y," "
If Z=3:Then 0→Z
Else Z+1→Z
IfEnd

If Z=0
Then 2→X:2→Y
Else If Z=1
Then 8→X:2→Y
Else If Z=2
Then 2→X:3→Y
Else If Z=3
Then 8→X:3→Y
IfEnd:IfEnd
IfEnd:IfEnd
Locate X,Y,"⇒"


Else If K=83
Then
Locate X,Y," "
If Z=0:Then 3→Z
Else Z-1→Z
IfEnd

If Z=0
Then 2→X:2→Y
Else If Z=1
Then 8→X:2→Y
Else If Z=2
Then 2→X:3→Y
Else If Z=3
Then 8→X:3→Y
IfEnd:IfEnd
IfEnd:IfEnd
Locate X,Y,"⇒"

IfEnd:IfEnd
LoWhile K≠47


私は、個人的に大量の同じ記述を繰り返すのは好きではなく、同じ内容を式で実現できれば、簡潔で構造が分かりやすいプログラムを書けると考えます。プログラムのサイズ(所用バイト数)も、記述量が少ない法がコンパクトになり、fx-5800P の限られたメモリにより多くのプログラムを格納できます。どう考えても、簡潔で構造が分かりやすく、さらにコンパクトなプログラムの方が良いと思うのですが、如何でしょうか?



⇒マークの削除と表示の座標を計算で求める方法

⇒マークを消去したり表示するための座標(X, Y) の計算方法が簡単でなければ、この方法を採用する意味がありません。

以下の表は、Z の値と X や Y の値の関係を示しています。

変数⇒ の座標位置K=86K=83
タイムゾーン Z  X  Y [▶][◀]
WET022
CET182
EET223
FET383
[▶][◀] キーが押された時、マークが移動する順序を、↓ で示しています。 


X を見てみると、Z が 1 づつ増えるに従って、2 と 8 を繰り返しています。
このような繰り返しパターンが見られるとき、剰余系の考え方が使えます。

Z を 2 で割った時の余りは、0 か 1 で、余りの数で Z を2つのグループに分けられます。
Z を 3 で割った時の余りは、0 か 1 か 2 で、余りの数で Z を3つのグループに分けられます。
 ・
 ・

Z を m で割った時の余りは、0, 1, 2, 3,・・・, m-2, m-1 で、余りの数で Z を m個のグループに分けられます。

繰り返しパターンが見られる時は、繰り返しを余りの数で分類できます。

今は、2つの繰り返しなので、余りが 0 か 1 のどちらかに分類できて、0 と 1 が交互に現れるパターンです。

ZrX
002
118
202
318

r は Z を 2 で割った余りだと分かります。

この r を 6 倍して 2 を足せば X になる、つまり、

6r + 2 = X

となります。

従って、r つまり 「Z を 2 で割った余り」を計算できれば、Z から X を求める式がわかります。

Z を m で割った余り r は、

r = Z - m×Int(Z/m)

です。Int( ) は、( )の中の数の整数部を取り出します。
この余りの式を覚えておくと、様々なところで使えて、とても便利です。

以上から、m=2 でよいので、

X = 6r + 2
  = 6(Z - m×Int(Z÷m)) + 2
  = 6(Z - 2×Int(Z÷2)) + 2
  = 2 + 6Z - 12Int(Z÷2)


と、式にできました。一見突拍子もない式に思えるのですが、汎用性のある考え方を知っていれば、簡単に求められました。



次に、Y を見てみると、Z が 1 づつ増える時、Y は階段のようにふえてゆきます。

StepFunc 

このパターンには、階段関数の考え方が役立ちます。

Z が 2 増えるたびに s が 1 づつ増える。
Z が 3 増えるたびにs が 1 づつ増える。
  ・
  ・
Z が m 増えるたびに s が 1 づつ増える。

今回の Z と Y には、このパターンがはっきりとみえます。

ZsY
002
102
213
313

Y = 2 + s 

なので、Z から階段パターンの s が求まると、Y を計算できます。

s = Int(Z÷m)

この式も、階段パターンで使える便利なものです。

上の例では m が 2 なので、

Y = 2 + s
  =
2 + Int(Z÷2)

従って、

X = 2 + 6Z -12Int(Z/2)
Y = 2 + Int(Z/2)


が得られます。

プログラムは、以下になります。

2 + 6Z -12Int(Z÷2)→X
2+ Int(Z÷2)→Y



さて、ここで作った TZS は、冒頭で作った メインルーチン A で、S や V の値を変更して動作確認ができます。
夏時間 S (0, 1) と ヨーロッパのタイムゾーン値 V (0, 1, 2, 3 )を変えて、動作確認をしてみましょう。 



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

メインルーチン: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入門30 / 目次




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

人気ブログランキングへ


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