MOD( - コマンドリファレンス

Casio Basicプログラミング - コマンドリファレンス
<コマンドリファレンス・トップ>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2018/08/17
追記修正 2018/08/18


[純正 / C.Basic] [FX / CG]


MOD(




整数の剰余を計算する。

(書式) MOD(A,N)
整数 A を 整数 N で割った余りを返す。

(キープレス) [OPTN] [F6](▷) [F4](NUM) [F6](▷) [F4](MOD)

(例)
 MOD(7,3)
※ 7 を 3 で割った余り 1 を返す。

(例)
  14→A
  5→N
  MOD(A,N)→M
  Locate 1,1,"M="
  Locate 3,1,M
  ※ 14 を 5 で割った余り M = 4 を出力する。

(注意) A や N が負の整数の場合は、AN で割った余りにならない。
MOD_Schematic2  
AN が負の整数の場合は、上表から分かるように 0, 1, 2 が繰り返すような計算結果になる。

※ 取扱説明書には "除算を行った際の余りを求める関数" とあるが、必ずしも正しくない。
※ この仕様は Casio Basic 特有のもので、特定の処理では役立つが、自然数に限定して使うのが良いかも知れない。



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


 



keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング



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

コマンドリファレンス - Casio Basicプログラミング

Casio Basicプログラミング - コマンドリファレンス・トップ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2018/01/09
追記修正 2019/08/17


純正Casio Basic と C.Basic に共通のコマンドがあり、C.Basic で純正コマンドを拡張したものがあり、さらに C.Basic 独自のコマンドがある。

入力コマンド


出力コマンド
 [純正 / C.Basic] [FX / CG] Menu

制御コマンド
 [純正 / C.Basic] [5800 / FX / CG] If ステートメント
 [純正 / C.Basic] [5800 / FX / CG] For ステートメント
 [純正 / C.Basic] [5800 / FX / CG] While ステートメント
 [純正 / C.Basic] [5800 / FX / CG] Do ステートメント
 [純正 / C.Basic] [5800 / FX / CG] Prog
 [純正 / C.Basic] [5800 / FX / CG] Return
 [純正 / C.Basic] [5800 / FX / CG] Break
 [純正 / C.Basic] [5800 / FX / CG] Stop

 [C.Basic] [FX / CG] Switch ステートメント
 [C.Basic] [FX / CG] ElseIf
 [C.Basic] [FX / CG] Gosub



 [C.Basic] [FX / CG] Local
 [C.Basic] [FX / CG] ACBreak

文字列
 [純正 / C.Basic] [FX / CG] + (文字列結合)
 [純正 / C.Basic] [FX / CG] StrJoin( 
 [純正 / C.Basic] [FX / CG] StrLen(
 [純正 / C.Basic] [FX / CG] 
StrCmp(
 [純正 / C.Basic] [FX / CG] StrSrc(
 [純正 / C.Basic] [FX / CG] StrLeft(
 [純正 / C.Basic] [FX / CG] StrRight(
 [純正 / C.Basic] [FX / CG] 
StrMid(
 [純正 / C.Basic] [FX / CG] Exp▸Str(
 [純正 / C.Basic] [FX / CG] Exp(
 [純正 / C.Basic] [FX / CG] StrUpr(
 [純正 / C.Basic] [FX / CG] StrLwr(
 [純正 / C.Basic] [FX / CG] StrInv(
 [純正 / C.Basic] [FX / CG] StrShift(
 [純正 / C.Basic] [FX / CG] StrRotate(

 [C.Basic] [FX / CG] ToStr(
 [C.Basic] [FX / CG] StrChar(
 [C.Basic] [FX / CG] StrCenter(
 [C.Basic] [FX / CG] Hex(
 [C.Basic] [FX / CG] Bin(
 [C.Basic] [FX / CG] StrRepl(
 [C.Basic] [FX / CG] 
Sprintf(
 [C.Basic] [FX / CG] 
文字列変数 Str

座標変換
 [純正 / C.Basic] [FX / CG] Pol( / Rec(

関数
 [純正 / C.Basic] [FX / CG] MOD(


グラフィックス


行列



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


 


keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

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




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

fx-5800P で Mod を使いたい - Casio Basicプログラミング

Casio Basicプログラミング
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2015/06/12
修正 2018/08/17

[純正] [5800P]
fx-5800P で整数の割り算の余りを求める Mod 関数を使いたい。



カシオのグラフ関数電卓 fx-CG50 / CG20 や fx-9860GII などに実装されている Mod 関数が、fx-5800P には無い。そこで、fx-5800P のプログラムで Mod 関数と同じ機能を実装する。


fx-9860GII などのグラフ関数電卓の Mod 関数
Mod は剰余を得る関数。fx-CG50 / CG20 や fx-9860GII では、1373 で割った余りは、Mod (137,3) で得られる。整数を格納した変数 AN を用いて、Mod (A,N) とすれば、AN で割った余りが求められる。


fx-5800P で Mod 関数と同じ機能を実現する
正の整数 A を 正の整数 N で割った時の商 Q と余り M は、以下の関係になる。

A = QN + M  ・・・(1)

一方、商 Q は以下のように現せる。

Q = Int(A÷N)  ・・・(2)


式(2) の Int( ) は、小数点を以下を切り捨てた結果の整数を求める関数だ。
式(2) を使って、式(1)の Q に代入すると、

A = N・Int(A÷N) + M

従って、式を変形して、余り M は以下の式(3)で現される。

M = A - N・Int(A÷N)   ・・・(3)


fx-5800P では、Mod(A,N) の代わりに以下の記述をすれば良い;

A-NInt(A÷N)

[2019/08/17 修正]
但し、Casio BasicMOD(A, N) と同じ動作とするには、A ≧ 0、N ≧ 0 (A, N0以上の整数) が前提条件となる。




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


 



keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

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

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

2018年、プログラミング機能追加の最新動向

楽 屋 裏
e-Gadget


2018/03/21
追記修正 2019/06/21



2018秋、フランス版 fx-JP500 にプログラム機能が追加される

sentaro様からの情報で、カシオのフランス版関数電卓やグラフ関数電卓に、新たにプログラミング機能が追加されるとのことです。2018年秋リリース予定。カシオフランスのニュースリリースページ

fx-92 Plusfx-92+ (フランス版)は国内の fx-JP900 に相当しますが、学校でのプログラミング授業のための簡易的なプログラミング機能が追加されるそうです。

16のコマンドがあるとの記述から、Casio Basic ではなく fx-72F 搭載のBasic風簡易言語に近いものだと思われます。

これがそのまま国内販売機種に反映されるとは思えないものの、同じハードウェアで fx-72F か fx-JP900の後継機種として国内リリースはあるかも知れません。この場合、高精細液晶+日本語表示の fx-JP900 をベースとするのでしょうから、fx-5800P 後継機種の Casio Basic の出力仕様変更の良い準備となるとも言えそうです。

高精細液晶搭載の fx-5800P 後継機種への期待が高まります。





2018年秋、フランス版 fx-CG50  に Python 搭載

GRAPH90E 最近、プログラミング言語 Python が注目されていますが、フランス版では Pyton アドインが登場します。

おそらく 純正 Casio Basic と同様に、インタプリタであり、関数機能やグラフ機能を使いこなすためのマクロ言語的なものだと推察しますが、標準ライブラリがどの程度の機能を持つのか、大変興味のあるところです。

[2019/06/21 追記]
fx-CG50 のOSアップデートで OS3.20 が発表され、国内カシオのサイトでは 2018年12月にアップデートインストーラが公開され、ダウンロード可能になりました。




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


 


keywords: プログラム関数電卓、fx-CG50

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

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

fx-5800P【プログラミング入門】:言語仕様

更新 2017/10/03
追記 2018/02/26
追記 2019/06/10

Casio Basic入門 連載中


 一般にプログラムの基本構成は、

  ・入力
  ・データ処理
  ・出力
  ・記録(データ保存)


に集約される。

従って、それぞれの基本構成に必要な命令やコマンドを覚えると、とりあえず動くプログラムを書けるようになる。そして、動くプログラムができれば、それを改造したり、機能を追加したりすることで、実用的なプログラムができるし、学習者はストレスなくプログラミングを覚えられると思う。


fx-5800P【プログラミング入門】:プログラム作成から実行までの操作

で、たった1行で、とりあえず動くプログラムが書けた。これに、色々と追加していけば、それらしいプログラムになる。少なくとも、非常に簡単な手順でプログラムを作れることは、お分かり頂けたと思う。

手軽さが電卓プログラムの1つの特徴と言える。


プログラム電卓は、一言でいえば、
電卓以上、パソコン未満。

プログラムを作れば、電卓以上のことが出来るが、パソコンほどのことは出来ない。しかし必要な時にポケットからサッと出して、パッと使えるので、パソコンよりも気楽に手軽に使える。そのような目的では、十分実用的なプログラムを作れるので、利用価値が高いと思う。

プログラム電卓に搭載されるプログラミング言語は、それほど強力なものではない。
電卓の機種によって搭載言語の仕様が異なることが多く、一概には言えないが、プログラムを作るための最低限の機能が搭載されていると思って良い。PCでのプログラミング経験者なら、Basicコマンドはこのように動作するはずだという感覚通りに動作するので、特に悩むことも無くすぐにプログラミング出来る。但しグラフィックスコマンドはとても癖が強く一般のBasicコマンドの感覚通りに動作しない (Casio Basic グラフィックス - 目次 参照)。

学習者にとっては、グラフィックスコマンドを除けば (fx-5800P にはグラフィックス機能は無い) ;
  • プログラミング経験者には、簡単にプログラムを作れる
  • プログラミング初心者には、入門に良い
であることが利点になる。

学習者がプログラミングを覚えるための良い方法については、様々な方が色々な論を展開している。個人的な経験に基づけば、

・作りたいプログラムがあること
・最も簡単で低機能の、しかし取りあえず完成したプログラムがあること
・取りあえずのプログラムを、自分の望むように改造する

学習者にとっては、必要性或いはモチベーションがあれば、必要なことから勉強してゆけるし、Casio Basic 頭の中に定着しやすい。如何であろうか?


最近のカシオのプログラム電卓では、Casio Basic が搭載されていて、Casio Basic は機種間での互換性が非常に高い。

最近のカシオのプログラム電卓:
  • fx-5800P
  • fx-9860GII
  • fx-CG10
  • fx-CG20
  • fx-FD10 Pro
  • fx-CG50

それでは、fx-5800Pについて少し詳しくみてみる。


先ずは、この電卓が搭載しているプログラミング言語について、私が特徴だと思う点を挙げる。

新世代 Casio Basic
2006年発売の fx-5800P には、それまでの機種の搭載言語とは大きく異なる。Basic 風だったものが、まともな Basic になったのだ。実際に使い込めば分かるのだが、この点意外に見落とされている。いわゆる構造化プログラミング風のコーディングが可能になっており、さらにキーコード取得の Getkey と柔軟な Locate コマンドが搭載されたことが、まともなBasicになったと言える要因だ。この新世代 Basic の記法は、最近の一般的な Basic でほぼそのまま使える。つまり、プログラミング経験者なら少ないストレスで実用的なプログラミングが出来る。これから Basic を習得しようとする人には、覚えたことが一般の Baisc に活かせる。新世代 Casio Basic 搭載が、fx-5800P の最大の特徴だ。 

バランスの良い設計
作ったプログラムを実行するために、プログラムモード(PROGモード)に入る必要が無い。通常の電卓のモード(COMPモード)から、[FILE] キーを押せばプログラムリストが現れ、そこから実行できる。この手軽さは良い。今のところこの機能があるプログラム電卓は fx-5800P と fx-FD10 Pro のみだ。その他のグラフ関数電卓は、プログラム実行のためにはプログラムモードに入る必要がある。プログラムを強制終了させると、プログラム編集画面になることから、知らずにプログラムを変更してしまう事故の可能性がつきまとう。
また、旧来の機種で搭載されていた入力/出力命令は、古くからのユーザーの利便性に考慮して、新世代 Casio Basic にも残されているが、fx-5800P と fx-9860GII (およびその他のグラフ関数電卓)では、細かい動作仕様が異なっている。グラフ関数電卓に搭載されている旧来の命令の仕様は、非常に使いづらく、旧来の命令をこれ以上使うなと言っているようである。一方で、fx-5800P は使い勝手の良い仕様にチューニングされている。
fx-5800P はハードウェアとCasio Basic のバランスがよく考えられている。

変数
最初から用意されている変数は、電卓内の保存されている全てのプログラムで共有される。究極のグローバル変数仕様と言える。一般にグローバル変数は弊害多いように言われるが、電卓プログラムに関して言えば、異なるプログラムで変数を共有できるメリットも有る。

文字列処理
fx-5800Pは、文字列変数が用意されていないので、文字や文字列の処理ができない。数値計算用の関数電卓の延長線にあるための割り切った仕様なのだろう。

最近のCASIOの関数電卓全般に言えることだが、3桁区切りの表記ができない。桁数の大きな数字をパッと認識しづらいのはとても不便だ。安い金融電卓などには搭載されている機能なので、ハイエンドと言える関数電卓で3桁区切りが無いのは理解しがたい。そこで、ミリ(m)やキロ(K)といった記号で表記する機能を使うか、6.02x1023 といった指数表示を使うしかない。プログラム上で、3桁区切りを実現するためには文字列処理が不可欠と思っていたが、文字列処理がなくてもロジックを工夫することで、実現した (以下追記参照)。
[2015/04/10 追記]
2015年2月から順次発売開始となった fx-JP500 / 700 / 900 では、ようやく3桁区切り記号が戻ってきた。fx-5800P の後継機種でも3桁区切り記号の実装が期待される。
[2019/06/10 追記]
プログラム上で3桁区切り出力を行うための汎用サブルーチンを公開している。
プログラムライブラリ - 3桁区切り出力(汎用サブルーチン)

記録(データ保存)
記録(データ保存)の機能は、ほとんど無い。ソースコード(=プログラムの記述のこと)のみが電卓本体記録・保存できるだけだ。パソコンなどにソースコードを保存することは出来ない。ソースコードをバックアップするには、専用ケーブル(別売り)を用いてfx-5800P同志をリンクして、プログラム単位でコピーするのことは出来る。究極のスタンドアローン仕様だ。

この仕様はなんとかして欲しい。私は、ソースコードと色々な説明を書き込んでエクセルファイルに保存している。

素因数分解_改造版ソース 
(fx-5800P用、素因数分解計算のソース)

[2018/02/26 追記]
有志の個人 (takumako様) が fx-5800P をPCリンクするツールを公開なさった。これにより fx-5800P が遙かに役立つようになった。
ついに fx-5800P がPCリンク可能になった


配列変数
配列変数を使うと、変数の数は実質無制限になる。プログラム中で変数領域の確保と解放ができる。変数領域は最大28500バイトのプログラム領域から切り出す仕様だ。変数名は Z[ ] に固定されている。

電卓のプログラムでそれほど多くの変数を使うことは、あまり無いだろう。しかしZ[インデックス数 ]といった使い方のできる配列は、異なる処理の記述を共通化できるので、ソースコードの記述量の節約に役立つ。但し配列変数へのアクセスは通常変数の4倍程度と遅い。

配列変数へのアクセス速度があまりに遅いので、高速化が必要なプログラムでは、配列変数へのアクセスの回数を極力減らすような工夫を行っている。

良いユーザーインターフェースを作れる可能性
fx-5800Pは16桁x4行の液晶ディスプレイが搭載されている。GetkeyコマンドとLocateコマンドにより、電卓としては広い画面を活かして、使いやすいユーザーインターフェースを実現できる点が、最大の特徴だと思う。これには、新世代 Casio Basic の仕様が不可欠でもある。

ハードウェアの欠点を補えるようになった [2019/06/10 追記]
・フリックタイプのハードカバーのヒンジの欠点
fx-5800P のフリップタイプのハードカバーは、ヒンジが容易に壊れるという明らかに設計上の欠点がある。カシオは一度も対応していない。良い製品なのにとてもこの欠点は非常に残念だ。
fx-5800P:ヒンジ破損でカバーが取れた 
その後、以外に安価に修理対応できることを確認している。ヒンジの修理だけでなく、ほぼ新品の外観にリニューアルできる。
 fx-5800P 破損ヒンジの交換、ついでにリニューアル

・プログラムのバックアップができない欠点
fx-5800P のプログラムファイルのバックアップするには、もう1台 fx-5800P を買ってきて 3Pケーブルでデータ転送するしかない。この欠点に対して有志の方がPCリンクのハードウェアとソフトウェアを開発され、希望者に頒布されている。これで fx-5800P 最大の欠点が解消された。
ついに fx-5800P がPCリンク可能になった



以下、言語使用をみてゆく。

1.入力

fx-5800Pでは、入力の方法が2種類準備されている。

・ 旧来の入力命令
Getkeyコマンド

Getkeyは、非常に有用だと思う。

 ⇒ 旧来の入力命令?の使いこなしは、Casio Basic入門38 から
 ⇒ ?命令からGetkey コマンドへの導入は、Casio Basic入門43 から
 ⇒ Getkey Locate の使いこなしは、Casio Basic入門3 から


1) 旧来の命令「?」(入力)命令

この入力命令が実行されると、

・入力を待つ
・[EXE]キーが押されることで入力が確定される


と言う動作を行う。

[EXE]キーで確定されるまでは、関数電卓として搭載されている殆どすべての計算を行えることは、入力命令の最大の特徴だと思う。サイン、コサイン、ルート、対数、指数、数値積分、総和(Σ)....などなど、1行で記述できる計算ならは何でも使える。そして[EXE]キーを押すと、その計算結果が確定され、入力が終了する。プログラムの用途によっては、非常に強力な機能を何の苦労もなく使えるわけだ。

入力命令は、[EXE]キーによる確定が必要なので、逆に確定キーを押すのが煩わしい時には、Getkeyを使う。

但し、fx-9860GII などのグラフ関数電卓では、fx-5800P とは細かい動作が異なり、非常に使いにくいことがある。fx-5800P はうまくチューニングされていて、とても使いやすくなっている点で、fx-5800P が他のグラフ関数電卓よりも優れている。


2) Basic コマンド:Getkeyコマンド

Getkey は、プログラム実行中にどのキーが押されたかを知るためのコマンドだ。電卓の付いている全てのキー(但し[AC]キーは除く)を区別して、それが押されたことが分かる。

If Getkey=34: Then
<何かの処理>
IfEnd


と書くと、「キーコード34のキーが押されたら、(直ちに)<何かの処理>を実行しろ」という処理を意味する。ここで (直ちに) というのがミソ。[EXE]キーによる確定は不要だ。

ところで、34のキーとは [DEL]キーだ。[DEL]キーには、キーコード34が割り振られているわけだ。[AC]キーを除き、全てのキー、例えば矢印キーなどが押されたことを検出できる。

メニューから項目を選択させるような処理には、メニュー番号を押せばスグにその処理へ移行して欲しい。矢印キーの上下左右のキーを押して表示を変えるような目的では、なおさら直ちに反応しなければ意味がない。このような時は、Getkey が有効になる。

但し、キーコードを取得するには、キーが押された時に Getkey コマンドが実行される必要がある。そこで、ループ構造の中で Getkey が繰り返し実行されるようにプログラムを記述すれば良い。


2.データ処理

データ処理と言う言葉は非常に漠然としているが、ここでは、入力されたデータを元に望む出力を得るための処理とする。データ処理はプログラムの核となる部分だ。

ここに新世代 Casio Basic の存在意味がある。fx-5800P の Casio Basic には、必要最低限な機能が揃っている。当ブログでは、実用的なプログラムやちょっとしたアクションゲームを作れる事を紹介している。その程度の機能はあると言うことだ。

具体的な機能の一部を紹介する。

条件分岐
If ~ Then ~ Else ~ IfEnd
 二者択一で、処理内容を変える時に使う。
 取説には書いていないが、If での条件判定に変数を使う時、変数がゼロの時は偽(FALSE)で、それ以外は真(TRUE)となる。

※ fx-5800Pには、多方向分岐コマンド(switch や select など)が無いのが残念だ。
多方向分岐の代わりに、If文のElseの中に新たにIf文を入れ子にする方法を使うが、Else If という記法が可能なので、可読性を確保できる。

⇒命令
 If [条件]:Then [処理]:IfEnd

 と同等の処理を行う際、

 [条件]⇒[処理]

 と記述できる。この命令の最大の利点は、その処理速度にある。If 文の2倍程度速い。非力な fx-5800P では非常に有用。


ジャンプ
Goto / Lbl
 予め記述したラベルまでジャンプする。

Isz と Dsz
 指定した変数がゼロになった時、ジャンプする。ジャンプ先は、次の次の処理。
 ISZ C とすると、変数C を1増やしてから、Cがゼロかどうかの判定を行う。
 DSZ Cは、変数Cを1減らしてから判定する。
 これらの命令の最大の利点は、その処理速度にある。単純なインクリメントやデクリメントで高速化が可能だ。


繰り返し処理(ループ)
For ~ To ~ Step ~ Next 
 カウンタを増やしながら処理を繰り返して処理をする。
 Forの後にカウンタ変数の初期値設定。
 Toの後にカウンタ変数の終了値設定。
 Stepの後にカウンタ増分を設定。Step設定がなければ増分は1。

Do ~ LpWhile
 繰り返しループの最後で、繰り返し継続判定を行う。
 LpWhileでの繰り返し継続判定に変数を使う時、変数がゼロの時は偽(FALSE)で、それ以外は真(TRUE)となる。

While ~ WhileEnd
 繰り返しループの最初で、繰り返し継続判定を行う。
 Whileでの繰り返し継続判定に変数を使う時、変数がゼロの時は偽(FALSE)で、それ以外は真(TRUE)となる。


制御系
Prog
 サブルーチンを呼び出す。引数や戻り値はない。VisualBasicのプロシージャに相当する。

Break
 繰り返し処理コマンドと併用して、強制的に繰り返しを中止する。

Return
 サブルーチンを終了させ、呼出元へ制御を戻す。

Stop
 プログラムを強制終了させる。


論理演算
And / Or / Not
 論理積 (And)、論理和 (Or)、真偽の否定 (Not)
 Xor は搭載されていないが、必要なら論理演算の組み合わせでカバーできる。
 

関数電卓独特の処理
Deg / Rad / Gra
 角度単位を、度、ラジアン、グラジアンのいずれかする設定

Dec / Hex / Bin / Oct / signed / unsigned
 n進数の基数を設定、負数をとるかどうかを設定

各種関数
 電卓に内蔵されている多彩な関数を使える。
 Int( )、Frac( )、log( ) などが特に有用だ。文字列処理機能の無い fx-5800P で数値の桁数を知るには log( ) を活用できる。

行列計算
 取扱説明書のプログラミングの章には明記されていないが、プログラムで行列が使える。

統計計算
 リスト操作、回帰計算のコマンドを使える。統計処理のプログラムには、一からアルゴリズムを考えずに使えて有用だ。


3.出力

fx-5800Pの出力機能は、画面への表示のみが用意されている。外部装置への出力はできない。但し
例外的に、fx-5800P同志の通信機能(別売りのリンクケーブルを使用)を使って、プログラムソースのコピーはできる。


出力(表示)
(出力命令)
 この記号の直前の文字列や変数の値、計算式の結果を表示する。旧来の命令で、使いやすいが制限もある。

Locate
数値、文字列、変数の値、計算式の結果の、先頭文字の位置を指定する。
※ 計算式の結果を位置指定に使う機能は、状況に応じて表示位置を変えることができるので、非常に役立つ。

Cls
 Clear Screen、画面全体の表示を消す。


関数電卓独特の処理
EngOff / EngOn
 数値の表示の際 f、p、n、μ、m、K、M、G、T、P などの記号を使うかどうかの設定
但し、EngOn とした時、Locate で表示する数値が上記の記号を使わない桁数の時、自動的に末尾にスペース1個が付加されるので、プログラミング時には要注意!

Norm
 指数表示をするかどうかの桁数を設定する。Norm2 としておけば10桁まで表示可能。

ab/c、d/c
 計算結果を仮分数か帯分数で表示する設定。プログラムではあまり使わないだろう。

Sci
 数値を表示する際、有効数字の桁数を設定。これによって数値そのものは変化しない。

Fix
 数値を表示する際、小数点以下の桁数を設定。これによって数値そのものは変化しない。

Rnd(
 変数に格納されている数値を、小数点桁数設定(FIX)の設定に従って丸める。


4.記録(データ保存)

fx-5800Pには、記録(データ保存)機能が準備されていない。例外的にプログラムソースを同型機同志でコピーすることができる。なお、関数電卓の機能として、計算に使うための自作公式を保存できうるが、保存された公式をプログラム内で使えない仕様になっている。

[2018/02/26 追記]
fx-5800PがPCリンク可能になっている。有志の方が開発・頒布なさっている CcLinker を利用すれば良い。最近は海外からの注目されはじめている。
ついに fx-5800P がPCリンク可能になった




以上、簡単にfx-5800P専用プログラミング言語を俯瞰した。


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


 


keywords: fx-5800P言語仕様プログラミング入門プログラム関数電卓

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

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

プログラムライブラリ - 目次 -

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


カシオの fx-5800P を中心に、fx-9860GII (5800Pより大画面、モノクロ) や fx-CG20 / fx-CG50 (5800Pより大画面、カラー) 向けのプログラム集です。本ブログで掲載している種々のプログラムを、まだ全て収録してはいませんが、徐々に拡充してゆきます。

fx-FD10 Pro では、fx-9860GII 用純正Casio Basicプログラムは動作するはずですが、アドインが使えない仕様なのでC.Basicのインストールができず、従って C.Basic専用プログラムは動作しないと思われます。

※適用環境と機種を示す略号の説明
  • [5800P] :  fx-5800Pで動作可能
  • [FX]:fx-9860Gシリーズで動作可能
  • [CG]:fx-CGシリーズで動作可能
  • [Casio Basic]:純正Casio Basicで動作可能
  • [C.Basic]:C.Basicで動作可能

Program Library in English



1. プログラミングツール

  ⇒ キーコード取得 [Casio Basic / C.Basic] [5800P / FX / CG]

  ⇒ RGB指定による色確認プログラム [C.Basic] [CG]

  
OS内蔵ファンクションメニュー番号探索 [C.Basic] [FX / CG]


2. 数学 / 理工

  ⇒ ピタゴラス数

  ⇒ 素因数分解

  ⇒ モンテカルロ法による円周率の計算

  ⇒ 圧力換算 [Casio Basic] [5800P]

  ⇒ 圧力換算 (fx-9860GII、fx-CG20 / CG50) [Casio Basic / C.Basic] [FX / CG]


3. 実用

  ⇒ 世界の時差換算 - Time Zone [Casio Basic] [5800P]

  ⇒ 世界の時差換算 - TimeZone [Casio Basic / C.Basic] [FX / CG]

  ⇒ 複利計算プログラム - CompInt [Casio Basic / C.Basic] [5800P / FX / CG]

  ⇒ 西暦-和暦 換算プログラム - YearConv 2.1 [Casio Basic / C.Basic] [5800P / FX / CG]

  ⇒ 日本語版 西暦-和暦 監査プログラム - YearConv 3.1 [C.Basic for CG] [CG]


4. ゲーム

  ⇒ もぐら叩き [Casio Basic] [5800P]

  ⇒ もぐら叩き [Casio Basic / C.Basic] [FX]

  ⇒ もぐら叩き [Casio Basic / C.Basic] [CG]

  ⇒ Hit & Blow 数当てゲーム [Casio Basic / C.Basic] [5800P / FX / CG]

  ⇒ マスターマインド Ver. 4 - モノクロ版 [Casio Basic / C.Basic] [FX]

  ⇒ マスターマインド Ver. 4 - カラー版 [Casio Basic / C.Basic] [CG]

  ⇒ 反射ゲーム


5. 汎用サブルーチン

  ⇒ 入力ボックス 2.0 / 2.1 [Casio Basic] [5800P]

  ⇒ 入力ボックス 2.1G [Casio Basic / C.Basic] [FX / CG]

  ⇒ 3桁区切り出力 (汎用サブルーチン) [Casio Basic / C.Basic] [5800P / FX/ CG]





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


 




keywords: fx-5800PCasioBasicプログラムライブラリプログラム関数電卓

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

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

プログラムライブラリ - 日本語版 西暦-和暦換算プログラム

プログラムライブラリ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

初版 2019/05/07
 更新 2019/05/08


日本語版 西暦-和暦 換算プログラム (令和対応版) - YearConv Ver 3.2


※ カシオプログラム電卓の実用プログラムでは、多分世界初の日本語表記プログラム!?
※ 令和の御代代わりを言祝ぎ、作成したもの.

[2019/05/07] バグ修正版
[2019/05/08] 元号期間の誤りを訂正 (元号一覧- Wikipedia による)、ファイル差し替え



著作権者

やす (Krtyski)
[当ブログ管理人]



対応機種

- Casio fx-CG10/20・fx-CG50 - C.Basic for CG Ver 0.50 alpha 以降でのみ動作、最新版を推奨
アドイン版Casio Basic - C.Basic for CG が必要


プログラムの説明

Casio Basic プログラムは日本語表記できない

西暦と和暦を換算する機能に加えて、"あの人の年齢はいくつかな?" 機能をおまけとして追加したプログラムを、公開しています。
プログラムライブラリ - 西暦-和暦 換算プログラム - YearConv Ver 2.2

これを日本語版にしたものを今回紹介する。


fx-CGシリーズ日本語化プロジェクト

カシオのfx-CGシリーズ (fx-CG10 / CG29 / CG50) は、中文を言語として選択ができ、内蔵されている各国語フォントに中文用の簡体字フォントが含まれています。このフォントは GB2312コードに近いが少し異なるカシオ仕様になっています。

残念ながら選択言語に日本語はありません。カシオが電卓ビジネスにおいては、日本市場を軽視し、日本市場のためには開発資源を回さない方針の証でもあります。経済原理の前には日本メーカーであることを忘れなければならないのでしょう。とても残念に思います。

さて、管理人の周りでは、プログラム電卓で作る走るプログラムを日本語表記させたいという話が以前からありました。
そして、Colon様、saentaro様、ツル様が中心になって、
 ・無ければ日本語フォントを作ろう
 ・既に内蔵されている簡体字フォントを流用しよう
という開発の流れが始まり、簡体字フォントを流用するアプローチの1つとして、fx-CGシリーズの各種表示を簡体字化する g3l ファイルが Colon様により作成され、fx-CG20 / CG50 日本語化計画 にて発表しています。

さらに、アドイン版Casio Basic - C.Basic for CG の開発過程で、電卓本体に内蔵されている簡体字フォントをキャラクタとして使えるようになっており、Ver 0.83 alpha 以降では欲しい漢字を探しやすくなりました。


Year Converter 日本語版 Ver 3.1 の画面と操作

YC_cb1f YC_cb2f YC_cb3f 
左の画像 - C.Basic for CG のファイルリストから YearConv.g3m を起動.
中央画像 - YearConv が起動し、デフォルトで日本語表記されている.
右の画像 - [0]キーで AD (西暦) 2020 年を入力した結果。令和 2 年を入力した結果も同じになる.

YC_cb4f YC_cb5f YC_cb6f 
左の画像 - [6]キーで2038年を入力すると、令和2年生まれの人は2038年で18才になると分かる.
       [7]キーで18を入力すると、令和2年生まれの人が18才になるのは2038年だと分かる.
     どちらも同じ結果が表示される.
中央画像 - [3]キーを長押しすると昭和時代の期間が表示される. ひらがなフォントも使える.
右の画像 - [OPTN]キーで英語表記に切り替わったところ. もう一度押すと漢字表記に戻る.


プログラム編集画面での漢字表示

YC_cb9f YC_cb8f YC_cb10f 
左の画像 - Yrd.g3mのソースコードを表示したプログラム編集画面.
       ミニフォント表示で、さらに漢字を出力しているコードがみえる .
中央画像 - プログラム編集画面で日本語表示するために、SETUPで Edit GB Font を On か Full にする.
右の画像 - "AD" を"西暦" としたいが、簡体文字フォントでは "暦" にならず、妙なフォントになる.
       そこで "AD" の表記のままにした。

Excel - KANJI DispCap11f 
左の画像 - Excel で "和" を入力して、JISコードの10進数表示と16進数表示を示している.
       B7セルには =IF(A7="","",CODE(A7))、C'セルには =IF(A7="","",DEC2HEX(B7))
       と式を入力.
       これから、”和" の JISコードが 4F42 と分かる. このExcelファイルのダウンロード.
右の画像 - C.Basic for CG で 簡体字フォント がJISコード並びで表示されている画面.
       0x4F20 ~ 0x4F7F までが表示されており、4F42 を探せば "和" が見つかる.
       このまま [EXE]キーを押せば、ソース編集画面のカーソル位置に "和" が入力される.

最初は、漢字を使わない英語表記のバージョンの Year Converter Ver 2.2 を 純正Casio Basic で作りました。このソースコードを元にして、下記の3つの C.Basic for CG 拡張機能を代わりに使って日本語版に改造しました。プログラム構造やロジックは 純正Casio Basic で最初に作ったものと同一です。
  • Getkey の代わりに拡張コマンド Getley1 を使用.
  • Else If と多くの IfEnd を使う代わりに新たな ElseIf ステートメントと1つの IfEnd を使用
  • 簡体字コードを使用
簡体字コードの仕様は日本語版には必須ですが、それ以外の Getkey1ElseIf は特に変更する必要はありません。



プログラムのファイル構成

メインプログラム: YearConv
サブルーチン: YrcYrdYrl
入力ボックス: INPI



プログラムファイル & ソースコード

※ C.Basic for CG 用プログラムファイル
   プログラムファイル (g3m) とテキストファイルのダウンロード
  • 本プログラムには、入力ボックス INPI が必要です(ダウンロードファイルに含まれています)。




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


 


keywords: fx-5800PCasioBasic、プログラムライブラリプログラム関数電卓

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


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

プログラムライブラリ - 西暦-和暦 換算プログラム

プログラムライブラリ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

最終更新:
2019/05/08


西暦-和暦 換算プログラム (令和対応版) - YearConv Ver 2.2


[2019/05/07] バグ修正版.
[2019/05/08] 元号期間の誤りを訂正 (元号一覧(日本) - Wikipoedia による)、ファイル差替え

著作権者

やす (Krtyski)
[当ブログ管理人]



対応機種

- Casio fx-5800P
- Casio fx-9750GIII, fx-9860Gシリーズ(G, GII, GIII) - 純正Casio Basic および C.Basic for FX で動作
- Casio fx-CGシリーズ - 純正 Casio Basic および C.Basic for CG で動作

(fx-FD10 Pro でも fx-9860Gシリーズ用が動作すると思われます)



プログラムの説明

"あの人の年齢はいくつかな?"

西暦と和暦を換算するプログラムを作ってしたところ、それだけではつまらない。そこで、おまけ機能として "あの人の年齢はいくつかな?" 機能を追加しています。

西暦-和暦換算部に何か年を入力します。これが "あの人" の生年月日です。この状態で [5] (5:In) を押して4桁の西暦年を入力すると、入力した年の "あの人" の年齢が 7: の項に表示されます。[6] (6: y) を押して年齢を入力すると、"あの人" がその年齢の時の西暦年が 6: の項に表示されます。


さて、YearConv2 は、最初に fx-5800P用に作成した西暦-和暦 換算プログラムです。
プログラムの詳細は Casio Basic入門19 ~ 21 を参照してください。

fx-5800P用プログラムを、fx-9860Gシリーズ用 (g1mファイル) および fx-CGシリーズ用 (g3mファイル、カラー表示) に移植したものも収録しました。

基本的なロジックやプログラム構造は全く同じですが、画面の広さの違いから換算できる和暦が 大正~令和に限定されるのが fx-5800P用、明治~令和まで対応しているのが fx-9750GIII, fx-9860Gシリーズと fx-CGシリーズです。

YearConv_1 YearConv_7 Heisei
fx-5800P用


YC_FX_1 YC_FX_2 YC_FX_3 
fx-9860Gシリーズ用


YC_CG_01 YC_CG_02 YC_CG_03 
fx-CGシリーズ用

 - 起動時の画面

中央 - AD(西暦)、M(明治)、T(大正)、S(昭和)、H(平成)、R(令和) のどれかに入力すると、他が連動して換算される。
   [6] (6: In) に入力すると、その年での年齢を表示
   [7] (7: years) に入力すると、その年齢になる西暦年を表示

  - [4] (4:H) を長押しすると、平成の期間を表示




プログラムのファイル構成

メインプログラム: YEARCONV
サブルーチン: YRCYRDYRL
入力ボックス: INPI

YRL は C.Basic で使う際に必要。fx-5800P用のファイル構成には含まれない。



プログラムファイル & ソースコード

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

※ fx-9750GIII, fx-9860Gシリーズ と fx-CGシリーズの純正Casio Basic ならびに C.Basic で動作します。
   fx-9750GIII, fx-9860Gシリーズ用: Year Converter Ver 2.1 ダウンロード
   fx-CGシリーズ用: Year Converter Ver 2.2 ダウンロード

  • 本プログラムには、入力ボックス INPI が必要です(ダウンロードファイルに含まれています)。
  • 同梱されている g1m ファイルは fx-9860GII 向けですが、変更せずそのまま fx-CG20/50 に転送すると正常動作します。但し 転送後 fx-CGシリーズの g3m ファイルに自動変換されます。
  • ダウンロードファイルには、ソースコード(テキストファイル) を含んでいます。テキストファイルは C.Basic で変換したものです。
  • サブルーチン YRL は、C.Basic で使用するものです。但し純正Casio Basic では実行が無視されるので転送しても問題ありません。
  • メインルーチン YEARCONV の1行目の 200→L はキー長押し時間を決める。長押しと認識するまでの時間を短くするにはこの数値を小さくする。長くするには数値を大きくする。
  • C.Basic では 現在設定されている実際の実行速度に対応して サブルーチン YRL で長押し時間を自動調整しているので、1行目での長押し時間の設定は動作に影響しない。これは特にオーバクロック時に有効。
  • 令和に対応しました。[2019/05/05] 



応援クリックをお願いします。励みになるので...
にほんブログ村 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プログラミング入門プログラム関数電卓

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

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

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

やす (Krtyski)

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


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

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

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


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR