fx-5800P:Locateコマンド【桁数のコントロール】

fx-5800P に搭載されている Casio Basic には、柔軟な表示を行うための Locateコマンド が備わっています。


fx-5800PLocateコマンド

書式Locate [x座標],[y座標],[表示内容]

引数
   [x座標]:1~16の範囲の値。これ以外を指定するとエラーとなる。

   ・[y座標]:1~ 4の範囲の値。これ以外を指定するとエラーとなる。

    ※ [x座標]、[y座標] には、表示内容の最初の文字の位置を指定する。
    ※ [x座標]、[y座標] には、数値、変数、式 を使える。

   ・[表示内容]文字列、数値、変数、式 を指定できる。

戻り値:なし



今回は、Locateコマンドの位置(座標)指定に式が使える効用を紹介します。


例えば、Hit&Blow で採用した以下の表示は、Locateコマンドを使っています。

HB-YouWin 


これは、ゲーム終了時に 6回の試行で正解が得られたことを表示しています。

プログラム内で、試行回数を格納する変数をCとしているので、この表示を行うためには以下のようなプログラムを書けば良いわけです。

Locate 5,1,"YOU WIN"
Locate 3,2,"IN"
Locate 6,2,C
Locate 8,2,"TRIES"
Locate 1,3,"<AC>:QUIT"
Locate 1,4,"<0> :TRY AGAIN"


上の画面写真は、6回の試行(C=6)で正解したケースです。


さて、試行回数10回で正解した場合、つまり C=10 の場合はどのような表示になるでしょう?

  IN 10TRIES

と、10 と TRIES が繋がって表示されます。

試行回数100回で正解した場合は(実際ここまで粘る人もいないでしょうが...)、C=100 に対してどのような表示になりますか?

  IN100RIES

このように TRIES の最初の T に 100 の最後の 0 (ゼロ)が被ってしまいますね。

これは、Locate 8,2,"TRIES" で、"TRIES"の表示開始の桁が 8 と設定されているからです。

では、C=100 のように3桁の場合に、以下のように正しく表示さるには...

  IN 100 TRIES

Locate 10,2,"TRIES" とすれば良さそうです。ところが、C=6 のように1桁の場合は以下のように間延びした表示になってしまいます。

  IN 6  TRIES

6 と TRIES の間にスペースが2つ入っています。

そこで、きれいに表示するためには、C の桁数に応じて、"TRIES"の表示開始位置を正しく設定したくなります。まぁ細かいことには拘らず、プログラムの本質には関係ないから、間延びしてもOK、と言う考えもあります。でも"簡単に"細かいことを解決できればより良いですね。


ところが、数の桁数を正しく分からないと、プログラムが正しく動作せずに困ることもあります。

例を挙げます。Hit&Blow プログラム(完成版)においては、予め指定された桁数よりも、大きい桁を入力すると、桁数が違うと言うエラー表示をして、再入力を促すようにしています。

入力した数の桁数を調べて、それが予め指定された桁数と同じかどうかをチェックしているわけです。桁数を3~5桁に自由に設定できるので、桁数チェックは重要になります。正しく数の桁数をチェックしなければゲームそのものの動作に大きく影響してしまいます。「まぁいいか」と言うわけにもゆきません。



数の桁数を調べるコマンドや関数があれば、それを使えば良いですね。



実は、fx-5800P に内蔵されている Casio Basic や内蔵関数には数の桁数が一発で分かる便利なものは有りません。そこで、桁数を調べる式を作って使います。

[ 整数Nの桁数 ] = 1 + Int(log(N))
 ※但し、Nが自然数(0でない正の整数 であることが条件になります.


いきなり答えを紹介しましたが、なぜこのようになるか、分かりますか?

ここでは、log (対数関数) と Int (小数部分を切り捨てて整数部分のみを得る関数) を組み合わせて使っています。
対数は高校の数学で出てきます。

log ax = x・log a

と言うように、[何か]の[何乗]と言う形から、[何乗]の部分を取り出せるわけです。

・log 1 = log (10 の 0乗) = log 100 = 0・log 10 = 0 ⇒ これは1桁

・log 10 = log (10 の 1乗) = log 101 = 1・log 10 = 1 ⇒ これは2桁

・log 100 = log (10 の 2乗) = log 102 = 2・log 10 = 2 ⇒ これは3桁

・log 1000 = log (10 の 3乗) = log 103 = 3・log 10 = 3 ⇒ これは4桁



桁数との関連が見えてきませんか?つまり、[乗数]+1 が桁数になっています。(ここで、 [何か]の0乗は、1と言う数学の決りがあります)



この例は、10、100、1000 といったキリの良い数ですが、123 の場合は、どうなりますか?

log123 は、log100 よりは大きく、log1000 よりは小さくなります(詳しく言えば、対数は単調増加関数だからこうなるのです)。

つまり...

log 100 < log 123 < log 1000

なので...

2 < log123 < 3

つまり、Log 123 は、小数で表される数で 2.xxxx となることが分かりますね。

電卓で計算させると、 log123 = 2.089905111 ですから、2と3の間にあることが確認できます。

そして、log123 の整数部分だけを取り出すと、2 となります。
で、この 2 に 1 を足すと、123の桁数3桁になりそうです。

つまり、1 + Int( log(123) ) = 3 となります。



fx-5800P には、整数部を取り出す Int() 関数が備わっていますから、この計算式をプログラムで使えます。


N が1以上10未満なら、log N は、0.xxxx、整数部に1を足すと桁数は1 

N が10以上100未満なら、log N は、1.xxx、整数部に1を足すと桁数は2

N が100以上1000未満なら、log N は、2.xxx、整数部に1を足すと桁数は3

うまくゆきますね!


従って、正の整数 N の桁数は、1 + Int( log N) ) で正しいわけです。これで桁数を求める計算式が確認されました。



入力した数Nの桁数が、正しい桁数よりも大きいかどうかをチェックして、正しい桁数よりも大きければエラーを表示するプログラムは、以下のようになります。ここで、正しい桁数は変数Gに格納されています。

If Int(log(N))+1>G
Then
Locate 12,2,"ERROR"
Locate 6,3,"EXTRA DIGIT"
IfEnd


1 + Int(log(N))Int(log(N)) + 1 も同じことです。



最後に、「間延びしないで美しい表示」を行うためには、以下のようなプログラムを書けば良いことになります。

Locate 5,1,"YOU WIN"
Locate 3,2,"IN"
Locate 6,2,C
Locate 8+Int(log(C)),2,"TRIES"
Locate 1,3,"<AC>:QUIT"
Locate 1,4,"<0>: TRY AGAIN"

Locateコマンドは、引数に [式] を使えるので、このようなことが可能になります。




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

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PプログラミングLocateコマンドプログラム関数電卓

リンク集 | ブログ内マップ
関連記事

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

コメントの投稿

非公開コメント

指数関数のeの方が絶対に良いです

Kuさん

こんばんは、

> 因みに、eは科学定数に良さげなものがあったのですが、いちいち呼び出すのが面倒なことと、指数関数のほうがなんとなくスタイリッシュだったので(笑)、こうしました。

科学定数のeだと左に寄ってしまって、妙な間隔が空いてしまいます。
指数関数の方がきれいに収まるので、こっちの方が断然良いですよね( ^o^)ノ


有難う御座います

やす様、こんにちは。

>早速、プログラム名 KU で保存させてもらいました。これでいつでも使いたいときに、サブルーチンとして呼び出せます( ^o^)ノ

有難うございます!

>何かの時に、使わせてもらっていいですか?

どうぞどうぞ。

因みに、eは科学定数に良さげなものがあったのですが、いちいち呼び出すのが面倒なことと、指数関数のほうがなんとなくスタイリッシュだったので(笑)、こうしました。

プログラム名:KU

Kuさん

Waooo

すごい!
実際にやるのは結構大変ですね。

早速、プログラム名 KU で保存させてもらいました。これでいつでも使いたいときに、サブルーチンとして呼び出せます( ^o^)ノ

ありがとうございますm(_ _)m

何かの時に、使わせてもらっていいですか?

やってみました

やす様、こんにちは。

いきなりですが、これをrunしてみて下さい。

locate 1,1,"e^(" [shift] [ln]
locate 4,1,"ao" [function] [4] [5]
locate 5,1,"d/dX(" [function] [1] [2]
locate 6,1,"g" [function] [4] (↓) (↓) (↓) (↓) [3]
locate 7,1,"e^("
locate 2,1,"-G"
locate 8,1,"tan("
locate 9,1," " space*3

少し考えましたが、なんとか表示出来ました。

Re: 無関係な内容ですみません

Kuさん

こんばんは、

有用な情報、ありがとうございます。

実は、私もこの技使っています。

素因数分解プログラムに関して記事に書いていますが、手元では表示方法を少し変えています。

例えば 123456 の素因数分解の答えが、2^6x3x643 となります。記事に載せたプログラムでは、この答えの表示を

2
TO THE
6

3

643


と表示します。この計算の時間をより正確に測るために、一旦素因数分解の計算を終了した後、以下のような表示方法でまとめて示すように変更しています。

2^6
x3
x643

そこで、^ を表示するために、一旦 ^( を表示させた後、スペースで ( を消すようにしています。

全く同じ方法ですね。


但し、この方法を好み表示に使うことは、考えませんでした。

少なくとも log で使う l と o と g を同様の方法で使うことは出来そうです。


発想の転換ですね。今後使わせて頂きます。

無関係な内容ですみません

やす様、こんばんは。

無関係な内容ですみませんが、locateに関するちょっと面白い事を見つけました。既に知っていたらすみません。

プログラム内では小文字を表示する事は出来ません。
しかし、log,ln,sin,intなどの関数をあらかじめ表示しておき、そこにspaceを上書きすると、一文字だけ消すことができます。

locate 1,1,"log("
locate 2,1," "

こうすると、画面に"l g("と表示できます。
自由度が低いので、余り使えませんが、、、

プログラム終了に [AC]キー

Kenさん

コメントありがとうございます。

> あと、記事の最初のほうの<>が>>になってしまっています。
> 緑文字の5行目くらい。

ご指摘頂いた Typo (打ち間違い)は、早速修正致しました。


ところで、プログラムを実行する際、[FILE] キーから実行すると[AC]キーを終了に用いても問題無いこと、そして [AC]キーを終了に用いるとプログラムが楽であることから、そのようにしています。

但し、一旦メニューへ戻すのは良い考えだと思います。

メニュープログラムを作るのも面白いかも知れません。

Kenさんはご存じないかも知れませんが、Windowsの前のOSは、MS-DOSでした。私は自作のメニュープログラムを使って、起動するソフトに応じてPCの環境設定(PCの再起動が必要な場合は再起動もしました)を同時に変更するようにしていました。

横着が昂じたプログラムです( ^o^)ノ


当時は、ハードディスクなどにメニューソフトが添付されていたのですが、どれも重いし、余計な機能が付いているくせに、私が欲しい機能が付いていませんでした。当時はメモリも貴重で高価だったので、メモリ消費量も最小になるような、そんなメニュープログラムを自作して(フリーウェアで公開してました)使っていました。

ちょっと想像が付かないかも知れませんね。


> やすさんは<AC>をプログラムの終了にあてていますが、そうすると、いったんソースの編集画面になりますよね。
> 自分はおっちょこちょいで、よく間違えてソースを何文字か消してしまったりするので、メニューに戻るようにしてあります。

私もかなりのおっちょこちょいなので、ネットの友達からは「天○」と呼ばれ「天○同盟」を結成しているくらいです。


しか~し


[AC]キーで終了した時に、プログラムを消したり、おかしくしたことは一度もありません キッパリ


Kenさんは、相当な「天○」かも知れませんね(´д`)

........(-_-;) シ シツレイ


なお、プログラムモードで起動した時に[AC]で終了した後は、[EXIT]キーを連打してます。


No title

お久しぶりです。

やすさんは<AC>をプログラムの終了にあてていますが、そうすると、いったんソースの編集画面になりますよね。
自分はおっちょこちょいで、よく間違えてソースを何文字か消してしまったりするので、メニューに戻るようにしてあります。

あと、記事の最初のほうの<>が>>になってしまっています。
緑文字の5行目くらい。
最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

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


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

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

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR