Casio Basic入門19

Casio Basic入門
<目次>

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

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

前回: Casio Basic入門18 - Chapter 3


Chapter 4
はじめに

◆ Chapter 4 の目標: 換算プログラムを作る


Chapter 3
では、自由自在に入力を行うための 入力ボックスINPI (0以上の整数用)を作りました。INPI のプログラムや使い方は、プログラムライブラリ - 入力ボックス にまとめてあります。

そこで、Chapter 4 では、入力ボックスを利用して、換算プログラムを作ってみます。

[2015/01/17 追記]
Chapter 3 で作った入力ボックス INPIChapter 6 で大幅に応答性を向上させて INPI 2.1 にバージョンアップしています。プログラムライブラリ- 入力ボックス では、バージョンアップした INPI 2.1 のプログラムを掲載しています。本 Chapter では、バージョンアップした INPI を使うことをお勧めします。



Chapter 4-0
和暦・西暦換算プログラム

正の整数と0を入力できる「入力ボックス」を利用した換算プログラムとして、和暦・西暦換算プログラムを作ろうと思います。

変換の対象は、

・西暦
・明治
・大正
・昭和
・平成

です。どれかを入力すれば残りの年号で換算された結果が表示されます。

これだけではツマラナイので、オマケ機能を搭載します。

別の入力欄に西暦年を入力すると、その年での年齢を表示し、年齢を入力すると、その年齢になる西暦何年を表示する...そんな換算機能をオマケとして追加します。

実際の完成画面を見てみましょう。

YrConv2 

0:AD は西暦年を示します。この画像では、>>>> と表示されていて、4桁の入力範囲を示しています。
つまり、入力モードになっていて、右下に確定を促す  Eマーク が表示されています。
今この状態では 「入力ボックス」プログラム INPI が走っています。

なお、
1:M は明治、2:T は大正、
3:S は昭和、4:H は平成です。


YrConv3 

西暦に 1990 と入力して、[EXE] キーを押して入力を確定すると...この画像のような表示になります。

明治123年、大正79年、昭和65年、平成2年、と表示されます。平成2年以外の和暦年は実際に存在しない年号です。明治のままだったら123年と言うことです。

[4] を押すと、4:H に入力ボックスが現れ、そこに平成年を入力できます。すると、他の項目が連動して変化します。

どれでも好きな項目のメニュー番号を押して入力すれば、他の項目が連動して換算した年を表示します。


オマケ機能は、5:At6: y  で、これらに入力しても 項目0~4への影響はありません。つまりオマケ機能は別の変換機能と言えます。

YrConv4 

[5] を押すと、5:At が入力モードになります。

YrConv5 

5:At に 2020 と入力して確定すると、6: y6:30y に変化しました。
平成2年生まれの人は、At 2020 つまり、2020年では30歳、と教えてくれています。

ここで、項目6 に別の値を入力してみます。

YrConv6  

項目6が入力モードになっています。

ここで、40 を入力します。

YrConv7 

つまり、平成2年生まれの人が40歳の時は、西暦何年か?を調べることになり、

5:At2030

と表示されています。平成2年生まれ(西暦1990年生まれの人が40歳になるのは西暦2030年だと分かります。


この人が、高校卒業、つまり18歳の時は、西暦何年か?


項目6に18を入力すると、

YrConv8 


それは、2008年だと分かります。

YrConv9 


オマケ機能は、このように過去や将来の西暦年や年齢が簡単に分かるもので、履歴書を書いたり個人の歴史を振り返るのに使えると思います。


今回は、このような換算プログラムを作ってみます。



Chapter 4-1
最初にプログラム構造を考える

CasioBasic入門 をここまで進んでくれば、プログラムを作る前に全体の構造を決めることの大切さ がお分かりでしょう。そこで、今回も最初にプログラム全体の構造を考えることにします。

「入力ボックス」の動作確認用のメインプログラム CH3-1M を一度経験していれば、同様の構造で良いことが分かります。

プログラムの構造

[初期設定]    (変数の初期設定)

[初期化処理]    (表示の初期化)

While 1

 [メニュー番号取得]    (押されたキーからメニュー番号を得る)

 [入力処理]    (入力ボックス INPI を使う)

 [計算と出力処理]    (換算値の計算とその表示)

WhileEnd


次に、このプログラムで使う予約変数、つまりサブルーチンで変更されては困る変数を決めます。入力ボックスで使っている変数とかち合わないようにします。入力ボックスで使っている変数は こちら を参照のこと。

メインルーチンの予約変数
A: 西暦年
M: 明治年
T: 大正年
S: 昭和年
H: 平成年
N: メニュー番号

それぞれ、分かりやすいアルファベットを使っています。但しメニュー番号は、メニューのM を使いたいところですが、明治年で M を使うので、メニュー番号には N を使うことにします。

INPI で使っている変数と重複しないこと!


使い捨て変数については、プログラムを作りながら決めてゆけば良いので、ここでは決めません。但しサブルーチンで変更されても良いように、各ブロック内で使い切ることを意識してゆきます。

「使い切る」とは、ブロック内では変更されては困るが、ブロックの処理が終われば、その変数はどのように変更されても、プログラムの動作に一切影響が無い....ように使う、という意味です。


換算計算の概略

換算プログラムで一番大切なのが換算計算です。おおまかな方針を決めます。

そのために必要なものは、各和暦の元年(1年)の西暦年です。Googleなどで検索すれば分かりますね。

・明治元年: 1868年
・大正元年: 1912年
・昭和元年: 1926年
・平成元年: 1989年


西暦年 A を入力したとき
・明治年: A-1867→M
・大正年: A-1911→T
・昭和年: A-1925→S
・平成年: A-1988→H

と、各和暦年を計算できます。

試しに1868年はどうなるか?
明治元年(1年)なので、1867を引き算すれば良いですね。
各和暦の元年に相当する西暦年よりも1だけ小さい値を引き算すれば良いことが確認できました。


明治年 を入力したとき
・西暦年: M+1867→A

ここで、西暦年がAが得られるので、各和暦年は西暦年から換算するようにします。
・大正年: A-1911→T
・昭和年: A-1925→S
・平成年: A-1988→H

和暦を西暦年から換算するようにすれば、同じ計算で済むのでバグが入りにくいわけです。
さらに他の和暦への換算も、同じ計算の繰り返しになるので、計算をサブルーチンで行うことでプログラムの効率化が出来ます。


以下、同様にして...

大正年 を入力したとき
・西暦年: T+1911→A
・明治年: A-1867→M
・昭和年: A-1925→S
・平成年: A-1988→H


昭和年 を入力したとき
・西暦年: S+1925→A
・明治年: A-1867→M
・大正年: A-1911→T
・平成年: A-1988→H


平成年 を入力したとき
・西暦年: H+1988→A
・明治年: A-1867→M
・大正年: A-1911→T
・昭和年: A-1925→S

これらは、まず最初に西暦年を求め、次に西暦年から各和暦年を計算すると言う順序です。従ってプログラムも、この順序で計算するようにします。

まずは、おまけ機能なしで、西暦と和暦の換算を実装してゆきます。


プログラムの構造

[初期設定]    (変数の初期設定)

[表示の初期化] 

While 1

 [メニュー番号取得]    (押されたキーからメニュー番号を得る)

 [入力処理]    (入力ボックス INPI を使う)

 [計算と出力処理]    (換算値の計算とその表示)

WhileEnd



Chapter 4-2
西暦・和暦換算プログラムを実装する

西暦・和暦換算プログラム名を CH4-2 としましょう。各ブロックのプログラムソースは以下のようになります。


[初期設定] ブロック


0→A

全ての計算は西暦年 A を基準に行うので、Aを 0 で初期化しておきます。


[表示の初期化]

Locate 1,1,"0:AD"
Locate 11,1,"<AC>
"
Locate 1,2,"1:M"
Locate 10,2,"2:T"
Locate 1,3,"3:S"
Locate 10,3,"4:H"


これは、特に説明が不要だと思います。


[メニュー番号取得]

-1→N
Do
Getkey→K
LpWhile K=0
K=25⇒0→N
K=35⇒1→N
K=36⇒2→N
K=36⇒3→N
K=21⇒4→N


Getkey の引数に K を使っています。入力ボックス INPI でも Getkey の引数に K を使っています。
キーコード K を得たら直ちに、メニュー番号 N に置き換えているので、INPI で K を使っても影響がありません。キーコード K は使い捨て変数として、このブロックで使い切っているので、問題はありません。

なお、メニュー番号は、変数 M としたいと頃ですが、明治年に M を使うので、M の 次のアルファベット N をメニュー番号にしました。


[入力処理]

If N=0:Then
5→X:1→Y:4→D:1→E
Prog "INPI":Z→A
Else If N=1
Then
4→X:2→Y:4→D:1→E
Prog "INPI":Z→M
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→T
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→H
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd


ここでは、If ~ Else If 。。。。 IfEnd を使って、それぞれのメニュー番号に応じた入力を行っています。
入力ボックス INPI に渡す引数として、変数 X (入力開始の桁位置), Y (入力開始の行位置), D (入力桁数), E (確定モードの表示方フラグ) を設定した後 Prog "INPI" を実行。
その直後に、INPI の戻り値である Z を必要な変数に代入しています。

If や Else If ごとに1つのブロックと考えて良いわけで、それぞれのブロックで、変数X, Y, D, E, Z を使い捨て変数として使い切っているので、このように何度も使っても問題ありません。 

If および Else If で出てくる If の数と同じだけの IfEnd を最後に持ってきています。この数を間違えないことが重要です。


[計算と出力処理]

If N=0:Then
Prog "YRC"
Else If N=1
Then
M+1867→A
M=0⇒Isz A
Prog "YRC"
Else If N=2
Then
T+1911→A
T=0⇒Isz A
Prog "YRC"
Else If N=3
Then
S+1925→A
S=0⇒Isz A
Prog "YRC"
Else If N=4
Then
H+1988→A
H=0⇒Isz A
Prog "YRC"
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd


ここでは、サブルーチン YRC を多用しています。なんども同じ処理を行うなら、サブルーチンにした方がプログラムソースがわかりやすくなります。

サブルーチン YRC では、項目1 (西暦年) から 項目4 (平成年) に表示する換算値を一気に表示するルーチンです。
YRC には、変数 A (西暦年) と N (メニュー番号) を引数として渡すようにします。YRC では 西暦年 A に従って、明治、大正、昭和、平成の各年を計算し、それを表示する処理をさせることにします。

プログラムの記述は、ほぼ同じことの繰り返しになっているので、記述量が多くなっていますが、とくに難しいことをしていないことはお分かりだと思います。

なお、青文字で示した部分は、無くても良いかも知れません。各和暦年は正の整数で、0 (ゼロ) はあり得ません。バージョンアップした INPI では0の入力ができるようになっています(Chapter 3 で作ったものは0の入力ができません)。そこで和暦年が絶対に 0 (ゼロ) にならないように、誤って 0 (ゼロ) と入力された時は強制的に 1 にするための処理が、青文字の部分です。

YRC には西暦年 A を渡します。YRC へ渡す西暦年 A は、和暦が 0 (ゼロ) の時に 1 だけ増やす処理をしています。こうしておくと、サブルーチン YRC での計算では和暦0年にならずに、和暦1年 (元年) と計算されます。


サブルーチン: YRC

If N=1:Then
A-1867→M
Else If N=2
Then
A-1911→T
Else If N=3
Then
A-1925→S
Else If N=4
Then
A-1988→H
IfEnd:IfEnd
IfEnd:IfEnd

A-1867→M
A-1911→T
A-1925→S
A-1988→H
Locate 5,1,"     "
   (スペース5個)
A>0⇒Locate 5,1,A
Locate 4,2,"      "
  (スペース6個)
M>0⇒Locate 4,2,M
Locate 13,2,"    "
  (スペース4個)
T>0⇒Locate 13,2,T
Locate 4,3,"      "
  (スペース6個)
S>0⇒Locate 4,3,S
Locate 13,3,"    "
  (スペース4個)
H>0⇒Locate 13,3,H


各年号の計算は、最初に予定した通りです。

赤文字で示した部分は、マイナスの年数を表示しないための処理です。
マイナスの年数は意味が無いばかりか、桁数が想定外に大きくなり、さらにマイナス記号の分も表示桁が増えるので、画面表示を乱します。これを避けるための処置が必要になります。

一気に駆け抜けてしまいましたが、特に新しいコマンドや処理を使っていないので、Casiobasic入門の最初から読んでいれば、分かると思います。


プログラム名: CH4-2

0→A

Locate 1,1,"0:AD"
Locate 11,1,"<AC>
"
Locate 1,2,"1:M"
Locate 10,2,"2:T"
Locate 1,3,"3:S"
Locate 10,3,"4:H"

While 1

-1→N
Do
Getkey→K
LpWhile K=0
K=25⇒0→N
K=35⇒1→N
K=36⇒2→N
K=36⇒3→N
K=21⇒4→N


If N=0:Then
5→X:1→Y:4→D:1→E
Prog "INPI":Z→A
Else If N=1
Then
4→X:2→Y:4→D:1→E
Prog "INPI":Z→M
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→T
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→H
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd

If N=0:Then
Prog "YRC"
Else If N=1
Then
M+1867→A
M=0⇒Isz A
Prog "YRC"
Else If N=2
Then
T+1911→A
T=0⇒Isz A
Prog "YRC"
Else If N=3
Then
S+1925→A
S=0⇒Isz A
Prog "YRC"
Else If N=4
Then
H+1988→A
H=0⇒Isz A
Prog "YRC"
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd

WhileEnd




プログラムの記述量が多いので、ちょっと面倒に思えますが、それでも 入力ボックス INPI やサブルーチン YRC を使うことで、記述量はかなり減りました。


次回は、おまけ機能を実装してゆきます。



つづく...


CasioBasic入門20 / 目次




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

人気ブログランキングへ


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