e-Gadget - プログラム関数電卓 2017年11月

プログラムライブラリ - マスターマインド Ver. 4 カラー版

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

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

2017/10/23
追記 2017/11/21
修正 2017/11/22
修正 2017/11/23


MASIOV4C (マスターマインド カラー版) - fx-CG20 / fx-CG50

[2017/11/23 修正] 作者が fx-CG50購入記念に提供頂いたスペシャルバージョン (MASIO50T) が更新・差し替え。よりカラフルに、より遊びやすくなった。


著作権者

ツル
[当ブログ読者]



対応機種

カラーグラフ関数電卓: fx-CG20 / fx-CG50



MASIOV4C について

Master Mind for Casio Calculator ⇒ Master Mind + Casio ⇒ MASIO と作者により銘々
既に公開している Ver. 3 をより本来の マスターマインドに近づける感じにした最終版 

Ver. 4 でカラー版なので、MASIO + V4C ⇒ MASIOV4C

Ver. 3 については、ゲーム ~ マスターマインド (fx-CG20 / fx-CG50) 参照



ゲームの遊び方

(Ver3からの変更点)
  • 左下から入力始め、右上へ進行
  • 判定を、白丸・黒丸以外にも、HBの下に数字を表示
  • Normal ModeとEasy Modoとを追加。SHIFTキーで切替え
  • Normal Modeでは、(ー)で回答表示すると、そのゲームでの♢獲得はなし。 次のゲームへ進む。
  • Normal Modeでは、6トライ以内に正解の場合、♢2個獲得。10トライ以内に正解の場合、♢1個獲得。
  • ♢の合計が10個になると、祝画面表示が見られる。
  • Easy Modeでは、正解で♢10個獲得でき、祝画面が見られる。
  • メイン画面左上に、現時点で獲得できる♢数を表示。
  • メイン画面に、Normal ModeではN。Eazy ModeではE を表示 (現在のモードがわかる)
  • いつでも、EXITキーにて終了可能。
  • p・表示は、[・] キーで現時点の獲得♢(prize)数を左上に表示

ゲームの動作画面

正解 (4 Hit) した時の画面



◇=10 になった時のお祝い画面




プログラムファイル

▶ Ver. 4: MASIOV4C.g3m ファイル (fx-CG20 / fx-CG50) のダウンロード

fx-CG50用スペシャルバージョン (Ver 4.3):MASIO50T.g3m (fx-CG50向け) のダウンロード
  プレイ画面の色を自由に選べる機能
  Easy Mode を 1~6 のみ使用でより遊びやすくなった




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




keywords: CasioBasicプログラム電卓、マスターマインドゲームfx-CG20、fx-CG50

関連記事

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

fx-CG50 でフラクタル - シダの葉

2017/10/31
修正 2017/11/01
追記 2017/11/21
追記 2017/11/23

fx-CG50 でフラクタル - シダの葉


akatuki様のブログ "高機能電卓の情報" で  fx-CG50 国内発売記念として「シダの葉グラフィックス」の記事に興味深いフラクタルねたが投稿されました。

これをベースに sentaro様が fx-CG50 のアドインを作成されました。

fx-CG50 Shida Addin Result Image 
fx-CG50 のカラーグラフィックスの表現力がよく分かる結果画像ですね。
3万ドットの描画ですが、6秒程度で描画が終わります。


一方、このアドインを sentaro様 と管理人とで Casio Basic に移植して SHIDACG.g3m を作りました。これを走らせたところ描画が終わるのに40分程度 [2017/11/01 修正] かかりました。

fx-CG50 Shida Casio Basic PxlOn Result Image 
移植したものなので、描画はほぼ同じなのは当然です。fx-CG50 の高精細カラーLCDに1ドット単位で描画するには、PxlOn コマンドを使うしかありませんが、とても処理の重いコマンドです。このようなグラフィックス描画は、fx-CG50 の 純正Casio Basic には荷が重いということが分かります。

[2017/11/21 追記]
ところで、アドイン版 Casio Basic - C.Basic for CG アルファ版 で実行すると、54秒と大幅に高速化しました。さらに  fx-CG50 用チューンアップツール - Ptune3 で [F5] でプリセットされた設定にして 210MHz にオーバークロックするとさらに高速化した20秒で描画完了しました。
 
[2017/11/23 追記]
アドイン版 Casio Basic - C.Basic for CG α版 で、Ptune3 ([F5] の設定) 併用で整数演算を宣言して実行すると7秒で描画。アドインに近い高速化が達成され、C.Basic for CG の高速化の実力が分かります。なお、SHIDACG.g3m を変更して整数演算に対応した SHIDACGI.g3m を使う必要があります。

 
ちなみに、ViewWindows で論理座標系を設定して、PlotOn コマンドを使って描画すると1ドットが 3x3 ピクセルとなり、グラフィックス描画は粗いものになります。

fx-CG50 Shida Casio Basic PlotOn Result Image 
この結果画像では、高精細カラーグラフィックスの良さがありません。fx-CG50 Casio Basic での論理座標系は、fx-9860GII との互換性を保つために、1ドットが 3x3 ピクセルになっています。仕方有りません。

ちなみに、SHIDACG.g3m のソースで、下から3~4行目は

PxlOn G,H
'PlotOn H,G


としてあり、PxlOn G,H をコメントアウトし、'PlotOn H,G のコメントアウトを外してから実行すると、上の結果が得られます。

さて、現在 sentaro様により C.Basic for CG の開発が進められています。fx-9860GII用 C.Basic は、本ブログで既に応援しておりますが、それの fx-CG20 / CG50 対応版です。C.Basic はアドインに近い速度で Casio Basic を実行できる開発&実行環境です。

冒頭のアドインによる高速描画は、C.Basic for CG のポテンシャルを示していると言えます。是非とも フラクタルを C.Basic for CG で走らせてみたいものです。登場が楽しみです。



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




keywords: CasioBasicプログラム電卓、fx-CG50、C.Basic
リンク集 | ブログ内マップ




関連記事

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

プログラムライブラリ - もぐら叩き (fx-CG20 / fx-CG50)

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

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

更新 2017/08/04
追加・修正 2017/08/15
追記・修正 2017/11/21


WHACK-A-Mole (もぐら叩き) - fx-CG20 / fx-CG50


著作権者

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



対応機種

Casio fx-CG50 / fx-CG20 / fx-CG10

Casio fx-5800P 用は こちら
Casop fx-9860G / fx-9860GII 用は こちら



プログラムの説明

Whack-A-Mole (もぐら叩き) のオリジナルは、非力な fx-5800P でアクションゲームを作れるかどうか試しに作ったものです。

これをカラー高精細液晶を搭載した fx-CG50 に移植しました。 fx-CG20 と fx-CG50 の Casio Basic プログラムは完全互換なので、どちらでも遊べます。

画面に色を付けています。また、設定を変更する画面では、fx-5800P に搭載されている便利な ? 命令が fx-CG20 / CG50 には無いので、e-Gadget 特製入力ボックス 2.1G を使ってプログラム全体を見直して、使い易くしました。

ゲーム機能は、fx-5800P 用と同じ。3×3 の配置の孔から モグラが顔を出した時に [1] ~ [9] の対応するテンキーで叩く、お馴染みのモグラ叩きです。

一定ポイントを超えると、偽モグラが顔を出したり、偽モグラと本物が一緒に顔を出すようになり、偽モグラを叩くとペナルティとなります。各種設定を変更する機能があり、難易度を自由に変えられます。

今回の移植にあたり、ゲーム進行を遅くするための ウェイト 設定を新設し、他のパラメータの初期値も変更しています。デフォルトで fx-5800P と同じ感じで遊べるようになっていると思います (若干易しめ)。



プログラムの使い方

もぐら退治の賞金稼ぎがゲームコンセプト:
  • ゲーム開始時に、LIFE ポイント (初期値 7) をもらう。
  • モグラ退治が遅い場合や間違って退治するとLIFE が減り、LIFE ゼロでゲーム終了!
  • モグラ1匹あたり、定額の資金 (FUND、初期値 20) をもらう。
  • モグラ退治に時間がかかるほど、退治費用 (COST) がかさむ。
  • モグラ退治が速ければ、FUND - COST が儲けとなり、賞金 PRIZE に加算される、
  • モグラが顔を出してから所定の時間がかかり COST が BURSTポイント (初期値 6) までかさむと、BURST となり LIFE が 1 減る、
  • モグラが顔を出してから時間がかかり過ぎて COST が TIME-OUTポイント (初期値 8) までかさむと、時間切れ (Time-Out) になって  LIFE が 1 減るだけでなく、賞金 PRIZE が BURST LOSS (初期値 25) だけごっそり減る 。
  • 賞金 PRIZE が INVOKE FAKE ポイント (初期値 200) に達すると、FAKE モードが発動する。
  • FAKE ONE モードは、偽モグラが出現する。放置しなければならない。手を出すと LIFE が 1 減る。
  • FAKE TWO モードは、偽モグラと本物モグラが同時に出現。本物を退治すると儲けがあるが、偽モグラを退治すると LIFE が 1 減る。
限られたLIFEで、どこまで賞金(PRIZE) を稼げるか、がんばろう!!

Life、Burst、Time-Out、Fund、Burst Loss、Invoke Fake、Wait の設定値は Settings で変更できます。



チューンアップした時の設定について

fx-CG20 や fx-CG50 で Casio Basicプログラムの動作を高速化する方法があります;
  • fx-CG20 のチューンアップツール Ptune2 を使ってオーバークロックする方法 ⇒ こちらを参照
  • fx-CG50 のチューンアップツール Ptune3 を使ってオーバークロックする方法 ⇒ こちらを参照
これらの環境で もぐら叩きを楽しむには、設定画面で Wait を 大きな数値に設定する必要があります。チューンアップの程度によりますが、Wait=50 など2桁にすれば fx-5800P と同じ感じで遊べると思います。試してみてください。



C.Basic for CG で実行する場合

アドイン版Casio Basic - C.Basic for CG で実行するとかなり高速化するので、設定画面で Wait を 2000 程度にするとちょうど良い速度になると思います。なお Wait に4桁を設定できるようにプログラムを変更しました。 



プログラムの構成

メインプログラム: WHACKAMO (これを起動する)
ゲーム本体: WAM

 Select Program First Screen Start Game
 Fake One Mode Fake Two Mode Keep Going
 Game Over Try Again Set Parameters



ダウンロード

プログラムファイルのダウンロード:Whack-A-Mole_Color.zip



ソースリスト

PDF と EXCELファイルのダウンロード
 [2017/08/16 変更] ソースリストにExcel ファイルを追加、ソースリストを訂正。

Whacka_a_Mole_Color


 


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




keywords: fx-5800PCasioBasic、プログラムライブラリもぐら叩き、プログラム関数電卓

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


関連記事

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

投票 : あなたのプログラム電卓

楽屋裏 - プログラム電卓投票
e-Gadget


 更新 2016/12/04
更新 2017/11/19

[2017/11/19] fx-CG50 と fx-9860GII SD を選択肢に追加


少し前に、あなたの Best One カシオ電卓 で取り上げた「カシオ電卓発売50周年記念」で、好きな電卓の投票をやっていました。その投票結果で、プログラム関数電卓 fx-5800P が総合3位に入っていました。

そこで、プログラム電卓を使っている人たちの中で、実際にお気に入りのプログラム電卓や、欲しい機種は何だろう?と興味があるので、皆様にお聞きしたくなりました。当ブログはページビュー累計が10万を超え、訪問される方の累計が3万人を超えている程度です。少ないながらもプログラム電卓に興味をお持ちの方の母集団がここにあります。

投票期限は設けておりませんので、じっくり時間をかけて投票結果を見てゆけば、皆様のプログラム電卓の傾向が見えてくるかも知れません。
皆様の投票結果やコメントは、どなたでも見られます。

この投票は、営利目的ではありません。結果の利用は自由です。



投票01
プログラム電卓の中から、お気に入りの機種や欲しい機種を教えてください。
[2017/11/19] fx-CG50 と fx-9860GII SD を追加

投票02
プログラム電卓でのプログラム作成と利用について教えてください。なお機種名をコメント欄に記入してください(必須)。

投票03
プログラミング経験について教えてください。なおその時に使用した言語名をコメント欄に記入してください (必須)。

毎週1回投票できるので、お気に入りは何度でも投票できます。
下の投票ボックスの下にある 投票結果 をクリックすると結果が見られるので、参考にしてください。

投票01

 
投票02
電卓機種をコメント欄に記入(必須)
 
投票03
使用言語をコメント欄に記入 (必須)

.


各機種の価格については、Casio プログラム電卓の価格動向 をご参考に...

投票の項目にあるカシオの機種について...
fx-5800P_1fx-5800P は、構造化プログラミング可能な新世代Casio Basic搭載機のなかでは、一番低コストで入手可能な機種。

但し、プロセッサは最も遅く、Casio Basicの機能も他の機種よりも制限されている。

高速動作や多くのメモリが必要な本格ゲームを作るのでなければ、構造化プログラミングができるだけの実力があり、実用プログラムやゲームも作れる(当ブログで紹介している)。

関数電卓としては、現行プログラム電卓では最も使いやすい(と思う)。小型軽量な点も良い。

PCリンク機能はない。






fx-9860GII fx-9860GII には、マイナーバージョンが2つある;
・初期型が SH3プロセッサを搭載
・後期型が SH4Aプロセッサを搭載

投票項目は、これらを区別している;
・初期型: fx-9860GII
・後期型: fx-9860GII 2

これらの違いは、液晶画面下の表記でわかる;
・初期型 (fx-9860GII)  : USB GRAPHIC
・後期型 (fx-9860GII 2) : USB GRAPHIC 2

現行プログラム電卓の中では、Ftune2 でオーバークロックすると最も高速になる隠れた高性能機。

Casio Basic 以外にアドインプログラムを走らせることができる。アドインは自分で作ることも可能。

PCリンク機能を備える。

fx-CG20_midfx-CG20 / CG10 (北米専用)は、高精細カラー液晶を搭載しているので、表現力の高いプログラムを作れる。

チューンアップツール Ptune2 (Ptune についても簡単に触れている)により高速化できるが、残念ながら fx-9860GII ほどに高速化できない。

プログラムを超高速化できる C.Basic for CG が上梓された。これを使えば 鈍足 CG10 / CG20 が超高速プログラミング環境に変貌する。

Casio Basic以外にもアドインプログラムを走らせることができる。自分でアドインを作ることも可能。

PCリンク機能を備える。




fx-FD10 pro  fx-FD10 Pro のハードウェア内部は fx-9860GII に近い。但し Casio Basic専用機で、fx-5800P の高機能機種の位置づけと言える。

アドインプログラムを走らせることはできない。

関数電卓として使う場合は、関数キーが少ないので2ステップやメニューからの選択と手数が増える。

一方、プログラム電卓としては、fx-5800P に近い使いやすさが考慮されている。

PCリンク機能を備えるだけでなくSDカードも使える。





fx-CG50_sfx-CG50 は処理速度が向上したことで、ようやく fx-9860GII の後継機種といえる。fx-CG10 / CG20 を購入する意味が無くなったと言える。

アドインプログラムも使えるが、Casio 純正のSDKは準備されていないので、個人が作成した fx-CG10 / CG20 用のSDK を工夫して使う必要がある。

機能面では fx-CG10 / CG20 とほぼ同じで、カタログ機能の改善やQRコード表示機能が追加された。

PCリンク機能を備える。







fx-9860GII & fx-9860GII SDSDカードが使える以外は、fx-9860GII と完全互換。プログラムやデータの保管が容易にできるので、使ってみると非常に便利。

PCリンク機能を備える。














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





keywords: プログラム関数電卓
リンク集 | ブログ内マップ
関連記事

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

プログラムライブラリ - 複利計算プログラム

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

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

2017/11/18


複利計算プログラム:
CompInt

元金、年利(%)、返済期間(年)を入力すると、返済総額、月々返済額を表示する複利計算プログラム、3桁区切り出力機能付き。

入力ボックスや3桁区切りサブルーチンの使いこなしサンプルプログラムとして Casio Basic入門で作ったものを、さらに使いやすく改善したもの。



著作権者

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



対応機種

Casio fx-5800P fx-9750GIII / fx-9860Gシリーズ(G, GII, GIII) / fx-CGシリーズ (fx-FD10 Pro 対応可と思われる)



計算方法

最も単純な複利計算を行います(小数以下は切り捨て)。

[返済総額] = [元金] x (1 + [年利(%)]/100)[返済期間(年)]

必要に応じて改造してお使いください。



CompInt の使い方

fx-5800P - 8桁対応
1-C: に元金、2-R: に年利(%)、3-Y: に返済期間(年) を入力する。元金は最大8桁の入力が可能で、3桁区切りで表示される。これら3つが入力されると TOTAL に返済総額、MONTH に月々返済額が3桁区切りで表示される。
CompInt_1_5800P CompInt_5800P_2 

[EXIT] でプログラム正常終了


 fx-9750GIII / fx-9860Gシリーズ - 12桁対応
1-Cap: に元金、2-Rat: に年利(%)、3-Yrs: に返済期間(年) を入力する。元金は最大12桁の入力が可能で、3桁区切りで表示される。これら3つが入力されると Total に返済総額、Month に月々返済額が3桁区切りで表示される。
CompInt_9860G_1 CompInt_9860G_s 

[EXIT] でプログラム正常終了


fx-CGシリーズ - 12桁対応
1-Cap: に元金、2-Rat: に年利(%)、3-Yrs: に返済期間(年) を入力する。元金は最大12桁の入力が可能で、3桁区切りで表示される。これら3つが入力されると Total に返済総額、Month に月々返済額が3桁区切りで表示される。
CompInt_CG_1 CompInt_CG_2 

[EXIT] でプログラム正常終了



詳しい説明

Casio Basic入門51~54 Chapter9:簡単な換算プログラム - 入力ボックスの活用 を参照

ここで作った fx-5800P 用プログラムで、三桁区切り出力サブルーチンを 3DS に変更し、入力ボックスの入力を [DEL] でキャンセルする時は元の値(空白含む)に戻すように改善している。



プログラムソース

fx-5800P 用 - 元金入力は最大8桁
ソースリスト (PDFファイル) ダウンロード
 ※ 入力ボックスと3桁区切りサブルーチンのソースも含む.

CompInt2_src_fx5800P 


 fx-9750GIII, fx-9860Gシリーズ(G, GII, GIII)用 - 元金入力は最大12桁
全てのプログラムファイルを同梱した CompInt.zip のダウンロード
 ※ 入力ボックス INPI, INP と 汎用3桁区切りサブルーチン 3DS を含む.

CompInt2_src_fx9860G 


fx-CGシリーズ 用 - 最大15桁まで対応
全てのプログラムファイルを含んだ CompInt_fxCG.zip のダウンロード
 ※ 入力ボックス INPI, INP と汎用3桁区切りサブルーチン 3DS を含む.

CompInt2_src_fxCG 



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




keywords: CasioBasic、プログラムライブラリプログラム関数電卓、3桁区切り出力、汎用サブルーチン

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


関連記事

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

Casio Basic入門58

Casio Basic入門
<目次>

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

 2017/11/04
追記 2017/11/05
修正 2017/11/11


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

Chapter 10 - 中級

◆ Chapter 10 の目標: 3桁区切り出力 - 汎用サブルーチンの作成

前回: Casio Basic入門57 を見る


これまでに、fx-5800P版3桁区切りサブルーチン (下記) が完成しました。

前回完成させた "高速3桁区切り出力・汎用サブルーチン" fx-5800P版:3DS
Z=0⇒Return

Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I

X→D:X→W
X=0⇒17-K-I→X
If X+K+I>17 Or K≥13
Then
X+K≥17⇒17-K→D
If K≥11:Then
2→D:X<2⇒X→D
W=0⇒2→D
IfEnd
Locate D,Y,Z
Return:IfEnd

X103Frac(Z÷X103)→U
Int(X103Frac(Z÷X106))→V
Int(X103Frac(Z÷X109))→W
Int(Z÷X109)→D

If K≤8:Then
Locate X,Y,X108W+X104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
X+K-6+(I≥3)→J
Locate J,Y,X107+X104V+U
Locate X,Y,X104D+W
Locate J+4,Y,","
Locate J,Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd


今回は、3DS の使いこなし例を紹介します。


Chapter 10-4
3桁区切りサブルーチン fx-5800P版 の使いこなし

3桁区切りサブルーチン 3DS は、手軽に使ってこそ価値があると思います。そこで、旧来の命令を使った手軽なプログラムで使いこなす例を紹介します。


指定位置に3桁区切り出力

かけ算プログラム:3DS TEST
"A"?→A
"B"?→B
"C"?→C
"A×B×C="
7→X:4→Y:ABC→Z
Prog "3DS"


これは、変数 ABC に値を入力させ、A×B×C を計算した結果を出力するプログラムです。

実行すると、

 A?

と表示されるので、例えば 12 と入力すると、A12 が格納され、

 A?
 12
 B?


と表示されます。次に 45 と入力すると、B45 が格納され、

 12
 B?
 45
 C?


と表示されます。最後に 78 と入力すると、C78 が格納され、さらに ABC の計算結果を表示します。

 45
 C?
 78
 A×B×C=42,120


4行目に A×B×C= に続いて3桁区切りで出力されています。

旧来の出力命令 " " が実行されると自動的に改行されるので、入力行が1行づつ下に下がります。改行が4行目に達すると、入力行は4行目に固定され、画面表示が1行上にスクロールされる、これが Casio Basic の仕様です。

従って、上のプログラムでは、A×B×C の計算結果が4行目に出力されることを理解していれば、Prog "3DS" の直前の設定で 4→Y で良いことが分かります。 A×B×C= に続いて計算結果を出力させるために、7→X と設定しています。


右寄せで3桁区切り出力

上のプログラムの最後に(一旦停止)を追加し、さらに3行追加しました。

かけ算プログラム:3DS TEST
"A"?→A
"B"?→B
"C"?→C
"A×B×C="
7→X:4→Y:ABC→Z
Prog "3DS"

"A×B×C="
0→X:4→Y:ABC→Z
Prog "3DS"


追加分は、右寄せで3桁区切り出力させるために 0→X と設定しています。

実行して、A=12、B=45、C=78 を入力し、以下の画面まで進みます。

 45
 C?
 78
 A×B×C=42,120


命令で一旦停止しているので、[EXE] で次に進むと、

 C?
 78
 A×B×C=42,120
 A×B×C=   42.120


と表示されます。乗算結果 ABC が右寄せで3桁区切り出力されています。


大きな桁の出力

上で最後に作ったプログラムに下記のような追加(赤文字で示す)を行います。

"A"?→A
"B"?→B
"C"?→C
"AxBxC="
7→X:4→Y:ABC→Z
Prog "3DS"

"AxBxC="
0→X:4→Y:ABC→Z
Prog "3DS"


"AxBxC="
" "
0→X:4→Y:ABC→Z
Prog "3DS"


そして、A=1234、B=4567、C=7891 を入力してみると、画面は先ず

 4567
 C?
 7891
 A4.44711351
X1010


となり、一旦停止を解除するために [EXE] を押すと

 C?
 7891
 A4.4411351
X1010   
← 指数表示が右寄せになっている
 A×44,471,135,098  
← 3桁区切り出力が右寄せになっている


となります。3DS の仕様により出力が右に溢れないように、左にずらして出力されており、仕様通りです。但し出力結果は見づらいものです。

さらに [EXE] を押すと、

 A4.44711351X1010
 A×44,471,135,098

 A×B×C=
    44,471,135,098


と、改行&右寄せが適していることが分かります。

0→X と設定した時に右寄せ出力する機能を追加したのは、このような出力が有効だと考えたからです。


大きな桁の出力を試すプログラム

上記のプログラムの最後にコードをさらに追加して、もっと大きな桁で出力するサンプルプログラムを作ってみます。

ちなみに上のプログラムでは、実行を一旦停止するために 旧来の命令 を使い、文字列出力のために " " 命令(出力文字無し)を使っています。この場合 " " は内部カーソル行を改行し、その次に実行される出力命令 " " は改行された位置に出力します。ところが内部カーソル行が4行目になると、内部カーソル行は常に4行目になるので、" "  命令での出力位置は常に4行目となります。

内部カーソル行が4行目になっているときに 4→Y: Prog "3DS" を実行すると、4行目の表示の上に3桁区切り出力が上書きされます。上書きせず改行して出力したい時は、画面を1行上にスクロールさせるために " " 命令 (出力文字なしで改行のみ)を利用しています。

これは、Casio Basic の旧来の命令 " "Locate コマンドを併用する時のチョットしたコツです。

3DS TEST Src for fx-5800P 

これを実行し、A=123、B=345、C=7891 を入力すると、

 456
 C?
 7891
 A×B×C=442590408


[EXE] を押すと、

 C?
 7891
 A×B×C=442590408
 A×B×C442,590,408


[EXE] を押すと、

 A×B×C=442590408
 A×B×C442,590,408
 A×B×C=
     442,590,408


さらに [EXE] を押すと、Cls で画面消去し、

 A×B×C=
     442,590,408


さらに [EXE] を押せば、

 A×B×C=
     442,590,408
 4×A×B×C=
    1,770,361,632




さらに、[EXE] を押して、

 4×A×B×C=
   1,770,361,632
 16×A×B×C=
   7,081,446,528


最後にもう一度 [EXE] を押すと、

 16×A×B×C=
    7,081,446,528
 256×A×B×C=

  113,303,144,447

と表示されます。改行して右寄せで出力すると、大きな桁が見やすくなると思います。

色々と試してみてください。


入力ボックスINPIと3桁区切り3DS の組み合わせ - 3DS DEBUG2 [2017/11/05 追記]
前回 Casio Basic入門57 (Chapter 10-3) で、デバッグ用プログラム 3DS DEBUG2 を紹介していますが、これは入力ボックス INPI と 3桁区切り 3DS を組み合わせて使っています。

INPI3DS は共に 出力位置 (X, Y) と入出力値 Z の意味で、変数 X, Y, Z をサブルーチンに渡す仕様なので、X, Y Z をうまく共有して使えます。改めてプログラムソースを紹介します。

3DS DEBUG2 Src for fx-5800P 


入力ボックスと3桁区切り3DS の組み合わせ - COMPINT [2017/11/11 修正]
Casio Basic入門51 (複利計算プログラム) で入力ボックスの使いこなしを紹介し、さらに3桁区切りサブルーチンを作り組み合わせました。今回の汎用サブルーチン 3DS の原点となったプログラムです。

そこで、[最終版] 複利計算プログラム (3桁区切り) のプログラムを示します。
入力ボックス2INPI 2.0INP 2.1 を利用します。

CompInt src for fx-5800P 




fx-5800P版 高速3桁区切り出力・汎用サブルーチン - 3DS

完成した fx-5800P 版 3桁区切り・汎用サブルーチンを改めて示します。

※ ダウンロード: 3DS for fx-5800P ソースファイル (pdfファイル)

3DS_src_fx5800P.jpg 




次回は、3DS を fx-9860GII と fx-CG50 に移植します。


つづく...

Casio Basic入門59Casio Basic入門G01 / 目次



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





keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓

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



関連記事

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

Casio Basic入門59

Casio Basic入門
<目次>

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

 追記 2017/11/05


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

Chapter 10 - 中級

◆ Chapter 10 の目標: 3桁区切り出力 - 汎用サブルーチンの作成

前回: Casio Basic入門58 を見る


これまでに完成させた fx-5800P版 3桁区切りサブルーチンのソースを再掲します。

fx-5800P版 "高速3桁区切り出力・汎用サブルーチン":3DS
Z=0⇒Return

Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I

X→D:X→W
X=0⇒17-K-I←X
If X+K+I>17 Or K≥13
Then
X+K≥17⇒17-K→D
If K≥11:Then
2→D:X<2⇒X→D
W=0⇒2→D
IfEnd
Locate D,Y,Z
Return:IfEnd

X103Frac(Z÷X103)→U
Int(X103Frac(Z÷X106))→V
Int(X103Frac(Z÷X109))→W
Int(Z÷X109)→D

If K≤8:Then
Locate X,Y,X108W+X104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
X+K-6+(I≥3)→J
Locate J,Y,X107+X104V+U
Locate X,Y,X104D+W
Locate J+4,Y,","
Locate J,Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd


今回は、グラフ関数電卓への移植を試みます。

なお、fx-CG20 / CG50 と fx-9860GII は同じプログラムで完全に動作しますが、プログラム編集画面での表現が少し異なります。fx-CG20 / CG50 では [X10x] キーを押すと X10x と表記されます。これは fx-5800P も同じです。一方 fx-9860GII では同じキーが [EXP] と印刷されていて、プログラム編集画面では E と表現されます。

先ずは、fx-CG20 / CG50 での表現でプログラムを記述します。

Chapter 10-5
3桁区切りサブルーチン グラフ関数電卓版

グラフ関数電卓版 3DS の仕様
  1. 15桁対応:fx-5800P版のプログラムは、そのまま100%互換でグラフ関数電卓で動作します。しかし、1行が21桁あり fx-5800P の12桁対応では物足りなく感じる。そこで、15桁対応に拡張します。
  2. 変数を増やさない3DS で用いる変数は fx-5800P版と同じとする。メインルーチンで使う変数の制限をこれ以上厳しくしないことを優先的に考え、グラフ関数電卓版で使う変数を追加しない。

グラフ関数電卓版 3DS
具体的に変更した部分です。

前半の変更は、主に1行の桁数が16桁から21桁に変わるので、それに対応したもの。なお3桁区切りは12桁対応から15桁対応へ変えたことに伴う部分が一カ所ある。

後半の変更は、15桁対応への拡張に伴うもの。特に新たな変数を追加しないので一見煩雑に思えるが、12桁対応と同じロジックを拡張しただけ。

fx-5800P版のソースが分かれば難しくないと思うので、詳細はソースをみてください。


◆ fx-CG20 / CG50版
先ずは fx-CG20 / CG50版 を示します。fx-5800P版と異なる部分を赤文字で示します。

fx-CG20 / CG50版 "高速3桁区切り出力・汎用サブルーチン":3DS
Z=0⇒Return

Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)+(I≥13)→I

X→D:X→W
X=0⇒22-K-I→X
If X+K+I>22 Or K≥16
Then X+K≥2222-K→D
If K≥11:Then
7→D:X<2⇒X→D:W=0⇒7→D
IfEnd
Locate D,Y,Z
Return:IfEnd

X103Frac(Z÷X103)→U
Int(X103Frac(Z÷X106))→V
Int(X103Frac(Z÷X109))→W
Int(Z÷X109)→D

If K≤8:Then
Locate X,Y,X108W+X104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
X+K-6+(I≥3)+(I≥4)→J
Locate J,Y,X107+X104V+U
Locate X+(I≥4),Y,
X107Int (D÷X103)+X107Fac (D÷X103)+W
I≥4⇒Locate X,Y,Int (D÷
X103)
Locate J+4,Y,","
Locate J,Y,","
I≥3⇒Locate X+K-9+(I≥4),Y,","
I≥4⇒Locate X+K-12,Y,","
IfEnd


ダウンロード高速3桁区切り出力・汎用サブルーチン - 3DS (fx-CG20 / CG50版)
 ※ デバッグ・使いこなしテスト用プログラムもダウンロードできます。   


速度に最も影響を与える Locate コマンドの使用回数は、
  • 8桁以下の場合 (K≤8):3回 (fx-5800Pと同じ)
  • 9桁の場合 (K=9 かつ I=2):5回 (fx-5800Pと同じ)
  • 10~12桁の場合 (10≤K≤12 かつ I=3):6回 (fx-5800Pと同じ)
  • 13~15桁の場合 (13≤K≤15 かつ I=4):8回
となる。12桁までは回数は同じで、拡張した13~15桁の場合のみ2回増えることになる。

次に速度への影響を考えるべき論理演算の回数は、
  • 8桁以下の場合 (K≤8):3回 (fx-5800Pと同じ)
  • 9~15桁の場合 (9≤K≤15):7回 (fx-5800Pは2回)
なので、9~15桁では論理演算5回増え、fx-5800P ならば約 50m秒程度遅くなる計算。

しかし、グラフ関数電卓は fx-5800P より処理が圧倒的に速いので、この程度では fx-5800P よりも速く感じる

3DS src for fx-CG50 


fx-9860GII版
fx-9860GII 版も CG版と全く同じだが、X10x の編集画面上の表現が異なるだけだ。

fx-9860Gシリーズ版 "高速3桁区切り出力・汎用サブルーチン":3DS
Z=0⇒Return

Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)+(I≥13)→I

X→D:X→W
X=0⇒22-K-I→X
If X+K+I>22 Or K≥16
Then
X+K≥2222-K→D
If K≥11:Then
7→D:X<2⇒X→D
W=0⇒7→D
IfEnd
Locate D,Y,Z
Return:IfEnd

E3Frac(Z÷E3)→U
Int(E3Frac(Z÷E6))→V
Int(E3Frac(Z÷E9))→W
Int(Z÷E9)→D

If K≤8:Then
Locate X,Y,E8W+E4V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
X+K-6+(I≥3)+(I≥4)→J
Locate J,Y,E7+E4V+U
Locate X+(I≥4),Y,
E7Int (D÷E3)+E7Fac (D÷E3)+W
I≥4⇒Locate X,Y,Int (D÷
E3)
Locate J+4,Y,","
Locate J,Y,","
I≥3⇒Locate X+K-9+(I≥4),Y,","
I≥4⇒Locate X+K-12,Y,","
IfEnd


ダウンロード高速3桁区切り出力・汎用サブルーチン - 3DS (fx-9860Gシリーズ版)
 ※ デバッグ・使いこなしテスト用プログラムもダウンロードできます。


3DS src for fx-9860GII 



Chapter 10 はこれで終わりです。

⇒ Casio Basic入門60 / Casio Basic入門G01 / 目次



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





keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓

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


関連記事

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

Casio Basic入門57

Casio Basic入門
<目次>

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

 2017/11/04
追記 2017/11/05


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

Chapter 10 - 中級

◆ Chapter 10 の目標: 3桁区切り出力 - 汎用サブルーチンの作成

前回: Casio Basic入門56 を見る


前回までに作った3桁区切りサブルーチンは以下です。

前回作った "高速3桁区切り出力・汎用サブルーチン" fx-5800P版:3DS
Z=0⇒Return

Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I

X→D:X→W         
=======
If X+K+I>17 Or K≥13
Then
X+K≥17⇒17-K→D
If K≥11:Then        
エラー処理ルーチン
2→D:X<2⇒X→D
W=0⇒2→D
IfEnd
Locate D,Y,Z
Return:IfEnd       
=======

X103Frac(Z÷X103)→U
Int(X103Frac(Z÷X106))→V
Int(X103Frac(Z÷X109))→W
Int(Z÷X109)→D

If K≤8:Then
Locate X,Y,X108W+X104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
X+K-6+(I≥3)→J
Locate J,Y,X107+X104V+U
Locate X,Y,X104D+W
Locate J+4,Y,","
Locate J,Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd


今回は、右寄せ出力ができるオプションを追加します。




Chapter 10-3
3桁区切りサブルーチン fx-5800P版 右寄せ出力機能の追加

先ず最初に、簡単なサンプルプログラムを作って 3DS の動作を見てみます。

指定位置に3桁区切り出力

かけ算プログラム:3DS TEST
"A"?→A
"B"?→B
"C"?→C
"A×B×C="
ABC


これは、変数 ABC に値を入力させ、A×B×C を計算した結果を出力するプログラムです。

実行すると、

 A?

と表示されるので、例えば 12 と入力すると、A12 が格納され、

 A?
 12
 B?


と表示されます。次に 456 と入力すると、B456 が格納され、

 12
 B?
 45
 C?


と表示されます。最後に 789 と入力すると、C789 が格納され、さらに ABC の計算結果を表示します。

 45
 C?
 78
 A×B×C=
         42120


旧来の出力命令 は、改行して右寄せで出力しますが、慣れると見やすくて便利です。そこで、3桁区切り出力にも右寄せ出力をオプションで設定できるようにします。


右寄せで3桁区切り出力

右寄せ出力を指定する方法として、Prog "3DS" の直前の設定で、X0 を設定することにします。

赤文字で示す1行を追加するだけで、うまくゆきます。

右寄せ機能を追加した "高速3桁区切り出力・汎用サブルーチン" fx-5800P版:3DS
Z=0⇒Return

Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I

X→D:X→W
X=0⇒17-K-I→X
If X+K+I>17 Or K≥13
Then
X+K≥17⇒17-K→D
If K≥11:Then
2→D:X<2⇒X→D
W=0⇒2→D
IfEnd
Locate D,Y,Z
Return:IfEnd

X103Frac(Z÷X103)→U
Int(X103Frac(Z÷X106))→V
Int(X103Frac(Z÷X109))→W
Int(Z÷X109)→D

If K≤8:Then
Locate X,Y,X108W+X104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
X+K-6+(I≥3)→J
Locate J,Y,X107+X104V+U
Locate X,Y,X104D+W
Locate J+4,Y,","
Locate J,Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd


エラー処理ブロックでは、X の値を変数 DW に一旦コピーして、DW で必要な条件判定を行い X の値を変更せずにエラー時の出力を実行するようにしています。今回追加したのは、X=0 の時に単に X の値 (出力開始桁) を変更するだけなので、エラー処理ルーチンに何の影響も与えません。従って、上記の1行を追加するだけで右寄せ機能を実装できます。



検証します。

上のかけ算プログラムの最後の2行を3桁区切りするように変更します。

かけ算プログラム:3DS TEST
"A"?→A
"B"?→B
"C"?→C
"A×B×C="
0→X:4→Y:ABC→Z
Prog "3DS"

右寄せで3桁区切り出力させるために 0→X と設定しています。

実行して、A=12、B=45、C=78 を入力すると、以下の画面になり、

 45
 C?
 78
 A×B×C=   42,120


乗算結果 A×B×C が右寄せで3桁区切り出力されています。


デバッグ用プログラムを改造 - 3DS DEBUG2
以下のようなデバッグしやすいプログラム 3DS DEBUG2 を作りました。表示開始桁 X と 出力数値 Z のどちらかを変更すると、画面スクロールせずに4行目に結果が出力されるようにしています。条件を変えて色々と検証して、管理人はこれを使って問題ないことを確認しています。

3DS DEBUG2 Src for fx-5800P 

入力ボックス INPI を利用して画面構成を壊さないようにしているので、出力位置が1桁ずれてもスグに分かって便利です。




fx-5800P 版の高速3桁区切り出力・汎用サブルーチン完成版を改めて示します。

※ ダウンロード: 3DS for fx-5800P ソースファイル (pdfファイル)

3DS_src_fx5800P.jpg 




次回は、3DS の使いこなしを紹介します。


つづく...

Casio Basic入門58 / Casio Basic入門G01 / 目次



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





keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓

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



関連記事

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

Casio Basic入門56

Casio Basic入門
<目次>

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

 2017/11/03
追記修正 2017/11/05


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

Chapter 10 - 中級

◆ Chapter 10 の目標: 3桁区切り出力 - 汎用サブルーチンの作成

前回: Casio Basic入門55 を見る


今の 3DS の動作を調べるために簡単なデバッグ用プログラムを作って実際の動作を調べ、改善を試みます。

Chapter 10-2
3桁区切り出力サブルーチンの評価と改善

先ず以下のようなデバッグ用プログラムを作ります。

デバッグ用プログラム

3DS DEBUG
Do
Cls
"X"?→X
"Z"?→Z
""
4→Y
Prog "3DS"
LpWhile Getkey=47



このデバッグ用プログラムを fx-5800P で実行し、設定 (XZ) に種々異なる値を入力し、期待通りの動作かどうかを確かめます。


1)
X = 3、Z = 1234567890 (10桁) を入力すると、3桁4行目から
  1,234,567,890
と出力されます。

2)
では、X = 5 とし、Z は同じ Z = 1234567890 (10桁) と入力すると、5桁4行目から
  1234567890
と3桁区切りせず出力します。3桁区切り出力だと1行16文字に収まらない場合はこのようになります (コード通り)。

3)
Xを増やし、X = 8、Zは同じ Z = 1234567890 (10桁) とすると、8桁4行目から
  123456789
となり、右端の 0 が押し出されて消えています。

4)
X をさらに増やし、X = 12、Zは同じ Z = 1234567890 (10桁) とすると、12桁4行目から
  12345
となり、現在のままだと問題です。


◆ 追加仕様1:
右にはみ出る場合は、X で指定した桁を無視して、右寄せで全ての桁を出力する。


そこで、3DS 前半にあるエラー処理ブロック (以下) に着目し、

If X+K+I>17
Then
Locate X,Y,Z
Return:IfEnd


以下のように赤文字の1行を追加します。

If X+K+I>17
Then
X+K≥17⇒17-K→X
Locate X,Y,Z
Return:IfEnd


3桁区切りすると1行16文字に収まらない時は、X+K≥17 になり、この場合は3桁区切りしない値 (Z) をそのまま右寄せで出力するので、出力開始桁である X17-K→X で再設定します。

これを検証します。

3)'
X = 8、Zは同じ Z = 1234567890 とすると、7桁4行目から
  1234567890
と出力され、期待通りの動作です。

4)'
X = 12、Zは同じ Z = 1234567890 とすると、7桁4行目から
  1234567890
と期待通りの出力になります。

=====

エラー処理の結果、3桁区切りだと行あふれになるので、区切り文字無しの正しい値が出力される仕様です。3桁区切りできない事を示すエラー表示の代わりです。しかし正しい値は表示します。汎用サブルーチンは控えめが良いのです。

このような控えめなエラー表示は、メインルーチン内で出力位置や桁数についての再検討を促す意味もある...といったコンセプトです。

では、11桁以上を出力する場合を調べます。

5)
X = 2、Z = 123456543210 (12桁) と入力すると、2桁4行目から
  123,456,543,210
と出力されます。ちょうど右端に出力されています。

6)
X を1つ増やし X = 3、Zは同じで Z = 123456543210 (12桁) を入力すると、3桁4行目から
  1.234565432x101
と出力されます。
本来、1.234565432x1011 と表示されるべきなので、右端の1桁が押し出されて表示されていません。
出力開始桁は設定通りの3桁目。なおエラー処理ルーチンでは Locate X,Y,Z で出力しているので、11桁以上は電卓の仕様に従って指数表示になっています。 

7)
X をさらに1つ増やして X = 4、Zは同じで Z = 123456543210 (12桁) とすると、4桁4行から
  1.234565432x10
と出力され、右端の2桁が押し出されて表示されていません。

これで、新たな問題が明らかになりました。指数表示は電卓の仕様として、最大15桁です。そこで指数表示する場合 (K≥11) 最大15桁が必ず表示されるように変更します。


◆ 追加仕様2:
エラー時の出力が指数表示になる場合 (K≥11 のとき)、15桁を確実に出力する。


fx-5800P は1行16文字なので、指数表示の出力開始桁 (X) は1か2です。そこで、K≥11 の場合、さらに出力開始桁が 2 を超える (X>2) のとき X2 に固定します。

具体的には、エラー処理ブロック

If X+K+I>17
Then
X+K≥17⇒17-K→X
Locate X,Y,Z
Return:IfEnd


に3行(赤文字)を追加します。

If X+K+I>17
Then
X+K≥17⇒17-K→X
If K≥11:Then
X>2⇒2→X
IfEnd

Locate X,Y,Z
Return:IfEnd


検証します。

6)'
X = 3、Z = 123456543210 と入力すると、2桁4行目から
  1.234565432x1011
と期待通りに出力されます。

7)'
X = 4、Z は同じ Z = 123456543210 とすると、2桁4行目から
  1.234565432x1011
と、期待通りに出力されます。

=====

入力桁をもっと大きくしてみます。

8)
X = 3、Z = 1234567890123456 (16桁) を入力してみると、1桁4行目から
  1.23456789x1015
と出力されます。
指定された動作は、1桁目から出力ではなくて2桁目の筈です。

9)
X = 3、Z = 12345678901234567 (17桁) を入力すると、Locate コマンドで Argument ERROR が発生します。


この問題を確認するために、エラー処理のコードを細かくみてみます。

If X+K+I>17
Then
X+K≥17⇒17-K→X
If K≥11:Then
X>2⇒2→X
IfEnd
Locate X,Y,Z
Return:IfEnd


8) の場合は、K = 16、X = 2、I = 4 なので、赤文字で示した1つめ;
  X+K≥17⇒17-K→X
が実行されると、X = 1 となり、赤文字で示した2つめ;
  X>2⇒2→X
は実行されないので、X = 1 となり、これは期待した動作でないことが分かります。

赤文字の1つめで X が変更されたから、本来実行する必要のある赤文字の2つめが動作しなかったと考えます。そこで、エラー処理ブロックでは、X を一旦 変数 D にコピーしておき、赤文字の2カ所の評価結果を D へ格納し、Locate D,Y,Z を実行すれば、2つの評価が正しく実行されます。

一旦、エラー処理ブロックを以下のように変更します。

X→D
If X+K+I>17
Then
X+K≥17⇒17-K→D
If K≥11:Then
X>2⇒2→D
IfEnd
Locate D,Y,Z
Return:IfEnd


ところが、このコードを 9) の17桁入力のケース (K=17) に適用すると、まだ問題が残っていることが分かります。

もし、入力桁数が 17桁以上、つまり K が 17 以上の時、
  X+K≥17⇒17-K→D
が実行されると D が 0以下になり、Locate D,Y,ZArgument ERROR となることが確認できました。

K17 以上の場合は、必ず If K≥11 の中の処理へ進むので、X>2⇒2→D を変更してこの問題を解決します。

D→X
If X+K+I>17
Then
X+K≥17⇒17-K→D
If K≥11:Then
2→D:X<2⇒X→D
IfEnd
Locate D,Y,Z
Return:IfEnd


入力が11桁以上の場合は、出力開始桁を強制的に D = 2 にしておいて、X<2 の時つまり 出力開始桁が1の時は例外的に D = 1 に変更する...条件判定を X>2 から X<2 へ発想を逆転しました。


◆追加仕様3:
入力が17桁以上のとき指数表示になるが、指定桁 X からの出力 or 右寄せ出力にする

検証します。

8)'
X = 3、Z = 1234567890123456 (16桁) と入力すると、2桁4行目から
  1.234565432x1011
と、期待通りに動作します。

9)'
X = 3、Z = 12345678901234567 (17桁) とするとき、2桁4行目から
  1.234567654321x1012
と、今度も期待通りに動作します。


もう少し実験を進めます。

10)
X = 1、Z = 1234567654321 (13桁) を入力すると、1桁4行目から
  1234,567,654,321
と表示されます。3DS は12桁対応なので仕方ないところです。

このままにするか、12桁を超えるとエラー処理ブロックで処理して指数表示するか、どちらが良いかは好みの分かれるところだと思います。

管理人の趣味では、汎用サブルーチンとして完成させるためには、上記のような13桁出力させずにエラー処理ブロックで指数表示させるようにプログラムを変更しようと思います。この変更は、ユーザーの趣味に合わせて実施しなくても良いかも知れません。

変更は単純で、

エラー処理ブロックに入るところの If 文を変更するだけです。

If X+K+I>17



If X+K+I>17 Or K≥13

に変更するだけです。




最後に少しだけ高速化してみます。

無駄な乗算処理を省略する
1X1061X109 など 1X10 が12回使われています。12回10の乗算が使われていて、これは無駄です。12回の乗算を省略すれば速度向上に多少寄与します。なお、速度向上には無関係で、コード入力&表記上のみの話ではありますが、1X10 の頭の 1 を全て消します(消しても正常動作します)。


論理演算を削減する
最後のブロックをよく見ると、重複したコードがあります

Else
Locate X+K-6+(I≥3),Y, X107+X104V+U
Locate X,Y,X104D+W
Locate X+K-2+(I≥3),Y,","
Locate X+K-6+(I≥3),Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd


(I≥3) が3回使われています。論理演算は 10ms 程度かかる重い処理なので、実行回数を減らすと高速化に寄与します。そこで、

X+K-6+(I≥3)→J

として変数 J を導入し、以下のように変更すると 20ms 程度は処理時間が短くなります。

Else
X+K-6+(I≥3)→J
Locate J,Y, 1X107+1x104V+U
Locate X,Y,1X104D+W
Locate J+4,Y,","
Locate J,Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd





ここまでをまとめます。


高速3桁区切り出力・汎用サブルーチン:3DS
Z=0⇒Return

Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I

X→D
If X+K+I>17 Or K≥13
Then
X+K≥17⇒17-K→D
If K≥11:Then
2→D:X<2⇒X→D
IfEnd
Locate D,Y,Z
Return:IfEnd

X103Frac(Z÷X103)→U
Int(X103Frac(Z÷X106))→V
Int(X103Frac(Z÷X109))→W
Int(Z÷X109)→D

If K≤8:Then
Locate X,Y,X108W+X104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
X+K-6+(I≥3)→J
Locate J,Y,X107+X104V+U
Locate X,Y,X104D+W
Locate J+4,Y,","
Locate J,Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd




次回は、もうひとつ機能を追加して、汎用サブルーチンとして仕上げる予定です。


つづく...

Casio Basic入門57Casio Basic入門G01 / 目次



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





keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓

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


関連記事

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

Casio Basic入門55

Casio Basic入門
<目次>

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

 2017/11/03
訂正 2017/11/04


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


前回: Casio Basic入門54 を見る


Chapter 10 - 中級

◆ Chapter 10 の目標: 3桁区切り出力 - 汎用サブルーチンの作成

大きな数が出力された時、例えば、

59265358

だと数の大きさがよく分からないのですが、

59,265,358

だと、5千9百万くらいとスグに分かります。

Casio Basic が使えるプログラム電卓には3桁区切り出力の機能がありません。そこで Casio Basic で作るプログラムで、

Locate X,Y,Z

の代わりに、

Prog "3DS"

と記述すると3桁区切り出力できるサブルーチン 3DS を作ります。3DS は少し機能追加してより一般的に使える汎用サブルーチンとして仕上げます。


前回 (Chapter 9) の後半で、sentaro様ご提案の高速出力する3桁区切りサブルーチンを取り上げ、さらっと紹介しています。これは非常によく考えられたロジックなので、今回はこのプログラムを掘り下げた上で、fx-5800P用汎用サブルーチンとして仕上げ、グラフ関数電卓用に拡張します。
  • fx-5800P用高速3桁区切りサブルーチンの詳細を紹介
  • 機能追加を必要最低限の改造で行って fx-5800P用の12桁対応・汎用サブルーチンとしてまとめる
  • グラフ関数電卓用に移植し、15桁対応に機能拡張



3桁区切り出力サブルーチンの使い方
サブルーチンのプログラム名は、短い方が入力が楽で、3-Digit Separator (3桁区切り) から 3DS としました。

Locate X,Y,Z の代わりに Prog "3DS" と書いて3桁区切りを実現します。但し Locate コマンドでは、X, Y Z の3つのパラメータを渡せますが、サブルーチン 3DS にはパラメータが渡せません。そこで、Prog "3DS" 実行の直前に、変数 X, Y, Z を設定します。

Casio Basic の特性として、メモリ内にある全てのプログラムで変数が共有され、全ての変数は "大域変数 (グローバル変数)" となっています。そこで、3DS を実行する直前に X, Y, Z に値を格納し、それを 3DS で利用します。

・変数 X は、3桁区切り出力を開始する桁、Locate X,Y,ZX と同じ
・変数 Y は、3桁区切り出力を開始する行、Locate X,Y ZY と同じ
・変数 Z は、3桁区切り出力する整数、Locate X,Y,ZZ と同じ

例えば、123456789012 を 2桁3行から3桁区切り出力するために、

  2→X:3→Y:123456789012→Z
  Prog "3DS"


と書けば、2桁3行目から 123,456,789,012 と出力します。

或いは、予め 123456789012 が変数 A に格納されていると、

  2→X:3→Y:A→Z
  Prog "3DS"


と記述すると、同じ出力になります。


使用上の注意点
3DS では、X, Y, Z に加えて、以下の変数を使っています。

Z: 3桁区切りする数値
X: 出力する桁
Y: 出力する行
-----
K: 数値の桁数
I: 区切り文字","の数
U: 最下位3桁の数値
V: 4~6桁の3桁の数値
W: 7~9桁の3桁の数値
D: 10桁目以上の数値
J: 9桁目区切り文字位置

3DS が走ると Y, Z 以外の上記の変数の値が変化します。メインルーチンでこれらの変数を使う時は、3DS で値が変わっても問題無いように使います。一番簡単な方法は、メインルーチンで上記変数名を使わないことです。

既に作ってあるプログラムに3桁区切り出力機能を追加する場合 (私自身はこのケースが多い) は、メインルーチンの中で上記と同じ変数名を別の変数名に変えるのが確実です。同じ変数名を多く使ったメインルーチンで3桁区切り出力機能を追加するときは、メインルーチンをよく調べて、変数の値を保持させたい有効範囲の外で 3DS を使う場合は、同じ変数を使っても問題ありません。

処理速度が多少遅くなりますが、殆どのプログラムで使える万能な方法もあります。配列変数 (fx-5800P) や行列 (グラフ関数電卓) を使って、3DS を使う前に上記の変数 (Y, Z 以外)とかち合うメインルーチンの変数を一旦配列変数 (行列) にコピー (待避) し、3DS 使用後に 配列変数 (行列) から元の変数へコピー (復帰) します。この方法は柔軟に使える反面、配列変数 (行列) は処理が遅いので、特に高速動作が必要なプログラムに限っては、あまり良い方法ではありません。

以上の方法をうまく組み合わせると、既存のプログラムで数値を出力するときに3桁区切りが実現できます。



前回さらっと紹介した高速版3桁区切り出力サブルーチンについて、詳細をみてゆきます。

Chapter 10-1
高速版3桁区切り出力サブルーチンの特長

高速表示版は、12行+α の簡潔なプログラムですが、幾つかの大きな特長があります。

[ロジック]
Locate コマンドの使用回数を大幅に抑えることで、高速出力を実現しています。
例えば12桁の数 123456789012 を3桁区切り出力するとします。
  1. 最初に、下から3桁づつ 012789456 を切り出し、残りの桁 123 も切り出します。
  2. 次に、1x107 + 789x104 + 012 = 17890012 を算出。3桁の数の間に 0 を挟み込んだところがミソ!
  3. さらに、123x104 + 456 = 1230456 を算出。ここでも3桁の数の間に 0  を挟み込んでいる。
  4. 2回の Locate コマンドで表示位置をずらして、これら2つの数が繋がるように出力 ⇒ 123045617890012 
  5. ここで、Locate 一回で出力するのは8桁以下なので、指数表示にならないのも重要なポイント!
  6. つなぎの 01 の位置に Locate コマンド3回で区切り文字 "," を1つづつ出力 ⇒ 123,456,789,012 となる

[特長1]Locate 使用回数を減らして高速化
区切り文字が入る位置に予め 0 や 1 で繋いで数値を出力し、あとでつなぎの 0 や 1 の位置に区切り文字を上書きすることで、Locate 使用回数を減らしています。 

[特長2]:指数表示を抑える
上の一連の処理で、実際の1回の計算で算出された数の最大のものは、1x107 (8桁) である点が重要です。Casio Basic が走るCasioの電卓では、出力する数の桁数が11桁以上になると強制的に指数表示になる仕様で、指数表示になってしまうと区切り文字の付けようがありません。Locate で出力する数は必ず10桁以下にする必要があります。

[特長3]:本来指数表示になる11桁以上の3桁区切りが可能
一回の Locate コマンドでの出力を10桁以下の数に限定し、11桁より上位の桁は、出力位置をずらして再度 Locate で繋がるように出力するロジックを採用することで、11桁以上の出力桁数に柔軟に対応できるのも特長です。 


具体的にコードを理解してゆきます。
ここで使っている関数は、Int(Frac(log(x10 です。
ここで 1x106 は "1かける10の6乗" (=1,000,000) です。

高速版3桁区切り 3DS
Z=0⇒Return Zがゼロの時は何もしないでメインルーチンに戻る

Int(log(Z))+1→K


Z に格納された数の桁数を求める (K)
(K≥4)+(K≥7)+(K≥10)→I

必要な区切り文字の数を求める (I)。論理演算式は、真なら1,偽なら0の値を持つ特性を利用し、( ) の中は0か1なので、この式で区切り文字の数が算出できる。
If X+K+I>17
Then
Locate X,Y,Z
Return:IfEnd





出力開始桁 (X) と桁数 (K) と 区切り文字数 (I) の和は出力結果の右端の桁。この和が17 を超える時は、1行から溢れて区切り文字出力が正しくできない。この場合は、単純に元の数 Z を区切り文字無しで出力する。
1X103Frac(Z÷1X103)→U
Int(1X103Frac(Z÷1X106))→V
Int(1X103Frac(Z÷1X109))→W
Int(Z÷1X109)→D


 



下位から3桁づつ切り取る。一番下位の3桁が U、次が VWと続く。D は10桁目より上位の数で3桁とは限らない (4桁以上のケースもある)。
 
 
If K≤8:Then
Locate X,Y,1X108W+1X104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","









桁数が8以下の時は、区切り文字の位置に 0 を挟んだ数を作るために 最上位2桁(W)を一旦 x108 倍する処理がある。2桁の x108 倍は10桁になるが、一気に10桁の数を Locate で出力しても指数表示にはならない。そこで 桁数が8以下の時の Locate を3回用いる軽い処理をここに記述する。
Else
Locate X+K-6+(I≥3),Y, 1X107+1X104V+U
Locate X,Y,1X104D+W
Locate X+K-2+(I≥3),Y,","
Locate X+K-6+(I≥3),Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd


 
 
 
 
 



桁数が9桁以上の場合の処理。具体的には冒頭に示した処理。
このロジックでは最大12桁対応になっている。Locate を5回用いており、依然として軽快に動作する。
 
 
 
 
 

ここまでが、前回、Chapter 9 で紹介した 高速版3桁区切り出力サブルーチンの詳細です。



汎用性のあるサブルーチンとしては、上の 3DS には少し問題があります。そこで次回は、評価用プログラムを作って、実際の動作を調べ、改善を行います。



つづく...

Casio Basic入門56 / Casio Basic入門G01 / 目次



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






keywords: fx-5800PCasioBasic、入力ボックス, プログラミング入門プログラム関数電卓

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


関連記事

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

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

やす (Krtyski)

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


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

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR