Casio Basic入門1

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現などは随時追記・修正します.
最終更新:2019/08/31


はしがき
[2014/11/03追記]

fx5800P_calcfx-5800P を買ってきてプログラムを作ってみようと思い、取扱説明書を見ると、プログラムが分かる人向けのヒントくらいしか書かれていません。

これはヒドイ!!(以前は良かったのに...このあたりは「1.はじめに」で紹介してます)

とりあえずプログラミングを始めたものの、細かいことは、色々と試行錯誤を繰り返さないと分かりません。こうして、取扱説明書には書かれていない詳しいことが、少しづつ分かってきました。

プログラムを作りながら色々と調べているうちに、fx-5800P に搭載されているプログラミング言語:Casio Basic は、かなり優れモノだと分かってきました。プログラミング経験者向けに Casio Basic の面白さを一言で紹介すると、「電卓で使える構造化BASIC風言語 」 です。

なかなか優れている Casio Basic なのに、こんな取扱説明書では、さっぱり使いこなせない人が多いだろうし、経験者が取扱説明書を読むと、未だに古い Basic 風言語と変わらないと思うだろうし、良さを知らないままにプログラミングを諦める人も多いだろうと思うので非常にもったいないと思います。

"新世代 Casio Basic" が使える fx-5800P は、非力なプロセッサしか積んでいないにもかかわらず、まともな実用プログラムを作れます。さらに、fx-5800P はプログラムを呼び出して使う利便性が高く、高機能な fx-9860GII や fx-CG20 よりも便利なことは、あまり知られていないのではないでしょうか? 

自分の必要性に合わせて、いくつもの実用プログラムを作ってみて、分かったこと試してみたこと を含めて、取扱説明書では絶対にわからない Casio  Basic の使いこなしを整理したものが Casio Basic 入門 講座です。それと並行して、取扱説明書では絶対にわからない Casio Basic のコマンドリファレンス 、逆引き Casio Basic を公開しています。

「1.はじめに」 では、Casio Basic や fx-5800P の歴史や特徴を私見を交えて書いていますので、「2.プログラミングとは」まで飛ばしてもらって結構です。



1.はじめに [2015/01/04 修正]

私が初めて手にした電卓が、カシオのFX-502Pという関数電卓でした。手帳サイズでプログラミングできる画期的な製品で、世界中にカシオファンを増やした原動力となったようです。

fx-502P 
手帳タイプのソフトカバーが付属した FX-502P

私がFX-502P を入手した当時は、関数電卓として使っていて、プログラミングの「プ」の字も知りませんでした。その後プログラムに興味を持ち、生まれて初めて作ったのが、FXー502Pのプログラム「反射ゲーム」
画面表示が変化した直後に、どれだけ早く反応してキーを押せるか...そんなゲームでした。
 ⇒ FX-502P / 602P / 603P のプログラム

カシオはFX-502Pに続いて、プログラム互換性の高い後継機として、1981年にFX-602P、1990年にはfx-603Pを発売しました。
FX-602P には取扱説明書だけでなく、「プログラムライブラリー」と言う厚い本が付属していて、それには数多くの実用プログラムが掲載されていました。掲載されているプログラムを入力し、理解し、さらに自分なりに改造することで、プログラミングがどのようなものか、少し分かりました。きちんと動作するサンプルプログラムを参考にして、自分でプログラムを改造する作業が、プログラミングの学習には非常に有効だと実感しました。

これらのプログラム機能は、今思えばアセンブリ言語に近い感じで、電卓のメモリに直接あるいは間接的にアクセスして、ジャンプはインクリメント/デクリメントを行うことができるなど、工夫のしがいがある面白いもので、プログラミングの好きな人には楽しく遊べるものでした。

その後登場したプログラム互換のFX-602P や FX-603P は、アルファベット表示が可能になり、記憶容量が増えたことで、測量計算などの実用に耐えるプログラム関数電卓として不動の地位を得てきました。プログラム言語としての完成度、ハードウェアとしての使いやすさがユーザーに支持された結果でしょう。


プログラミング言語仕様から読み解く Casio Basicの開発史 [2019/08/31 追記修正]

カシオは、プログラム関数電卓とグラフ関数電卓、そしてポケットコンピュータの3系統で、搭載言語の開発を進めている時期がありました (プログラム電卓メモワール1990-12 参照)。ポケットコンピュータはPCの高機能化、小型化、低価格化により市場からその姿を消しました。プログラム関数電卓では、fx-4850P を最後にプログラミング言語のバージョンアップを止め、新製品が出なくなりました。そして、唯一グラフ関数電卓が搭載言語とともに進化してゆきました。

プログラム関数電卓 fx-4000番台の製品に搭載された言語は、試行錯誤の跡がみられ、このシリーズ最終機種の fx-4850P の搭載言語は中途半端な仕様のまま成功せずに終わったと感じています。fx-4850P のハードウェアデザインは fx-5800P に引き継がれましたが、搭載言語はシリーズ初号機の fx-4000P の仕様が 現在の Casio Basic に引き継がれています。

一方で、グラフ関数電卓での搭載言語は着実な進化を見せました。fx-7400Gで初めてBasicコマンドが搭載され、1996発売の CFX-9850G には、ついに GetkeyLocate コマンドが搭載され、現在の世代のCasio Basic に近づきました。但し空行改行や If 文の Then や Else の直後での改行がエラーになる、コード編集画面がデフォルトで上書きモードになるなど、実用的なプログラミング言語としてはもう一歩という感じでした。しかし、これは Casio Basic の歴史上極めて重要な一歩だと言って良いと思います。GetkeyLocate が、Casio Basic の実用性を格段に向上させているからです。⇒ プログラム電卓温故知新 - CFX-9850G の最後の項目 "プログラム電卓の系譜" を参照。


翌年の 2006年に登場した fx-9860G は、基本的に CFX-9850GC PLUS の Casio Basic をベースに改行の問題を解決し、コード編集画面がデフォルトで挿入も度に変更され、プロット系コマンドのバグとも言える理解不能な仕様がうまく整理されました。ここでようやく現在の "新世代 Casio Basic" が登場しました。

fx-9860G の搭載言語からグラフィックス関連とシリアル通信関連のコマンドを取り去り、さらにいくつかのコマンドが改良したものが fx-5800P に搭載されました。fx-9860G 発売と同年のことでした。


fx-5800P での改良点の代表的なものを挙げてみます。

入力命令 ?A では、変数 A に既に入っている値を表示し、変更がなければ [EXE] キーを押すだけで確定できる機能が追加されました。一方、?→A とすれば、A の値を表示せずに新たに入力させます。この ?A の機能は、変更が無ければ [EXE] を押すだけで良いので、作成したプログラムの使い勝手が格段に向上します。現在のところ、この機能があるのは、fx-5800P と fx-FD10 Pro のみで、グラフ関数電卓にはこのような便利な機能はありません。

[FILE] キーでプログラムリストを表示し、そこからプログラムを実行できる機能も、fx-5800P の利便性を向上させる優れた改良だと思います。これが可能なのは、他には fx-FD10 Pro のみです。グラフ関数電卓では、一旦プログラムモードに入らないとプログラムを呼び出せません。

fx-9860G にあった グラフィックス関連とシリアル通信関連のコマンドは、fx-5800P にはありません。fx-5800P をプログラム関数電卓に位置づけるなら、グラフィックス関連のコマンドは不要といっても良いと思いまが、シリアル通信関連コマンドは残して欲しかったと思います。さらに、電卓とPCの間でプログラムファイルをやりとりするPCリンク機能が無いのも fx-5800P の利便性を発揮しきれない仕様上の大きな弱点です。

このような弱点があるものの、fx-5800P は、グラフ機能の無いプログラム関数電卓として、極めて大きく進化した "新世代Casio Basic" を搭載し、プログラム電卓としてバランスの取れた、そして関数電卓としても使いやすい優れた製品です。

歴史を少し遡って、プログラム関数電卓として大成功を納めた FX-502P や FX-602P の最終進化形 の FX-603P は、結果的に21世紀に入っても販売が続き、その製品寿命は10年以上の長きにわたりました。趣味ではなく仕事用に実用プログラムが使われ続け、ユーザーの大きな支持に答え続けた結果なのだと思います。FX-603P の実用品としての完成度の高さの証明でもあります。FX-603P に取って代わるプログラム関数電卓が永らく登場しませんでした。

※参考: プログラム関数電卓ノスタルジア(Casio fx-502P、fx-602P、fx-5800P)

さて、グラフ関数電卓で熟成してきた新世代 Casio Basic を機能制限して搭載した fx-5800P は、しばらく FX-603P と併売されていましたが、ついに FX-603P が生産中止となりました。fx-5800P が プログラム関数電卓 FX-603P の後継機となったわけです。

その後も Casio Basic の改良がグラフ関数電卓で続き、fx-9860Gシリーズで文字列処理コマンドが追加搭載され、ハードウェアとしては高精細カラー液晶搭載した fx-CG10/20 が登場しています。そして 2015年1月時点での最新機種、fx-FD10 Pro は、fx-5800P の利便性と最新の Casio Basic を搭載したハイブリッド機とでも言える、面白い性格を持っています (fx-FD10 Pro は Casio Basic専用機です。fx-9860GII とほぼ同じハードウェアを使いながらアドインが使えない設定にした判断は、販売戦略上のものなのでしょう)。

気がつけば、新世代Casio Basic搭載のプログラム関数電卓 fx-5800P は、2006年の登場から12年を超えており、その製品寿命を超える可能性も見えてきました。使用しているIC類などの部品調達の継続性を考えれば、FX-603P と同様に 10年を1つの区切りとすれば、2019 年には fx-5800P の後継機種が期待されるところです。

2014年12月に、スタンダード関数電卓の新シリーズ fx-JP500, fx-JP700, fx-JP900 (CLASSWIZ シリーズ) が発表され、順次発売が開始されました。高精細液晶の搭載、省電力でありながらCPUの大幅な処理速度向上、その他様々な改良が加えられ、死角が殆ど無い関数電卓と言えます。fx-JP900 のみに搭載された表計算機能 は、データ保存機能が無いので実用的とは言えないものの、実力をアピールする意味は十分にあります。この表計算が、操作性やユーザーインターフェースの面でグラフ関数電卓 fx-9860GII に似ていることは、大変興味深いのです。

高精細液晶と高速・省電力CPUと言う新しいハードウェアに加えて、グラフ関数電卓と酷似した表計算機能を新ハードウェアで走らせる機能のアピールは、発売開始から12年目の fx-5800P の後継機種がそろそろ現実性を帯びてきているのではないかと、大きな期待を寄せています。 

[2018/10/31 追記]:fx-CG50 が登場
2017年春に fx-CG10/20 の後継機として fx-CG50 が欧米で発売開始され、同年10月に日本国内で発売されました。fx-CG50 は fx-CG10/20 とほぼ同じ仕様で、消費電力が大幅に抑えられ、処理速度が大幅に向上しました。そのデザインは fx-JP900 と極めて似通ったものになりました。

最新のグラフ関数電卓 fx-CG50 (2017) 
Casio fx-CG50 の概要

カシオは、プログラム電卓については欧米ならびに中国市場を中心に考えているののが残念なところですが、シャープがプログラム電卓開発から事実上撤退している状況で、日本企業として唯一カシオがプログラム電卓の開発を続けていることは、歓迎したいと思います。但し、特にグラフィック関連は、マクロ言語を出自とする故かVRAMへの転送速度が非常に遅いことから、fx-CG50でさえグラフィックスプログラミングを自由に行えるレベルには至っていません。

さてこのような状況下で、fx-5800P の後継機種の動向が気になります。fx-JP900 と fx-CG50 と同様のデザインで、これらの中間サイズの グラフィック機能を割愛したプログラム関数電卓が fx-5800P の後継として登場すれば面白いと思います。

===== 追記おわり ====


fx-5800Pの特徴

最新の Casio Basic から見れば、fx-5800P 搭載の Casio Basic はサブセット版と言えますが、プログラム関数電卓として不要な機能を省略しただけで、新世代 Casio Basic 搭載機としては、低価格で使い勝手の良い絶妙なバランスの製品です。

上て述べたように、fx-5800P の最大にして唯一の欠点が、作ったプログラムをPCにバックアップすることが出来ない点で、なんとも中途半端な仕様になっています。非常にもったいない。なぜこんな中途半端な仕様にしたのか?機会があれば、是非ともカシオに話を聞きたいところです。

fx-5800P で作ったプログラムは、もう1台の fx-5800Pへ転送することはでき、そのための通信ケーブルがオプションで用意されています。バックアップしたいなら「もう1台買って下さい」と言うわけです。 ここを参照

ところで、この通信ケーブル(3pinシリアルケーブル)は、fx-9860GII や fx-CG20 にUSBケーブルと共に標準添付されているものです。

fx-5800P の後継機種では、同様に3PシリアルケーブルとUSBケーブルを標準添付してPCリンク機能を実現してもらいたいものです。これがあれば、fx-5800P のプログラムも PCにバックアップ可能になるからです。

なお、私は作ったプログラムをエクセルに転記して、バックアップをしています。
[2014/09/30 追記] バックアップ用に、専用通信ケーブルと2台目のfx-5800P を購入してしまいました。但し、エクセルへのソースコードの記録は続けています。→ ここを参照


fx-502P&fx-5800P 
fx-502P と fx-5800P (写真は「プログラム関数電卓ノスタルジア(fx-502P、fx-602P、fx-5800P)」掲載のもの)


My_func_calcs_20190803
My_graph_calcs_20190803
 
※ 管理人所有のプログラム電卓


fx-5800P は、薄型、軽量で上着の内ポケットに十分入る大きさです。そして、4行x16桁の液晶ディスプレイを搭載し、加えて新世代 Casio Basic が搭載されています。 高機能グラフ関数電卓 fx-9860GII も入手し、fx-5800P と比較していますが、改めて fx-5800P のバランスの良さを再認識しています。新世代 Casio Basic は、実用プログラムに加えて、ちょっとしたアクションゲームを作れるレベルの構造化Basic です(本ブログでも、いくつか紹介しています)。さらに、fx-5800Pは実売で6000円台なので圧倒的に購入しやすいのです。



さて、新世代 Casio Basicを搭載した fx-5800P の取扱説明書では、プグラミングが分かっている人しか分からない程度の記述しかありません。その上、プログラム事例は殆ど紹介されていません。カシオは、紙のプログラムライブラリーやウェブでの情報も国内では用意するつもりはなさそうです。

[2014/1/21 追記] 
fx-CG20の簡単なプログラミングの紹介を見つけました。申し訳ない言い方ですが、とりあえずやっつけたといった内容に感じられ、電卓の使い方の導入で終わっています。それが目的ならば敢えて申し上げることはありませんが、プログラミング入門としては、あまり力を入れているとは思われません。→ここ

一方で、海外では、カシオのホームページで動画による様々な説明(Webinar)が紹介されています。但し全て英語なので、明らかに日本人向けではありません。日本メーカーであるカシオ製品のサポートが、日本で積極的に行われないのは、非常に残念です。

Webinarの一例

そこで新世代 Casio Basic の良さを共有したいと考え、私なりの「Casio Basic入門」を公開することにしました。fx-5800P のプログラミングのしきいを下げてみよう、という試みです。合わせて、プログラミング経験者、特に長らく Casio プログラム電卓でプログラムを作ったことのある方には、新世代 Caso Basic が大きく進化していることを伝えたいという気持ちもあります。

[2017/08/06 追記]
この連載を始めた当初は、fx-5800P しか持っておらず、その後 fx-9860GII、fx-9860GII SD、fx-CG20、fx-CG50 を入手し、それらの Casio Basic でプログラムを作っています。その結果 これらの Casio Basic は互いに一定レベルの互換性が保たれるように考慮されていることが分かっています。fx-5800P で Casio Basic を使いこなせるようになれば、fx-9860GII シリーズや カラー高精細液晶の fx-CG20 / fx-CG50 でも問題無く使えるということです。

[2018/12/26 追記]
有志の方により CcLinker が開発され、fx-5800PのPCリンクが実現され、プログラムの保存や導入が容易になりました。
- 開発者 takumako様による CcLinker のサイト
- 当ブログの CcLinker 紹介記事


2. プログラミングとは
[fx-5800P] [fx-9860G (SD) fx-9860GII (SD) / fx-CG20 / fx-CG50]

プログラムの「プ」の字も知らない方のために、最初にあらかじめ知っておいて頂きたい基本的な事柄を紹介します。


プログラムって何だ?

プログラムと言うのは、「手順書」です。そして予め用意された単語と文法を使って、手順を書くことをプログラミングと言います。
手順を書くために使う言葉を「プログラミング言語」と言います。

そして、その単語と文法が分かればプログラムを書けるようになるわけです。

プログラムを読む相手は電子回路ですから、そこには情緒も感性も不要です。むしろ曖昧さがは有ってはなりません。厳密に一通りにしか解釈できないように書くために、単語や文法が考えられています。

言葉に動詞や文型があるように、プログラミング言語にもコマンド(命令)やステートメント(文)があります。これらの単語を覚え、文法を覚えるのは難しくありません。普通の外国語に比べると覚えることはとても少ないのです。Casio Basic については、覚えるべき事柄が非常に少ないので、さらに楽です。



プログラミング言語とは?

プログラムは手順書なので、基本的にはコマンド(動詞)と必要な名詞(目的語)をステートメントの規則(文型)に従って書きます。

「~をしなさい」  「~に~をしなさい」

といった短い文の組合せと繰返しで、プログラムは構成されます。


プログラミング言語には、多くの種類があります。C言語、java、BASIC、FORTRAN などを見聞きしたことは有りませんか?これらは最もよく用いられる代表的な言語です。これらの言語に一般的な優劣は有りませんが、それぞれ得意とするものが異なっています。

なお、これらの多くはアメリカで発明されたので、英単語から派生した単語を使い、語順は英文法に近くなっています。「O に V しなさい」 は、「V O」 といった語順になります。「ピアノを弾きなさい」「Play piano」 となるのと同じです(動詞 + 目的語)。

fx-5800P や fx-9860GII などのカシオのプログラム電卓には、BASIC が内蔵されています。但し、カシオが作った BASIC なので、Casio Basic と呼ばれています(特に海外のサイトでは、この表現をよく見ます)。基本的な単語や文型はパソコンで使う BASIC とほぼ同じです。

一部カシオ独自のものがありますが、古くからのユーザーのために残しているとのことです。古くから採用されていた独自のものは、当ブログでは旧来の命令と読んでいますが、使い勝手が良いので残っていても良いと思います。

ちなみに、Casio Basic で検索すると、おかげさまで当ブログがヒットしますが、CASIO Basic はカシオ時計のブランドだというのが分かります。



プログラムで計算

プログラムを書く時に、計算をさせることもできます。

1234 x 5678

とプログラムに書けば、電子回路が計算してくれます。プログラムを書く時に計算結果を知る必要はありません。

但し、上の計算結果を知るためにわざわざプログラムを書く人はいないでしょう。電卓のキーをチョイチョイと叩けば答えが出ますね。

上のように決まった数でなくて、色々と異なった数のかけ算をしたい時、プログラムが役立ちます。

A = 1234
B = 5678

としておいて、

C = A x B
Print C


とプログラムを書くと、かけ算の結果を画面に表示します。この書き方はパソコンで使う一般的なBASICの書き方です。

A x B は、A や B に色々と異なった数を入れると、異なった答えを出してくれます。これを Casio Basic で書くと、

1234→A
5678→B
AxB→C


正確に、このように3行のプログラムを書いて、それを実行させると、画面には 7006652 と計算結果が表示されます。


前置きが長くなりましたが、ポイントは以下の6項目です。

1) パソコンのプログラミングは、こんなに簡単ではありません
プログラム電卓ならではの簡便さです。

2) A や B は変数
変数は、数を入れておく容器です。A や B は容器の名前です。
予め、容器Aに数1234を入れ、容器Bに5678を入れておきます。
そして、AxB は、容器の中身の数のかけ算をしなさい、と言うプログラムです。
このように、プログラムでは頻繁に「変数」を使います。

fx-5800P や fx-9860GII などのプログラム電卓で使える変数は、アルファベットの A~Zの26文字です。但し、配列変数 (fx-5800P) や 行列 (fx-5800P や fx-9860GII など) という変数を必要に応じて追加して使うことができます。配列変数や行列については、その使い方を含めて、後で説明します。今は忘れてもらって結構です。

3) → は代入命令
変数Aに 1234を入れることを、「変数Aに1234を代入する」と言います。
そして、Casio Basic では、代入をしなさいと言う「代入命令」を 「」と言う右矢印の記号で表現します。

の左のものを、右へ代入すると決められています。
1234→A
のように、数字を変数に代入するだけでなく、変数を変数に代入できます。

例えば、

1234→A
5678→B
A→B


とすると、変数Bの中身は、5678でなくて、1234 に変化します。

CasioBasicコマンドリファレンス: → (代入命令)

パソコンの Basic では、変数 A に 1234 を代入するとき、

A = 1234

と書きます。代入命令については、Casio Basic は独特なものですが、 記号は代入の方向を示しているので、却って分かりやすいと思います。



4) は出力命令

これも Casio Basic 独特の命令です。◢ は出力、つまり画面表示するだけでなく、併せて一時停止の機能があります。

上の3行のプログラムは、上から下へ順に実行されます。

AxB

は、AxBの結果を表示して、そこでプログラムの実行を一時停止しなさい、という命令です。そして、[EXE] キーを押すと一時停止が解除されます。これも命令に含まれる機能です。

CasioBasicコマンドリファレンス: (出力命令)


5) ?は入力命令
変数Aと代入命令を併せて使って、

?→A

と書くと、画面表示が、

?

となり、そこでプログラムが一旦停止します。

の表示は、キー入力をしてください、と言う意味です。そして、プログラムが一時停止し、何かキー入力を待ちます。[EXE] キーを押すと入力内容が確定され変数Aに代入され、プログラムの一時停止が解除されます。これも Casio Basic 特有の命令です。

実はここには、Casio Basic 特有のおもしろい面があります。
画面に

?

と表示され、入力が促されている時に、例えば

9999÷3

と入力して[EXE] キーを押すと、この計算結果が変数Aに代入されます。

fx-5800P は関数電卓なので、様々な関数機能が内蔵されています。そこで、? が表示されて入力待ちの状態で、sin(30) と入力して[EXE]キーを押すと、計算結果の 0.5 が変数 A に代入されます(DEGモードの時)。関数電卓特有の機能を活かした入力命令になっていることが分かります。

"A="?→A

と書くと、画面には" と "で括られた文字

A= ?

のように表示され、入力待ちになります。

"A="?→A
5678→B
AxB


は、キー入力した数字を変数Aに代入して、AxBを計算した結果を表示するプログラムです。様々な数値や計算結果に5678を掛け算した結果を表示します。

CasioBasicコマンドリファレンス: ? (入力命令)


6) プログラムは上から下へ連続実行
プログラムは、上から下へ連続的に実行されます。

そして、出力命令や入力命令は、一旦停止の機能があるので、そこで実行が一旦停止します。この一旦停止は特別な例です。さらに、実行の流れを変えるコマンドや文があり、これらを使えば上から下への実行順序を変えることができます。

このような明示的なコマンドや文が無い限り、プログラムは上から下へ連続的に実行され、プログラムの一番下の行で、完全に実行が停止します。

プログラムは上から下へ実行される原則は、当たり前のように感じられるでしょう。しかし、これを忘れるとプログラムの動作が分からなくなるものです。とても重要な原則なので、必ず覚えてください。


関連記事:
- プログラム関数電卓でプログラミング
- fx-5800P【プログラミング入門】:プログラム作成から実行までの操作



*****


次からは、実際にプログラムを作りながら、プログラムの単語や文型をみてゆきます。


つづく...

⇒ CasioBasic入門2 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門22

Casio Basic入門
<目次>

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

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

Chapter 4

◆ Chapter 4 の目標: 換算プログラム(令和対応版)を作る

前回: Casio Basic入門21



Chapter4-5
キー長押しの処理をつくる

前回説明した予定に従って、プログラムを変更および追加してゆきます。

これまでに作った 初期設定 と 表示の初期化ブロック は、以下です。

0→A:0→B:0→G

Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT
"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
Locate 1,4,"5:In("
Locate 5,4," "

Locate 10,4,"6:yσn"

Locate 14,4," "

While 1

一応、While 1 まで書きました。

表示の初期化ブロック をサブルーチン YRD に受け持たせるようにする場合、サブルーチン YRD は以下のようにします。

サブルーチン:YRD

Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT
"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
Locate 1,4,"5:In("
Locate 5,4," "

Locate 10,4,"6:yσn"

Locate 14,4," "


そして、メインルーチンの [初期設定]ブロック と [表示の初期化]ブロック を以下のようにします。

0→A:0→B:0→G

Whle 1

Prog "YRD"


ここで [表示の初期化]ブロック を While ループの中に移動させていることに注目してください。その意味は後でお分かり頂けると思います。

続いて、[メニュー番号取得]ブロック が続きます。このブロックは変更しません。

-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
K=22⇒5→N
K=23⇒6→N


さて、プログラムの構造は以下のようなものにしてゆきます。

プログラムの構造

[初期設定]

While 1

  [表示の初期化]

    [メニュー番号取得]

  [キー長押し検出]

    [入力処理]

    [計算と出力処理]

WhileEnd

[キー長押し検出]ブロック を上記の位置に追加してゆくことにします。

このように、ブロック構造を意識しておくと、必要なところのみを変更し、独立したブロックを追加することで、機能追加がしやすくなります。

キー長押しを検出するには、

・ループの中で Getkeyコマンドを使い、
・あるキーのキーコードが押されている時だけ回るループを所定の回数だけ回して、
・その所定の回数でループから脱出してくれば、
・そのキーが長押しされたことが分かる


...と言うプログラムの考え方ロジック)を使います。

例えば、[1]キーの長押しは、以下のようにして検出できます。

0→F
0→C
While Getkey=35
Isz C
C=9⇒Break
WhileEnd

C=9⇒1→F

これを細かく見てみましょう。

変数F は長押しキーに対応するメニュー番号です。上記場合は、[1]キーを長押したので、F に 1 を代入しています。

なお、F を 0 で初期化しています。[1][4] のキーが長押しされなければ、F は 0 のままになります。メニュー番号に応じて処理を行う場合に、F が 0 ならば何も処理を行いません。 F が 1 ならば、明治の始まりと終わりの年月日をお表示する処理を行うわけです。

変数 F はプログラム実行中に勝手に変更されては困るので、予約変数として扱い、他の部分やサブルーチンでは使わない変数にする必要があります。いい変えれば、他の目的に使われてはマズイことになります。そこで、ここまでプログラムを作ったところで、まだ使われていない F を変数に選びました。


変数 C は、While ループが回る回数をカウントするカウンタ変数として使います。この変数は、Whileループの中だけで必要で、プログラムの他の部分で値が変わっても、全く影響ありません。つまり、変数 C は使い捨て変数として扱います。プログラムの他の部分で使用されていても良いので、カウンター C とわかりやすい名前にしています。

カウンタなので、C は0で初期化します。

While Getkey=35

これは、Getkey が実行された時に押されているキーのキーコードが 35 の場合は、ループに入る... ということです。
キーコード 35 は、[1]キーの対応します。

長押しキーが [1] でない時は、ループに入らず、WhileEnd までジャンプします。ここで Do ループを使うと、必ずループの入ってしまい、長押しキーが [1]でない時は、無駄な動作をします。従って、Whileループを使います。

While ループの中で実行するのは、以下です。

Isz C
C=9⇒Break


ループが回るたびに、Isz C で C をインクリメント(1つ増加)させています。
そして、C が 9 になったら、Breakコマンドを実行します。

Breakコマンドは、ループを強制的に抜けるコマンドです。
ループが9回まわった時、キーコードが依然として 35 である時、Whileループを脱出します。

長押し時間は、ループが9回まわるだけの時間、ということです。この 9 をを変更すれば、検出すべき長押し時間を調整できます。ここでは、9回まわる時間を長押し時間としています。


ループを脱出した直後に、

C=9⇒1→F

があります。カウンタ C が 9 の時、つまり[1]キーが所定の時間以上長押しされた時に、メニュー番号 F に 1 を代入しています。


これで、[1]キーが長押しされると メニュー番号 F に 1 を代入する...という動作をプログラミングできました。


この処理に続いて、[2]キーが長押しされた時に メニュー番号 F に 2 を代入する処理を書きます。

0→C
While Getkey=36
Isz C
C=9⇒Break
WhileEnd

C=9⇒2→F

書き換えているのは赤文字の部分のみで、あとは全く同じコードになっています。

ここでは、メニュー番号 F の初期化を行っていません。行う必要がありません。F の初期化は、どのキーも所定の時間以上長押しされなければ 0 にするのが目的でした。従って、一連の長押し検出ブロックの最初に一回初期化しておけば良いのです。

同様にして、[3]キーや [4]キーが長押しされた時の処理を続けて記述します。

0→C
While Getkey=37
Isz C
C=9⇒Break
WhileEnd

C=9⇒3→F

0→C
While Getkey=21
Isz C
C=9⇒Break
WhileEnd

C=9⇒4→F



さて、このようにして長押しされたキーが [1][4] のいずれか、或いはどれでもないことが検出されたら、メニュー番号 F に従った処理をサブルーチン YRD の中で行います。

Casio Basic の特殊性の1つに、メインプログラムの変数は、そのままサブルーチンで使えるという点があります。サブルーチンである変数が変更されたら、メインルーチンではその変数を参照すれば値が変更されているわけです。プログラムに慣れた人には、Casio Basic の変数は究極の大域変数だ、と言えば分かるでしょう。

さて、変数 F の値は、以下の可能性があります。

・F=0: キー長押しがされない時
・F=1: [1]キー長押しの時
・F=2: [2]キー長押しの時

・F=3: [3]キー長押しの時
・F=4: [4]キー長押しの時


サブルーチン YRD では、表示の初期化 も行いますので、

・F=-1: 表示の初期化を行う時

を追加しておきます。


そして、F の値に応じて、サブルーチン YRD の処理を行うようにします。さて、この処理はプログラム全体の流れとは全く無関係な処理です。つまり、プログラム全体の流れから見れば、例外処理といえます。

以前 Casiobasic入門11 で、例外処理について取り上げていますので、参考にしてください。

今回は、変数 F が0でないとき(真のとき)に、サブルーチン YRD を呼び出して、必要な処理を行うようにします。
そこで、F が0でない時、プログラムの最後、WhileEnd の手前に Goto コマンドでジャンプさせ、そこで例外処理を行います。

例外 = Exception (イクセプション)なので、Goto E / Lbl E を使うことにします。


さて、F が0以外の時に Goto E を実行するのは、以下のように簡潔に書けます。

F⇒Goto E

そして、Lbl E 以下を以下のようにします。

Lbl E
If F:then
Prog "YRD"
-1→F
IfEnd


WhileEnd


WhileEnd はプログラムの一番最後に記述するコマンドです。


変数 F を -1 にするのは、[表示の初期化] をサブルーチンYRD 内で実行する時です。
それならば、プログラムが起動した直後は F は -1 でなければなりません。そこで、初期化ブロック では、変数 F を -1 で初期化しておく必要があります。

同様に、上の 例外処理ブロック でも、サブルーチン YRD 実行後は、F を -1 にしておきます。


[初期設定] は、以下のように変更しておきます。

0→A:0→B:0→G
-1→F



変数 F が -1 の場合を考慮して、[表示の初期化]ブロック を以下のように変更しておきます。

If F:Then
Prog "YRD"
Prog "YRC"
IfEnd



ここでは、Prog "YRC" を追加しました。

サブルーチン YRC は既に作っています。ここでも変更しません。

和暦の始まりと終わりの年月日を サブルーチン YRD で表示し、[EXE]キーでメインルーチンに戻った後、表示の初期化を行って、さらに各項目で表示されていた値も再描画するためには、ここでサブルーチンYRC を実行しておく必要があるからです。

但し、プログラム起動時に、サブルーチン YRC が何もしないようにすべきです。そこで、初期設定ブロック で N を -1 で初期化しておくことにします。

YRCYRD は、紛らわしいので注意してください(紛らわしくてすみません)。


初期設定ブロック

0→A:0→B:0→G
-1→F:-1→N



以上をまとめると、プログラムの構造 は以下のようになります。

プログラムの構造

[初期設定]

While 1

  [表示の初期化]

    [メニュー番号取得]

  [キー長押し検出]

    [入力処理]

    [計算と出力処理]

  [例外処理]

WhileEnd


[入力処理]ブロック や [計算と出力処理]ブロック は変更がありません。


ここまでで変更したメインルーチンのプログラム名を YEAR CONV としましょう。以下にまとめます

プログラム名: YEAR CONV

0→A:0→B:0→G
-1→F:-1→N

While 1

If F:Then
Prog "YRD"
Prog "YRC"
IfEnd


-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
K=22⇒5→N
K=23⇒6→N


0→F
0→C
While Getkey=35
Isz C:C=9⇒Break
WhleEnd:C=9⇒1→F

0→C
While Getkey=36
Isz C:C=9⇒Break
WhleEnd:C=9⇒2→F

0→C
While Getkey=37
Isz C:C=9⇒Break
WhleEnd:C=9⇒3→F

0→C
While Getkey=21
Isz C:C=9⇒Break
WhleEnd:C=9⇒4→F

F⇒Goto E


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

Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S

Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H

Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R

Else If N=5
Then
If A:Then
5→X:4→Y:4→D:1→E
Prog "INPI":Z→B
IfEnd

Else If N=6
Then
If A:Then
12→X:4→Y:3→D:1→E
Prog "INPI":Z→G
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd

If N=0:Then
Prog "YRC"
Else If N=1
Then
T+1911→A
T=0⇒Isz A
Prog "YRC"

Else If N=2
Then
S+1925→A
S=0⇒Isz A
Prog "YRC"

Else If N=3
Then
H+1988→A
H=0⇒Isz A
Prog "YRC"

Else If N=4
Then
R+2018→A
R=0⇒Isz A
Prog "YRC"

Else If N=5
Then
If A:Then
Prog "YRC"
IfEnd

Else If N=6
Then
If A:Then
Prog "YRC"
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd

Lbl E
If F:Then
Prog "YRD"
-1→F:IfEnd


WhileEnd


(追加した部分を赤文字で示した)


一見行数が多くなっていますが、各部分は類似のコードの繰り返しになっており、併せてブロック構造を考えて見れば、簡単な処理が並んでいるだけのものだと、お分かり頂けるでしょう。

 ⇒ CasioBasicコマンドリファレンス
  - Whileループ
  - Doループ
  - Getkeyコマンド
  - Isz命令
  - Breakコマンド
  - ⇒命令



Chapter4-6
サブルーチンを使いこなす

これまで、ブラックボックスのまま扱ってきた サブルーチン YRD を実際に書いてゆきます。

サブルーチン YRD は、変数 F の値に応じた表示処理を行います。

・F=0 の時: 何もしない
・F=-1 の時: 各項目の初期表示
・F=1 の時: 明治の始まりと終わりの年月日を表示
・F=2 の時: 大正の始まりと終わりの年月日を表示
・F=3 の時: 昭和の始まりと終わりの年月日を表示
・F=4 の時: 平成の始まりの年月日を表示



F=-1 の時の表示
各項目の初期表示
YearConv_1  

F=1 の時の表示
大正の始まりと終わり
Taisho  

F=2 の時の表示
昭和の始まりと終わり
Showa  

F=3 の時の表示
平成の始まりと終わり
Heisei 

F=4 の時の表示
令和の始まり
Reiwa  

F=1 ~ 4 の時は、右下に ►E の表示をしています。これは、[EXE]キーで元に戻るこを示す表示です。

サブルーチン: YRD

If F=-1:Then
Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT
"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
Locate 1,4,"5:In("
Locate 5,4," "

Locate 10,4,"6:yσn"

Locate 14,4," "
Return
IfEnd


Cls
Locate 14,4,"
►t"    ( [FUNCTION] [7] [3] [4] )
Locate 16,4,"E"


If F=1:Then
Locate 1,1,"TAISHO"
Locate 2,2,"FROM 1912.7.30"
Locate 2,3,"TO 1926.12.24


Else If F=2
Then
Locate 1,1,"SHOWA"
Locate 2,2,"FROM 1926.12.25"
Locate 2,3,"TO 1989.1.7"


Else If F=3
Then
Locate 1,1,"HEISEI"
Locate 2,2, "FROM 1989.1.8"
Locate 2,3,"TO 2019.4.30"


Else If F=4
Then
Locate 1,1,"REIWA"
Locare 2,2,"FROM 2019.5.1"


IfEnd:IfEnd
IfEnd:IfEnd
Cls


F=-1 の場合は、Return コマンドにより、サブルーチンから強制的にメインルーチンへ戻しています。

F=1~4 の場合の表示は、出力命令 ◢ を使って、プログラムを一時停止させています。一時停止を解除するには [EXE]キーを押す必要があります(出力命令の仕様)。従って、画面の右下に 
►E を表示して [EXE]キーを押すように説明します。
ここでは、If ~ Else If ~ IfEnd を使って、複数条件分岐の処理を行っています。

 ⇒ Casiobasicコマンドリファレンス
  - Returnコマンド
  - If 文
  - 出力命令◢



最後の仕上げとして、[EXIT]キーでプログラムが終了する部分を追加して完成させます。

[メニュー番号取得]ブロック内で、[EXIT] のキーコード 73 を取得し、取得したらプログラムを終了させるようにします。

[初期設定] ブロック以外が While ~ WhileEnd の中にあるので、[メニュー番号取得]ブロックの一番最後に

K=73⇒Break



の1行を追加します。[EXIT]キーを押すと、キーコード 73 が検出され、その時は Break コマンドで、While ~ WhileEnd の外、つまり WhileEnd の下の行に制御がジャンプします。

このジャンプ先に、以下のコードを追記しておきます。

Cls
Locate 7,2,"BTE!"



ここで、最終的に完成したコードをまとめます。

プログラムファイルのダウンロード

CcLinker で fx-5800P に転送できるCCLファイルのダウンロード
 ※ YEAR CONV.ccl、YRC.ccl、YRD.ccl、INPI.ccl を含む 圧縮ファイル (zip) が得られます。
 CcLinkerの紹介



ソースコード

スペースは で示し、改行も示しています。

YEAR CONV
0→A:0→B:0→G↵
-1→F:-1→N↵

While 1↵

If F:Then ↵
Prog "YRD"↵
Prog "YRC"↵
IfEnd↵

-1→N↵
Do↵
Getkey→K↵
LpWhile K=0↵
K=25⇒0→N↵
K=35⇒1→N↵
K=36⇒2→N↵
K=37⇒3→N↵
K=21⇒4→N↵
K=22⇒5→N↵
K=23⇒6→N↵
K=73⇒Break↵

0→F:0→C↵
While Getkey=35↵
Isz C:C=9⇒Break↵
WhileEnd:C=9⇒1→F↵
0→C↵
While Getkey=36↵
Isz C:C=9⇒Break↵
WhileEnd:C=9⇒2→F↵
0→C↵
While Getkey=37↵
Isz C:C=9⇒Break↵
WhileEnd:C=9⇒3→F↵
0→C↵
While Getkey=21↵
Isz C:C=9⇒Break↵
WhileEnd:C=9⇒4→F↵
F⇒Goto E↵

If N=0:Then ↵
5→X:1→Y:4→D:1→E↵
Prog "INPI"↵
If Z:Then Z→A↵
Locate X,Y,A↵
IfEnd↵

Else If N=1↵
Then ↵
4→X:2→Y:4→D:1→E↵
Prog "INPI"↵
If Z:Then Z→T↵
Locate X,Y,T↵
IfEnd

Else If N=2↵
Then ↵
13→X:2→Y:4→D:1→E↵
Prog "INPI"↵
If Z:Then Z→S↵
Locate X,Y,S↵
IfEnd↵

Else If N=3↵
Then ↵
4→X:3→Y:4→D:1→E↵
Prog "INPI"↵
If Z:Then Z→H↵
Locate X,Y,H↵
IfEnd↵

Else If N=4↵
Then ↵
13→X:3→Y:4→D:1→E↵
Prog "INPI"↵
If Z:Then Z→R↵
Locate X,Y,R↵
IfEnd↵

Else If N=5↵
Then ↵
If A:Then ↵
5→X:4→Y:4→D:1→E↵
Prog "INPI"↵
If Z:Then Z→B↵
Locate X,Y,B↵
IfEnd:IfEnd↵

Else If N=6↵
Then ↵
If A:Then ↵
12→X:4→Y:3→D:1→E↵
Prog "INPI"↵
If Z:Then Z→G↵
Locate X,Y,G↵
IfEnd:IfEnd↵
IfEnd:IfEnd↵
IfEnd:IfEnd↵
IfEnd:IfEnd↵
IfEnd↵

If N=0:Then ↵
Prog "YRC"↵

Else If N=1↵
Then ↵
T+1911→A↵
T=0⇒Isz A↵
Prog "YRC"↵

Else If N=2↵
Then ↵
S+1925→A↵
S=0⇒Isz A↵
Prog "YRC"↵

Else If N=3↵
Then ↵
H+1988→A↵
H=0⇒Isz A↵
Prog "YRC"↵

Else If N=4↵
Then ↵
R+2018→A↵
R=0⇒Isz A↵
Prog "YRC"↵

Else If N=5↵
Then ↵
If A:Then ↵
Prog "YRC"↵
IfEnd↵

Else If N=6↵
Then ↵
If A:Then ↵
Prog "YRC"↵
IfEnd↵
IfEnd:IfEnd↵
IfEnd:IfEnd↵
IfEnd:IfEnd↵
IfEnd↵

Lbl E↵
If F:Then ↵
Prog "YRD"↵
-1→F:IfEnd↵

WhileEnd↵
Cls↵
Locate 7,2,"BYE!"↵


YRC
If N=1:Then ↵
A-1911→T↵
Else If N=2↵
Then ↵
A-1925→S↵
Else If N=3↵
Then ↵
A-1988→H↵
Else If N=4↵
Then ↵
A-2018→R↵
Else If N=5↵
Then ↵
B-A→G↵
Else If N=6↵
Then ↵
A+G→B↵
IfEnd:IfEnd↵
IfEnd:IfEnd↵
IfEnd:IfEnd↵

A-1911→T↵
A-1925→S↵
A-1988→H↵
A-2018→R↵
Locate 5,1,"□□□□□"↵
A>0⇒Locate 5,1,A↵
Locate 4,2,"□□□□□□"↵
T>0⇒Locate 4,2,T↵
Locate 13,2,"□□□□"↵
S>0⇒Locate 13,2,S↵
Locate 4,3,"□□□□□□"↵
H>0⇒Locate 4,3,H↵
Locate 13,3,"□□□□"↵
R>0⇒Locate 13,3,R↵

B-A→G↵
If G>999 Or G<-99:Then ↵
Locate 12,4,"□yσn"↵
Locate 14,4,"□□"↵
Return↵
IfEnd↵

If B Or G:Then ↵
Locate 5,4,"□□□□□"↵
Locate 5,4,B↵
Locate 12,4,"□□□"↵
Locate 12,4,G↵
If Abs(G):Then ↵
13+Int(log(Abs(G)))→D↵
Else 13→D:IfEnd↵
G<0⇒D+1→D↵
Locate D,4,"yσn"↵
Locate D+1,4,"□□"↵
IfEnd



YRD
If F=-1:Then ↵
Locate 1,1,"0:AD"↵
Locate 10,1,"▸DMS"↵
Locate 11,1,"EXIT"↵
Locate 1,2,"1:T"↵
Locate 10,2,"2:S"↵
Locate 1,3,"3:H"↵
Locate 10,3,"4:R"↵
Locate 1,4,"5:Int("↵
Locate 5,4,"□□"↵
Locate 10,4,"6:□yσn"↵
Locate 14,4,"□□"↵
Return↵
IfEnd↵

Cls↵
Locate 15,4,"▸t"↵
Locate 16,4,"E"↵

If F=1:Then ↵
Locate 1,1,"TAISHO"↵
Locate 2,2,"FROM□1912.7.30"↵
Locate 2,3,"TO□□□1926.12.24"◢

Else If F=2↵
Then ↵
Locate 1,1,"SHOWA"↵
Locate 2,2,"FROM□1926.12.25"↵
Locate 2,3,"TO□□□1989.1.7"◢

Else If F=3↵
Then ↵
Locate 1,1,"HEISEI"↵
Locate 2,2,"FROM□1989.1.8"↵
Locate 2,3,"TO□□□2019.4.30"◢

Else If F=4↵
Then ↵
Locate 1,1,"REIWA"↵
Locate 2,2,"FROM□2019.5.1"◢
IfEnd:IfEnd↵
IfEnd:IfEnd↵
Cls↵




「入力ボックス」を用いた 西暦・和暦換算プログラム が完成しました。

Chapter 4 では、
  • 入力ボックスの使い方
  • サブルーチンと共有する"予約変数" と メインルーチン内で効率よく使う"使捨て変数" を意識した変数の使い方
  • サブルーチンの使いこなし
  • "キー長押し" と "普通押し" のキー操作違いで、1つのキーに異なる役割を与える方法
を経験してもらいました。

CasioBasic入門 を最初からここまで読んでくると、プログラム電卓でのプログラミングが自由自在になったのではないでしょうか?


つづく...


CasioBasic入門23 / 目次




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 




keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門21

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
更新: 2019/05/04

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

Chapter 4

◆ Chapter 4 の目標: 換算プログラムを作る(令和対応版)


これまでに作成した「西暦・和暦換算プログラム」のプログラムコードを、以下にまとめます。


プログラム名: CH4-3

0→A:0→B:0→G

Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT
"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
Locate 1,4,"5:In("
Locate 5,4," "

Locate 10,4,"6:yσn"

Locate 14,4," "

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
K=22⇒5→N
K=23⇒6→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→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R
Else If N=5
Then
If A:Then
5→X:4→Y:4→D:1→E
Prog "INPI":Z→B
IfEnd
Else If N=6
Then
If A:Then
12→X:4→Y:3→D:1→E
Prog "INPI":Z→G
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd

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

WhileEnd



プログラムの構造

[初期設定]

[表示の初期化]

While 1

    [メニュー番号取得]

    [入力処理]

    [計算と出力処理]

WhileEnd


サブルーチン: YRC

If N=1:Then
A-1911→T
Else If N=2
Then
A-1925→S
Else If N=3
Then
A-1988→H
Else If N=4
Then
A-2018→R
Else If N=5
Then
B-A→G
Else If N=6
Then
A+G→B
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd

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


B-A→G

If G>999 Or G<-99:Then

Locate 12,4," yσn"
  (スペース1個)
Locate 14,4,"  "    (スペース2個)
Return
IfEnd

If B Or G:Then
Locate 5,4,"     "
  (スペース5個)
Locate 5,4,B
Locate 12,4,"   "
  (スペース3個)
Locate 12,4,G
If Abs(G):Then
13+Int(log(Abs(G)))→D
Else 13→D:IfEnd
G<0⇒D+1→D
Locate D,4,"yσn"
Locate D+1,4,"  "
  (スペース3個)
IfEnd


さて、今回は、上記のプログラムに各年号の始まりと終わりの年月日を表示する機能を組み込みます。



Chapter 4-4
キー長押しによるメニュー選択


これまでに作成したプログラムの実行画面は、既に画面一杯になっており、新しい機能を呼び出すためのメニュー番号を表示させる場所がありません。



YearConv_7 

今回追加する機能は、大正、昭和、平成、令和 それぞれの始まりと終わりの年月日を表示するものです。

大正年を入力するための項目1は、[1] キーを押して入力します。そこで、[1]キーを長押しした時に大正の始まりと終わりの年月日を表示するようにできれば、新たなメニュー番号を増やす必要がありません。


そこで今回は、キー長押しによるメニュー選択機能を追加します。


キー長押しについては、CasioBasic入門6 (キーコードを調べるプログラムを作る) で長押しを適切に検出する方法を紹介していますので、今回は応用編です。


キー長押しでは、[1][2][3][4] キーを押した時、それぞれに対応して、大正、昭和、平成、令和 の始まりと終わりの年月日(令和は始まりだけ)を表示させるのですが、その表示内容は、、以下のようなものにします。


大正の始まりと終わり
Taisho 
 
昭和の始まりと終わり
Showa 
 
平成の始まりと終わり
Heisei 

令和の始まり
Reiwa  


いずれの画面でも、右下に ►E の表示をしています。これは、[EXE]キーで元に戻るこを示す表示です。

これらの表示は、サブルーチン YRD を呼び出して行うことにします。

※ サブルーチン名の YRD の末尾の D は、Display (表示) の D を意味しています。


ところで、この表示から [EXE] キーを押して、元に戻るときには、以下のような表示内容を再描画する必要があります。
YearConv_7  


ところで、プログラム起動時は、以下の表示を行います。
YearConv_1         
 
この表示は、これまで [表示の初期化] ブロックで記述していますが、この表示も再描画する必要があるので、 サブルーチン YRD で表示するように変更します。

この表示を実行したのち、既に作っているサブルーチン YRC を実行すると、1つ上のような表示になります。

従って、[表示の初期化] ブロックは、

Prog "YRD"
Prog "YRC"


に置き換えることができます。


それでは、このような動作をするように、メインルーチンとサブルーチン YRD を作ってゆきます。



つづく...


CasioBasic入門22 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門20

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
更新: 2019/05/04

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

Chapter 4

◆ Chapter 4 の目標: 換算プログラムを作る(令和対応版)

前回: Casio Basic入門19


前回は、以下のプログラムを作り、サブルーチンの有効性を実感できたと思います。


サブルーチン: YRC

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

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




プログラム名: CH4-2

0→A

Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT
"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"

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→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd

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

WhileEnd




Chapter 4-3

今回は、オマケの "あの人の年齢いくつかな?" 機能を追加してゆきます。

項目5:
 5:In
 この表記の後に4桁の入力ボックスで入力させます。
 ここには、任意の西暦年を入力します。
 ここで入力した値は、変数B に格納します。

項目6:
 6:  y
 この 6: と y の間に3桁の入力ボックスで、年齢を入力させます。
 y は歳(years)の略です。ここで入力した値は、変数Gに格納します。

項目0の西暦年 (変数A) が0 (ゼロ) の時は、項目5と項目6の入力ができないようにします。

西暦年(変数A)が0でない時は、その値に基づいて、BからGを、またはGからBを計算して表示します。

Bが入力された時は、

B-A→G

により、西暦Bの時の年齢Gを計算します。

Gが入力された時は、

A+G→B

により、G歳の時の西暦年Bを計算します。


具体的に、各ブロックにコードを実装してみましょう。



[初期設定] ブロック


0→A:0→B:0→G

(追加部分を赤文字で示した)

BとGも 0 (ゼロ)で初期化しておきます。



[表示の初期化]

Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
Locate 1,4,"5:In("       ([In])
Locate 5,4," "
           (スペース2個)
Locate 10,4,"6:yσn"
  ([FUNCTION] [7] [2] [6])
Locate 14,4," "
         (スペース2個)

(追加部分を赤文字で示した)

特に説明は不要と思います。小文字の y を表示する時の裏技を思い出してください。


[メニュー番号取得]

-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
K=22⇒5→N
K=23⇒6→N


(追加部分を赤文字で示した)

項目 5 と 6 を押した時、それぞれのメニュー番号を変数 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→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R
Else If N=5
Then
If A:Then
5→X:4→Y:4→D:1→E
Prog "INPI":Z→B
IfEnd
Else If N=6
Then
If A:Then
12→X:4→Y:4→D:1→E
Prog "INPI":Z→G
IfEnd
IfEnd:IfEnd

IfEnd:IfEnd
IfEnd:IfEnd
IfEnd


(追加部分を赤文字で示した)

項目5 と 6 の入力ボックスを用いた入力処理は、既に作った部分と同様です。追加部分に関する特別な処理はありせん。


[計算と出力処理]

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

IfEnd:IfEnd
IfEnd:IfEnd
IfEnd


(追加部分を赤文字で示した)


項目 5 と 6 に関する追加部分で、特別なものはなく、サブルーチン YRC を呼び出しているだけです。
具体的な細かい処理は、サブルーチン YRC が受け持ちます。


まずは、プログラムコードを一気に紹介します。サブルーチン YRC は、全ての表示を書き換えます。そして書き換える項目に、項目5と6を追加しています。


サブルーチン: YRC

If N=1:Then
A-1911→T
Else If N=2
Then
A-1925→S
Else If N=3
Then
A-1988→H
Else If N=4
Then
A-2018→R
Else If N=5
Then
B-A→G
Else If N=6
Then
A+G→B
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd

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


B-A→G

If G>999 Or G<-99:Then

Locate 12,4," yσn"
   (スペース1個)
Locate 14,4,"   "
     (スペース2個)
Return

IfEnd

If B Or G:Then
Locate 5,4,"     "
  ( スペース5個)
Locate 5,4,B
Locate 12,4,"   "
   (スペース3個)
Locate 12,4,G
If Abs(G):Then
13+Int(log(Abs(G)))→D
Else 13→D:IfEnd
G<0⇒D+1→D

Locate D,4,"yσn"
         ([FUNCTION][7][2][6])
Locate D+1,4,"  "
   (スペース3個)
IfEnd

(追加部分を赤文字、青文字、紫文字で示した)

サブルーチン YRC では、変数A、B、G に基づき、必要な計算を行って表示しています。


青文字の部分(エラー処理)
変数G(年齢)が大き過ぎ、あるいは小さ過ぎの場合は、3桁を超える表示になるので、正常な表示を行えません。これをエラーを考え、この部分では年齢の数値を表示させずに、空白を表示することにします。

項目6の年齢表示は、画面配置の都合上、3桁以内で表示を行います。 B-A により算出される年齢 G が3桁を超えるかどうかを判定します。年齢 G は、B-A により算出されるので、負の数になることもあり得ます。この場合は負記号 ”-”も1桁になります。

そこで、年齢G が3桁を超える条件は、以下のようになります。
・正の整数だと999が3桁の最大なので、これを超える場合として G>999、
・負の整数だと、-99が3桁の最大なので、これを下回る場合として G<-99


そして年齢Gが3桁を超える場合は、項目6(年齢表示)には空白を表示し、"y"を表示します。

エラーの場合は、以下に続く項目5と6の表示を行わずに、サブルーチンを終了させて、メインルーチンへ戻るようにします。そこで、Returnコマンドを用います。

 ⇒ CasioBasicコマンドリファレンス
  - Return


赤色の部分
ここでは、項目5と項目6の計算結果を表示します。

但しプログラムを起動した時は、このおまけ機能はまだ使っていません。使っていないのに表示をするのはおかしい。
そこで、変数 G と B のいずれかが初期値(0)でない時にのみ、表示を行うことにし、具体的には以下のIf 文を使っています。

If B Or G Then
[項目5と6の表示]
IfEnd



紫色の部分
文字"y" の表示位置は年齢Gの桁数に応じて変化しますので、この部分で文字"y"を表示する桁を調べています。

この処理が面倒なら、最初から文字"y"を表示させないようにしても構いません。但し、fx-5800Pでプログラムを作る際には、表示変数の桁数が分かると便利なことがあるので、その方法を紹介します。

fx-5800P 搭載のCasioBasicには、文字列処理のコマンドがありません。そこで数学的に変数Gの桁数を調べる必要があります。

正の整数Gの桁数は 1 + Int(log(G)) で求まります。

Gの表示開始桁は 12 です。"y" の表示桁を D とすると、以下の式から D を計算します。

13+Int(log(Abs(G))→D

関数 Abs( ) は、 ( ) 内の数の絶対値を求めます。

対数関数 log( ) の ( ) 内は正の数でなければエラーになります。これは対数関数の数学的性質です。

そこで、まず年齢変数Gが0(ゼロ)でない時、つまり

If Abs(G) Then

の時に、Gを Abs( ) 関数で一旦正の数にして、対数関数 log( ) を使い、Gの桁数から "y" の表示桁を求めます。

そして、Else により G が 0 (ゼロ)の時の "y"の表示桁を 13→D で決定しています。

最後に、G が負の数の時は、マイナス記号が頭に追加されるので、"y" の表示桁数D を1つ増やしています。


※ 変数 G の桁数の求め方について

変数の桁数を求めて、それに関する表示桁を求める方法については、こちら で説明していますので、参考にしてください。


今回作成したプログラムコードを以下にまとめます。

プログラム名: CH4-3

0→A:0→B:0→G

Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT
"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"
Locate 1,4,"5:In("
Locate 5,4," "

Locate 10,4,"6:yσn"
  ([FUNCTION] [7] [2] [6])
Locate 14,4," "

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
K=22⇒5→N
K=23⇒6→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→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R
Else If N=5
Then
If A:Then
5→X:4→Y:4→D:1→E
Prog "INPI":Z→B
IfEnd
Else If N=6
Then
If A:Then
12→X:4→Y:3→D:1→E
Prog "INPI":Z→G
IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd

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

WhileEnd



プログラムの構造

[初期設定]

[表示の初期化]

While 1

    [メニュー番号取得]

    [入力処理]

    [計算と出力処理]

WhileEnd




16桁・4行の限られた画面の中に、7つの項目を押し込んで全ての換算値を1画面に表示することができました。

このプログラムを使っていて、ふと思ったことがあります。

和暦は、きりの良い1月から変わるわけではなくて、天皇崩御により年号が変わるのだから、例えば昭和は、何年何月から何年何月までだろうか?

Googleなどで調べれば良いだけですが、今回のプログラムに各年号の始まりと終わりの年月日を表示する機能を組み込めないだろうか?

表示のための画面は、サブルーチンを利用してやればよく、表示が終われば、元の画面に戻すことはま、まぁできるでしょう。
それよりも、問題は呼び出すための番号を表示する場所がもう無いことです。

実は、うまい手があることに気がつきました。それを、次回紹介しようと思います。



つづく...


CasioBasic入門21 / 目次




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 




keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門19

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
更新: 2019/05/04

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

前回: Casio Basic入門18 - Chapter 3


Chapter 4
はじめに

◆ Chapter 4 の目標: 換算プログラム(令和対応版)を作る


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

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

本 Chapter では、入力ボックス 2.1INPI を使用します。プログラムライブラリ - 入力ボックス から INPI 2.1 を準備してください。

今回作成するプログラムの完成版をダウンロードできます。
CcLinker で fx-5800P に転送できるCCLファイルのダウンロード
 ※ ダウンロードした zipファイルを解凍して得られる4つのファイルを fx-5800P に転送してください。
 CcLinkerの紹介



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

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

変換の対象は、

・西暦
・大正
・昭和
・平成
・令和

とします。[2019/05/04 更新:令和対応しました]

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

これだけではツマラナイので、オマケとして"あの人の年齢いくつかな?" 機能を追加します。別の入力欄に西暦年を入力すると、その年での年齢を表示し、年齢を入力すると、その年齢になる西暦何年を表示する...そんな換算機能です。

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

YearConv_1  

プログラムを起動した直後の画面です。
0:AD は西暦年を示します。

[0] キーを押すと、AD つまり西暦の年数を入力するために、4桁の入力欄が >>>> 表示されます。

YearConv_8 

ここでは、AD (西暦) が入力モードになっていて、右下に [EXE] キーで確定を促す E が表示されています。
今この状態では 「汎用サブルーチン:入力ボックス」プログラム INPI が走っています。

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

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

大正79年、昭和65年、平成2年、令和なし、と表示されます。大正のままだったら79年、令和にはまだ至っていないと言うことです。

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

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


オマケの "あの人の年齢いくつかな?" 機能は、5:In と 6: y  で、これらに入力しても 項目0~4への影響はありません。つまりオマケ機能は別の変換機能と言えます。


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

ここで、5:In に 2030 と入力して確定すると、6: y6:40y に変化しました。
YearConv_3 

平成2年生まれの人は、2030年では 40歳、と教えてくれます。

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

項目6が入力モードになっていて、ここに 35 を入力します。
これは、平成2年生まれの人が35歳の時は、西暦何年か?を調べることになります。
YearConv_5 

5:In2025

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


この人が、高校卒業、つまり18歳の時は、西暦何年か?
項目6に18を入力し、
YearConv_6 
 
確定すると、
YearConv_7 

つまり、2008年だと分かります。

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


今回は、このような「年号換算プログラム(令和対応版)」を作ってみます。



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

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

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

プログラムの構造

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

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

While 1

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

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

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

WhileEnd


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

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

それぞれ、分かりやすいアルファベットを使っています。メニュー番号には N を使うことにします。

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


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

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


換算計算の概略

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

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

・大正元年: 1912年
・昭和元年: 1926年
・平成元年: 1989年
・令和元年: 2019年

西暦年 A を入力したとき
・大正年: A-1911→T
・昭和年: A-1925→S
・平成年: A-1988→H
・令和年: A-2018→R

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

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


大正年 T を入力したとき
・西暦年: T+1911→A

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

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


以下、同様にして...

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

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

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

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

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


プログラムの構造

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

[表示の初期化] 

While 1

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

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

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

WhileEnd



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

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


[初期設定] ブロック


0→A

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


[表示の初期化]

Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT
"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"


これは、2行目と3行目は、EXIT と表示するために、
[FUNCTION] + [5] (5:ANGLE) + [4] (4:DMS) とキー入力して を表示した後、EXIT を入力しています。他は、特に説明が不要だと思います。

この表示は、プログラムを終了させるためのキーを [EXIT] にするので、そのための操作案内です。


[メニュー番号取得]

-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 は使い捨て変数として、このブロックで使い切っているので、問題はありません。

なお、メニュー番号は、変数 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→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
Else If N=4
Then
13→X:3→Y:4→D:1→E
Prog "INPI":Z→R
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
T+1911→A
M=0⇒Isz A
Prog "YRC"
Else If N=2
Then
S+1925→A
T=0⇒Isz A
Prog "YRC"
Else If N=3
Then
H+1988→A
S=0⇒Isz A
Prog "YRC"
Else If N=4
Then
R+2018→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-1911→T
Else If N=2
Then
A-1925→S
Else If N=3
Then
A-1988→H
Else If N=4
Then
A-2018→R
IfEnd:IfEnd
IfEnd:IfEnd

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


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

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

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


プログラム名: CH4-2

0→A

Locate 1,1,"0:AD"
Locate 10,1,"DMS"
Locate 11,1,"EXIT
"
Locate 1,2,"1:T"
Locate 10,2,"2:S"
Locate 1,3,"3:H"
Locate 10,3,"4:R"

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→T
Else If N=2
Then
13→X:2→Y:4→D:1→E
Prog "INPI":Z→S
Else If N=3
Then
4→X:3→Y:4→D:1→E
Prog "INPI":Z→H
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
T+1911→A
T=0⇒Isz A
Prog "YRC"
Else If N=2
Then
S+1925→A
S=0⇒Isz A
Prog "YRC"
Else If N=3
Then
H+1988→A
H=0⇒Isz A
Prog "YRC"
Else If N=4
Then
R+2018→A
R=0⇒Isz A
Prog "YRC"
IfEnd:IfEnd
IfEnd:IfEnd
IfEnd

WhileEnd




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

[EXIT] キーでプログラムを終了させる処理はまた書いていませんが、[AC] で終了できます。


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



つづく...


CasioBasic入門20 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門2

Casio Basic入門
<目次>

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


3. fx-5800P CasioBasicの コマンド一覧

fx-5800P Casio Basic の主なコマンド

(1) 入力
 ・入力命令:?
 ・Getkey

(2) 出力
 ・出力命令:
 ・文字列出力: "   "
 ・Cls
 ・Locate

(3) 代入
 ・代入:

(4) ジャンプ
 ・Goto / Lbl 
 ・Dsz / Isz 
 ・ 

(5) 条件分岐
 ・If 文: If ~ Then ~ Else ~ IfEnd 

(6) ループ(繰返し)
 ・Goto / Lbl
 ・Do 文: Do ~ LpWhile 
 ・While 文: While ~ WhileEnd 
 ・For 文: For ~ To (~ Step) ~ Next 

(7) 関係演算
 ・= / / > / / < /

(8) 論理演算
 ・And / Or / Not

(9) 配列変数
 ・Z[ ]

(10) リスト
 ・List

(11) 行列
 ・MAT
 ・det( )
 ・Trn( )
 ・MAT A-1
 など

(12) 実行制御コマンド
 ・Prog
 ・Break
 ・Return
 ・Stop

(13) 各種関数
 ・Int( ) / Frac( )
 ・log( )
 など

(14) 出力設定コマンド
 ・EngOn / EngOff
 ・Norm / Fix / Sci
 など


※ CasioBasic 特有のものは、入力:?出力:代入:ジャンプ命令:Dsz / Isz / ⇒ です。これらの中で、特にジャンプ命令は、非常に利用価値の高いものです。


さて、多くのプログラミング言語と比較すると、fx-5800P のCasioBasic で覚えるべき項目は、とても少ないのです。と言うのも、一般的にパソコンでプログラミングを覚えるには、WindowsなどのOSの動作に関する知識、APIやMFC、様々な機能の多層構造などを知らなくてはなりません。プログラミングの本質を覚える前にギブアップとなりやすいのです。

プログラミングの基本は fx-5800P の CasioBasic に凝縮されていると言えます。

[2016/04/23 追記]
fx-9860GII、fx-CG20 を入手し、これらの Casio Basic についても調べています。機種が異なれば、ハードウェアの違いなどから Csio Basic も少し違ったものになっています。グラフィックスに関しては、fx-9860GII について詳しく調べて Casio Baisc入門 G01~G14 で紹介しています。そして、fx-CG20 までを含めて Casio Basic の互換性について調べました。

Casio Basic - 機種別の互換性

これを見て改めて思うことは、機種間の互換性がかなりのレベルで保たれていて、fx-5800P の Basic Basic が基本になっているということです。Casio Basic 入門には 価格面で入手し易い fx-5800P が適していると言えます。

グラフィックスの描画速度が、fx-CG20 よりも fx-9860GII が速いので、グラフィックスまで含めれば、そして余裕があれば、¥10,000 ~ ¥20,000 程度の fx-9860GII が入門機として良いかも知れません。グラフィックス・プログラミングをしないのであれば、fx-CG20 も入門機として問題ないと思いますが、fx-9860GII と同様に価格が気になります。

[2018/11/05 追記]
fx-9860GII の後継機として、処理速度が同等以上でカラー液晶の fx-CG50 が登場している。fx-9860GII や fx-CG20 で動作する Casio Basicプログラムは、fx-CG50 でも動作する。これからグラフ関数電卓を入手するなら、fx-CG50を勧める。


「CasioBasic入門」では、実際にプログラムを作りながら、これらのコマンド類を解説してゆく予定です。作って面白いプログラムを題材に取り上げたいと考えています。基本は fx-5800P 向けの内容ですが、fx-9860GII や fx-CG50 への移植についても触れています。


Casio Basic 入門と並行して、コマンドリファレンスも作っています。

⇒ CasioBasicコマンドリファレンス: 目次 (随時拡充中)

当初 fx-5800P 向けに書いていますが、fx-9860GII や fx-CG20 / fx-CG50 への適用についても、順次付記してゆく予定です。




4. CasioBasicを使ってみる

実際に手を動かしてプログラムを作ってみることが、プログラミングのスタートです。そして、正しく動作する簡単なプログラムを改良することが、プログラミング習得の最短の道だと思います。

そこで、実際にプログラムを一緒に作りながら、ゆっくりと確実に進めてゆきます。



Chapter 0
プログラム作成・実行の操作ポイント

多くの場合、電源を入れると以下のCOMPモードの画面になります。

Compモード 

fx-5800P は電源を切った時の状態が保存され、次に電源を入れた時に保存された状態で画面表示されます。従って電源を入れた時、上記のCOMPモードでない可能性もあります。

fx-5800P では、左上にある [MODE] キーが操作の起点となります。どのような状態であっても、[MODE] キーを押すと必ず以下に示すモード選択画面になります。

ch1-ModeSelect 

このモード選択画面では、メニュー番号を入力する以外に、この画面からの遷移はできません。

通常の電卓の画面にするには、[1] (1:COMP)、プログラムモードにするには、[5] (5:PROG) とします。

[5] (5:PROG) を選ぶと、以下の Program Menu 画面になります。

TC7-ProgMenu 

この Program Menu 画面から抜けるには、[MODE] キーを押してモード選択を行います。

プログラムの作成、実行、編修は、全てこの Program Menu 画面を起点に操作します。
プログラムの作成、実行、編修中に、[EXIT] キーを何回か押せば、必ず Program Menu に戻ります。


プログラムの作成、実行、編修でポイントとなる画面は、以下の4つです;

1) Program Menu 画面: [EXIT] キーを何回か押せばここに戻る

TC7-ProgMenu 


2) Prog Edit 画面: Program Menu から [3] (3:EDIT) で編修するプログラムを選択

TC7-ProgEdit 


3) Prog List 画面: Program Menu から [2] (2:RUN) で実行するプログラムを選択

TC7-ProgList 


4) プログラム編修画面: プログラムの作成、編修を行う

TC3-5 


先ずは fx-5800P の取り扱い説明書 の88ページ以降の説明を読みながら、実際に操作をしてみてください。また、ハードカバーの裏側に説明のあるステッカーが貼ってありますので、それも少しは参考になります。

1. 最も多用するキー
プログラムの編集画面が表示されている時は、

[FUNCTION] キー

[EXIT] キー

[MODE] キー


を押すと、必要なメニューが出てきます。これら3つのキーから始まる操作で、プログラム作成作業の殆どを行えます。


1.1 [FUNCTION] キー
これを押すと出てくるメニューのうち、最も多用するのが、「3:PROG」メニューと、「1:MATH」です。ここから Casio Basic のコマンドを選んで、編集画面でコマンドを書き込みます。

1.1.1 [1] (1:MATH) メニュー
様々な関数を選択して、プログラム編集画面に書き込めます。さらに、ミリ(m)、マイクロ(μ)、キロ(k)、メガ(M)といった、3桁区切りの接尾記号も、その本来の意味で使えます。例えば1000と書く代わりに1kと書けます。
また、"  " で括られた中には、数字やアルファベット以外にも、表示すべき文字列を書き込めますが、「1:MATH」メニューから文字として書き込むこともできます。

1.1.2 [3] (3:PROG) メニュー
ほぼ全てのコマンドを、このメニューから選んで書き込めます。
また、"  " で括られる中には、数字やアルファベット以外にも、表示すべき文字列を書き込めますが、「3:PROG」メニューから文字として書き込むこともできます。例えば、"<EXE>" などという表示は、「3:PROG」 メニューから、大小関係を判定する <> を選んで文字として使えます。


1.2 「EXIT] キー
1つ前の表示に戻るために使います。分からなくなったら、[EXIT] キーを何度か押せば Program Menu へ戻ります。


1.3 [MODE] キー
Program Manu から抜けて、関数電卓の画面へ戻る時には、[1] (1:COMP) を選びます。
もし、うっかり [MODE] を押してしまうことがありますが、そこで出てくるメニューから [5] (5:PROG) を選べば、プログラム編集画面へ戻れます。この場合でも、作業中の内容はj保存されています。



2. プログラム実行の手順

作成したプログラムを実行するには、2つの方法があります。

Program Menu 画面からのプログラム実行
COMPモードからのプログラム実行: [FILE] キー


2.1 Program Menu 画面からのプログラム実行
Program Menu 画面で、[2] (2:RUN) を選び、ここで表示される Prog List からプログラムを選べば、実行できます。

2.2 COMPモードからのプログラム実行: [FILE]キー
[MODE] [1] (1:COMP) で遷移する、通常の電卓画面(COMP モード)で、プログラムを実行したい時に [FILE] キーを押します。そこで現れるプログラムリストから、プログラムを選んで実行します。


2014/01/21追記: 上記いずれの方法においても、プログラムリストが表示されている時、目的のプログラム名の頭のアルファベットを入力すると(例えば "P")、そのアルファベット("P")で名前が始まるプログラム名にジャンプします。もし "P" で始まるプログラムが無い場合は、アルファベット順で "P" よりも後ろの文字で始まるプログラム名までジャンプします。
プログラムリストが表示されている時はアルファベット入力モードになっているので、例えば "P" で始まるプログラムへジャンプさせるには、[ALPHA] キーを押さずに、いきなり [6] キー(このキーの右上にピンク色で "P" と印刷されています)を押すだけのワン・アクションなので、便利です。


3. アルファベットや数字の入力

[ALPHA] キー と [SHIFT] キーを使って、通常入力モード、ALPHAモード、SHIFTモードを切り替えて入力します。

[ALPHA] を押すと、画面左上に A が表示され、ALPHA入力モードになっていることを示し、キーの右上にピンク色で印刷されているアルファベットや記号を入力できます。但し、キーを1つ入力する前に必ず [ALPHA] を押す必要があります。[ALPHA] をもう一度押すと、画面左上の A  が消え、キーに白で印刷されている数字や関数などを入力できます(通常入力モード)。

[SHIFT] を押すと、画面左上に S  が表示され、SHIFT入力モードになっていることを示し、キーの左上にオレンジ色で印刷されている記号や関数を入力できます。もう一度 [SHIFT] を押すと、画面左上の S  が消え、キーに白で印刷されている数字や関数などを入力できます(通常入力モード)。

[SHIFT] を押してから [ALPHA] を押すと、画面左上に A のみが表示され、ALPHA入力モードであることを示し、ALPHAモードで入力できるアルファベットや記号を、連続して入力できます。いちいちキー一つごとに [ALPHA] を押す必要がありません。


これで、プログラムを作成する準備ができました。


つづく...

Casio Basic (超)入門 /  Casio Basic入門3 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

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

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

Casio Basic入門31

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門30 を見る


[2018/11/03 追記]
 ソースコードの誤記を見直しました
 CcLinker を使ってfx-5800Pに転送して使えるプログラムファイル(CCLファイル)をダウンロードできます。


前回までに、キー長押しによりタイムゾーンの変更・設定機能を呼び出すようにしました。


夏時間の開始と終了の日時は、毎年異なります。そこで2015年の夏時間の開始・終了日時を表示する機能を追加し、さらにチョットした仕上げを行ってプログラムを完成させます。

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



Chapter5-9
キー長押しによる別機能の呼び出し

27-TZInfo  

このように、ヨーロッパとアメリカ(北米)について、それぞれの夏時間の開始と終了日時を表示する機能を追加します。

なお、この表示は 2014 年のヨーロッパやアメリカの夏時間の期間を示しますが、もう 2015年がやってきます。
そこで、2015年の夏時間の期間を表示するようにします。

2015年の夏時間の期間
・ヨーロッパ: 2015年3月29日 午前2時開始、2015年10月25日 午前3時終了
・アメリカ  : 2015年3月9日 午前2時開始、2015年11月1日 午前2時終了
※ 夏時間終了の時間がヨーロッパとアメリカで1時間違う)

実際問題、現地の人は深夜は寝ているので、アメリカでは 10月25日の朝以降は夏時間ではありません。ヨーロッパでも同様に 11月1日の朝は夏時間ではありません。そこで、本プログラムでは、朝の時点で夏時間かどうかの基準で表示(下記)を行うことにします。

  DLS IN 2015
EUR: 3-20⇒10-24
USA: 2-9 ⇒10-31


2016年には、ここの表示を更新する必要があります。

さて、この表示を呼び出すためにはメイン画面で [3][4] キーを長押しすることにします。そして、その表示は 画面表示ルーチン TZS で行うことにします。



以上が今回の機能追加の内容で、具体的には以下のように進めます。

1.初期化処理
特に変更なし。

2.メニュー番号取得処理
今回は、[3] キー と [4] キーの長押しを検出し、検出されたときに、メニュー変数 M5 を入れる。

3.入力処理
M=5 の時は、単に情報を表示するだけで、キー入力処理は行なわない。

4.時間の計算
M=5 の時は、情報を表示するだけなので、何も計算することはない。

5.時間表示の更新
一旦画面全体を消去し、夏時間の情報を表示したのち、メイン画面を再表示する。再表示は 画面表示サブルーチン TZM を用いる。TZM の変更はない。

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


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


[初期化処理]

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

While 1

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

  
[ [3]  および [4] キー長押しを検出し 両方ともメニュー番号 M=5 とする処理]

  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=5:Then
    Prog "TZS"  
[夏時間情報の表示]
    Cls
    Prog "TZM"  
[メイン画面表示]

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

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

WhileEnd


(赤文字は機能追加部分)



1.初期化処理
変更なし。



2.メニュー番号取得処理 - キー長押し処理


[3] キー と [4] キーの長押しを検出して、メニュー変数 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=37
Isz C:C=9⇒Break
WhileEnd:C=9⇒5→M
0→C
While Getkey=21
Isz C:C=9⇒Break
WhileEnd:C=9⇒5→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 で夏時間情報を表示させます。TZS 変更については、以下で説明します。

次に、TZS での表示が終わり、メインルーチンに戻ってきたら、一旦画面表示全体を消去 (Cls コマンドを使用)し、メイン画面表示サブルーチン TZM を呼び出して、選んだタイムゾーンに合わて画面を再表示します。TZM の変更は不要です。


メインルーチンに追加するプログラムを示します。今回変更するメインルーチン全体は、一番下に掲載しています。

メインルーチンに追加するプログラム
Else If M=5
Then Prog "TZS"
Cls:Prog "TZM"
IfEnd


タイムゾーン設定サブルーチン TZS を呼び出します。TZS の変更点は、以下で説明します。
  Prog "TZS"

TZS から戻ってきた時、夏時間情報が表示されたままです。そこで、Cls コマンドで画面を消去します。
  Cls
 ⇒ Casio Basic コマンドリファレンス: Cls

最後に、メイン画面の際表示を行うために、メイン画面表示サブルーチン TZM を呼び出します。
  Prog "TZM"


TZS の変更点は、下記のようになります。

サブルーチン:TZS のプログラム (夏時間情報を追加)
Cls
Locate 15,4,"▶t"
Locate 16,4,"E"
Locate 1,4," <Lt-Rt>"   [ これは下へ移動 ]

If M=5:Then
Locate 1,1," DLS IN 2015"
Locate 1,2,"EUR: 3-29⇒10-24"
Locate 1,3,"USA: 3-8 ⇒10-31"◢
Return
Else
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
IfEnd

Locate 1,4," <Lt-Rt>"    [ これは、上からここへ移動 ]


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=5 の時の処理として、ヨーロッパとアメリカ(北米)それぞれの夏時間が開始・終了する日時を表示します。
・表示の最後に、◢ 命令を使って、プログラムの実行を一時停止させます。[EXE}キーを押せば一時停止が解除されるので、Returnコマンドで強制的に TZS を終了させ、メインルーチンに戻します。
 ⇒ Casio Basic コマンドリファレンス: ◢ (出力命令)
 ⇒ Casio Basic コマンドリファレンス: Return

なお、M=5 の時、夏時間情報を表示させるので、この時は Locate 1,4," <Tl-Rt>" の表示は邪魔になります。この表示はタイムゾーンを選択させると時に、左矢印と右矢印を使え、と言う操作ガイドなので、M=6M=7 の時のみに必要です。そこで、上に示したように、実行する位置を変更します。





5.時間の再表示

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


以上で、プログラムが一応完成しました。




実際に、プログラムを実行していると、いくつか気になる点が出てきたので、最後の仕上げを行います。

ヨーロッパの夏時間か標準時間を切り替えるために、[3] キーを押すとき、1:CEST から 1:CET に表示を切り替わる際に、1:CEST の最後の T の表示がちらつくのが気になったので、以下のように変更しました。

表示サブルーチン TZM の上から2行目;

Locate 1,2,"1:CET"

を、以下のように、スペースを追加しました。

Locate 1,2,"1:CET "


さらに、夏時間と標準時間の切り替えのために [3] キー や [4] キーを押した時、3:ST3:DL の表示の切り替えがもたつく感じがします。 4:ST4:DL の表示の切り替えも同様です。

その原因は、TZM の中で、上記の表示切り替え処理が最後の方にあることにあります。fx-5800P の処理能力が低いためこのようなことになります。そこで、上記の表示の切り替え処理を、メインルーチンの [時間計算]ブロック にある If M=3 および If M=4 の時の処理に、上記の表示切り替えの処理を、敢えて Locate コマンドを追加し、Prog "TZM" を削除します。これで表示切り替えのモタツキが少し解消しました。

[0]キー、[1]キー、[2]キーを押して入力ボックス INPI を呼び出すと >>>>  と表示されますが、ここで何も入力せずに [EXE]キーを押すと 時刻が 0000 になります。この操作は入力キャンセルなので、入力ボックスを呼び出す前の時刻に戻るのが自然です。そこで何も入力しないで戻る特、つまり Z = 0 の時は、時刻変数 J, G, U を更新計算しないようにします。M = 0, 1, 2 の時のそれぞれの処理を、Z が ゼロでない時に実行されるように If Z:ThenIfEnd で挟みます。

このプログラム起動直後は、時刻表示されません。この時、[0][1][2]を押すと >>>> が表示されますが、数字を何も入力せうずに [EXE] を押した時は、Z = 0 となりますが、この時は時刻を示す4桁の数字を表示しないのが自然です。時刻表示サブルーチン TZDJ = -1 の時は Return して何もせず戻るようになっています。そこで、M = 0, 1, 2 の時 時刻変数 J を更新しないように以下のように Z⇒ を追加します。
Z⇒Z→J
Z⇒Z→G
Z⇒Z→U
 

この下に完成したプログラムを示します。今回、追加・修正した部分を赤文字で示しています。

最後に、メインルーチンのプログラム名を TIME ZONE に変更してください。これで一旦完成とします。

今回のプログラムに少し手を入れ、今年の夏時間に対応したものをプログラムライブラリに収録しています。
世界の時差換算 - Time Zone (fx-5800P用)
世界の時差換算 - Time Zone (fx-9860Gシリーズ/fx-CG20/fx-CG50用)







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

 CcLinkerを使ってfx-5800Pに転送できるCCLファイルのダウンロード
 ※ CcLinker の紹介

メインルーチン:TIME ZONE のプログラム
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=35⇒1→M
K=36⇒2→M
K=37⇒3→M
K=21⇒4→M

0→C
While Getkey=37
Isz C:C=9⇒Break
WhileEnd:C=9⇒5→M
0→C
While Getkey=21
Isz C:C=9⇒Break
WhileEnd:C=9⇒5→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⇒Z→J
Else If M=1
Then
8→X:2→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z⇒Z→G
Else If M=2:
Then
8→X:3→Y:4→D:1→E
Prog "INPI"
Prog "TZC"
X→A:Y→B:Z⇒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
If Z: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
Else If M=1
Then
If Z: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
Else If M=2
Then
If Z: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
Else If M=3
Then
If S:Then
0→S:P+1→P
Locate 5,2,"T "
Locate 15,2,"ST"

Else
1→S:P-1→P
Locate 5,2,"ST"
Locate 15,2,"DL"

IfEnd
A-P→C
C<0⇒C+24→C
100C+B→G

Else If M=4
Then
If T:Then
0→T:Q+1→Q
Locate 4,3,"S"
Locate 15,3,"ST"

Else
1→T:Q-1→Q
Locate 4,3,"D"
Locate 15,3,"DL"

IfEnd
A-Q→C
C<0⇒C+24→C
100C+B→U

Else If M=5
Then Prog "TZS"
Cls: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→W:17-T-Z→Q
Int(J÷100)→A
J-100A→B
A-Q→C
C<0⇒C+24→C
100C+B→U:Cls
Prog "TZM"
IfEnd: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"

If M=5:Then
Locate 1,1,"  DLS IN 2014"
Locate 1,2,"EUR: 3-30⇒10-26"
Locate 1,3,"USA: 3-9 ⇒11-2"◢
Return
Else
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,3," CST  EST"
IfEnd
IfEnd:IfEnd
IfEnd

Locate 1,4," <Lt-Rt>"
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




サブルーチン: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




世界の時差換算プログラム TIME ZONE が完成しました。

「入力ボックス」は、以下にあります。
 ⇒ プログラムライブラリ - 入力ボックス

今回 fx-5800P 用に作ったものは、プログラムライブラリ - Time Zone にもまとめています。
このプログラムを fx-9860GII や fx-CG20 に移植したものは、こちら のプログラムライブラリにまとめていて、プログラムファイルをダインロードして電卓に転送してすぐに使えます。


次回からは、入力ボックスの高速化と、正負全小数へ対応するための拡張を試みます。



つづく...

Casio Basic入門32 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



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

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



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

Casio Basic入門30

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門29 を見る


[2018/11/03 追記]
 ソースコードの誤記を見直しました
 CcLinker を使ってfx-5800Pに転送して使えるプログラムファイル(CCLファイル)をダウンロードできます。


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

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

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



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




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

 CcLinkerを使ってfx-5800Pに転送できるCCLファイルのダウンロード
 ※ CcLinker の紹介

メインルーチン: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=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


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 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"
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→W: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,3," 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
LpWhile 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 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


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

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



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

Casio Basic入門29

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門28 を見る


[2018/11/03 追記]
 ソースコードの誤記を見直しました
 CcLinker を使ってfx-5800Pに転送して使えるプログラムファイル(CCLファイル)をダウンロードできます。


前回は、ドイツ時間 (中央ヨーロッパ時間)  に限らず、ヨーロッパ内の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 )を変えて、動作確認をしてみましょう。 



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

 CcLinkerを使ってfx-5800Pに転送できるCCLファイルのダウンロード
 ※ CcLinker の紹介

メインルーチン: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=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


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 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"
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
LpWhile 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 / 目次



応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 



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

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



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

Casio Basic入門28

Casio Basic入門
<目次>

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

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

Chapter 5

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

前回: Casio Basic入門27 を見る


[2018/11/03 追記]
 ソースコードの誤記を見直しました
 CcLinker を使ってfx-5800Pに転送して使えるプログラムファイル(CCLファイル)をダウンロードできます。


前回までに、日本、ドイツ、ロサンゼルス(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




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

 CcLinkerを使ってfx-5800Pに転送できるCCLファイルのダウンロード
 ※ CcLinker の紹介

メインルーチン: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=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


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 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"
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
LpWhile 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 / 目次




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 


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

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



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

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

やす (Krtyski)

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


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

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

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR