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?


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

 12
 B?
 45
 C?


と表示されます。最後に 789 と入力すると、C789 が格納され、さらに 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=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入門 -目次-

Casio Basic入門

新しい記事の公開に合わせて随時追記・修正します
最終: 2017/11/10


目 次

        - 1.はじめに: [1]

        - 2.プログラミングとは: [1]  

        - 3.fx-5800PのCasio Basicコマンド一覧: [2] 

        - 4.Casio Basicを使ってみる
            - Chapter 0 - プログラム作成・実行のポイント: [2] 
            - Chapter 1 - Getkey と Locate を使いこなす: [3] [4] [5] [6] [7] [8] 
            - Chapter 2 - 動きのあるプログラムを作る: [9] [10][11][12][13][14] 
            - Chapter 3 - 自由自在に入力する(入力ボックス): [15][16][17][18] 
            - Chapter 4 - 換算プログラムを作る: [19][20][21][22] 
            - Chapter 5 - サブルーチンを使いこなす: [23] [24] [25] [26] [27] [28] [29] [30] [31] 
            - Chapter 6 - プログラムを速くする(入力ボックス) [32] [33] [34] [35] [36] [37]  
            - Chapter 7 - 超入門 - ゼロからのプログラム作成と機能追加: [38] [39] [40] [41] [42]
            - Chapter 8 - Basic 命令を活用してみる: [43] [44] [45] [46] [47] [48] [49] [50]
            - Chapter 9 - 簡単な換算プログラム - 入力ボックスの活用: [51] [52] [53] [54] 
            - Chapter 10 - 3桁区切り出力 - 汎用サブルーチンの作成: [55] [56] [57] [58] [59] [60]  
            - Chapter 11 - 


        - 5.Casio Basicでグラフィックス / 目次
            - Chapter G01 - LCDと3つの座標系: [G01] 
            - Chapter G02 - グラフィックス画面の設定と描画: [G02] 
            - Chapter G03 - ClrGraphViewWindow[G03] 
            - Chapter G04 - Plot コマンド: [G04] 
            - Chapter G05 - Plot と ViewWindow: [G05] 
            - Chapter G06 - F-Line と線のスタイル設定: [G06] 
            - Chapter G07 - 点線とViewWindow: [G07]
            - Chapter G08 - ViewWindow の有効活用 / RclPict と RclCapt の違い: [G08] 
            - Chapter G09 - ViewWindow と設定変数: [G09] 
            - Chapter G10 - Circle コマンド: [G10] 
            - Chapter G11 - PxlOn コマンド: [G11]
            - Chapter G12 - PxlOff コマンド: [G12]
            - Chapter G13 - PxlChgコマンド: [G13] 
            - Chapter G14 - PxlTest( ) コマンド: [G14] 

            - Chapter G15 - 
            - Chapter G16 - 
            - Chapter G17 -
            - Chapter G18 -

詳細な目次へ



Casio Basic入門の概要

CasioBasic入門では、最初から順に読むことを前提に書き始めました。最初は基本的な部分から丁寧な説明を心がけていますが、進むにつれて同じ説明を省略するようになります。Casio Basicの命令やコマンドの使い方だけでなく、プログラミングの考え方、手法、知っておくと役立つ話題なども、折に触れ紹介しています。

当初、fx-5800P 使用を前提にして始めていますが、「4. Casio Basic を使ってみる」 で取り上げているプログラムは、簡単な変更で fx-9860GII や fx-CG50 への移植も可能です。具体的に fx-9860GII や fx-CG50 などへの移植を取り上げた記事もあります。

fx-CG20 / CG50 については、fx-9860GII の Casio Basic プログラムからの移植性が非常に高く、物理座標系で動くグラフィックスコマンド(TextPxlOnPxlOffPxlChgPxlTest) を使っていないプログラムは、fx-CG20 / CG50 に転送するだけで、ほぼ正常動作します。

Casio Basic - 機種別の互換性

fx-9860GII への移植 - 厄介な旧来の命令


「5. Casio Basic でグラフィックス」 は、グラフィックス機能を持たない fx-5800P ではなく、fx-9860GII を前提にしています。fx-CG20 / fx-CG50 は、カラー対応の部分を除き、fx-9860GII から比較的楽に移植できます。fx-9860GII と fx-CG50 で互換性のないコマンドの紹介を順次追加する予定です。


Casio Basic入門の読み方

PCなどでの構造化Basic や他の構造化高級言語でのプログラミング経験者には、最初から順に読み進めて頂ければ、Casio Basic が構造化プログラミング可能で、意外に使えることに気付かれると思います。

昔の古い電卓やポケコンでの行番号付きのBASICでのプログラミング経験しか無い方、およびプログラミング未経験者の方は、以下の順序で読み進めると良いと思います。

構造化高級言語によるプログラミング経験の少ない方、プログラミング初心者向けの進め方

2. プログラミングとは
   
4. Casio Basicを使ってみる [fx-5800P 向け。fx-9860GII や fx-CG20 / CG50 にも移植可能]
   
 ・Chapter 0 (プログラム作成・実行のポイント)
   
 ・Chapter 7 (超入門:ゼロからのプログラム作成と機能追加) ※1
   
 ・Chapter 8 (Basic コマンドを使ってみる) ※2
   
 ・Chapter 1 (Getkey と Locate コマンドを使いこなす)
   
 ・Chapter 2 (動きのあるプログラムを作る)
   
 ・Chapter 3 ~ Chapter 6 / Chapter 9 ~
   
5. Casio Basic でグラフィックス [fx-9860GII 他、グラフ関数電卓向け]

※1 fx-5800P プログラミング(超)入門
Chapter 7 (超入門:ゼロからのプログラム作成と機能追加) は、fx-5800P を始めて使うプログラミング未経験者を想定したものです。Chapter 8 へ繋がります。 ⇒ Chapter 7

※2 新世代 Casio Basic への導入
Chapter 8 は、カシオのプログラム電卓で古くから使われてきた命令から、新世代 Casio Basic への導入を目的にしています。古いプログラム電卓を使いこなしているが、新しい Casio Basic にはなじみの無い方向けです。 ⇒ Chapter 8

※3 PCなどでの高級言語プログラミングの経験者には...
管理人自身がこのカテゴリーに入ります。高級言語、特に構造化Basicでのプログラミング経験者は、当ブログで公開している Hit & Blow ( ここここ や ここ )、もぐら叩き (ここ) を見て、実際に fx-5800P で実行して頂ければ、Casio Basic の能力が分かると思います。さらに、改造や改善してみると Casio Basic がさらに分かると思います。

記事中で、Casio Basic コマンドリファレンスの個別項目へのリンクも入れています。このコマンドリファレンスは、管理人オリジナルのもので、取扱説明書に書かれていない多くの情報を提供しています。


新世代 Casio Basicについて

2006年発売の fx-5800P に搭載されたプログラミング言語は、カシオ自身が Basic-Like プログラミング言語と言っています。機能やコマンドが限定されているので、厳密にはその通りです。しかし実際に使ってみると、使えるコマンドに着目すれば、構造化プログラミングができる Basic であり、実用的な電卓プログラムが作れることに気がつきました。構造化プログラミングには諸説ありますが、当ブログでは Knuthが提案した「ブロック構造による分かりやすいプログラムを作ること」 が構造化プログラミングだ、との立場です。例外処理やエラー処理のために Goto で処理を一カ所に集中させるのは、プログラムが分かりやすくなるので良いものとして考え、それ以外は極力 Goto なしでプログラムを書くという考え方です。実際に多くの高級言語では、例外処理には内部的に Goto と同様に特定アドレスへの強制ジャンプをしています。

ここでは、カシオ製 プログラム関数電卓とグラフ関数電卓をひとくくりにして、プログラム電卓と呼ぶことにします。2006年に 発売された fx-5800P 以降のプログラム電卓に搭載されている Casio Basic は、構造化プログラミングが可能である点で、それ以前のものとは大きく異なります。

そこで、fx-5800P 以降の機種に搭載されている新しい Casio Basic を 当ブログでは、新世代 Casio Basic と呼んでいます。これらに共有しているのは、構造化プログラミングが可能で、テンキーだけでなく全てのキー([AC]キー除く)押下の検出が可能な Getkey コマンド、そして柔軟な Locate コマンドを搭載し、条件判定を 0で偽、0以外を真 (論理演算は 1 で真) となることです。これは一般的な高級言語と同じです。なお、プログラム関数電卓として販売されている fx-71F や fx-72F に搭載されている言語は、ここでいう新世代 Casio Basic ではありません。

<新世代Casio Basic搭載機>
  - fx-5800P
  - fx-9860G (OS ver 2.以降推奨)
  - fx-9860GII (OS ver 2 以降推奨)
  - fx-CG10
  - fx-CG20
  - fx-FD10 Pro
  - fx-CG50
  ※ OS は最新バージョンへアップグレードできます

初級・中級の表記について
  初級 - Casio Basic の命令/コマンドの使い方を覚えるレベル
  中級 - プログラムの構造やロジック、変数の使い方を工夫するレベル
  中級者で十分使いこなせるので、上級と言う表記はありません

Casio Basic でのグラフィックス プログラミングを取り上げています。先ずは グラフィックスコマンドを徹底的に調べている段階なので、別系統で連載します。これまでの「Casio Basicを使ってみる」の連載は、継続予定です。
 ⇒ Casio Basicでグラフィックス


詳細な目次

1. はじめに
      ⇒ Casio Basic入門1

2. プログラミングとは
      ⇒ Casio Basic入門1

3. fx-5800P CasioBasicのコマンド一覧
      ⇒ Casio Basic入門2

4. CasioBasicを使ってみる
[fx-5800P 向け] (fx-9860GII、fx-CG20、fx-CG50にも移植可)

Chapter 0

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

      - プログラム新規作成
      - プログラム編集
      - プログラム実行
      - →命令 (代入命令)
      - ?命令 (入力命令)
      - 命令 (出力命令)

      ⇒ Casio Basic入門2

Chapter 1 - 初級
Getkey と Locate コマンドを使いこなす
キーコード取得プログラム - GET KEYCODE を作る 

      - Locate
      - Getkey
      - Doループ
      - Whileループ
      - Isz命令 (インクリメント・ジャンプ命令)
      - " " 出力命令
      - EngOn / EngOff
      - If 文
      - ⇒命令 (条件ジャンプ命令)


      ⇒ Casio Basic入門3
             - Chapter 1-1: Getkey、Locate
             - Chapter 1-2: Goto / Lbl ループ、EngモードとLocate

      Casio Basic入門4
             - Chapter 1-3: 繰り返し処理 Doループ

     Casio Basic入門5
             - Chapter 1-4: Locateコマンドと出力命令" "の違い
             - 
Chapter 1-5: 思い込みの罠 - Locateの表示桁数
             - Chapter 1-6: プログラム完成
             - Chapter 1-7: 思い込みの罠(補足) - 1桁のキーコード

      ⇒ Casio Basic入門6
             - Chapter 1-8: DoループとWhileループ再び

      Casio Basic入門7
             - Chapter 1-9: Locateコマンドで陥るバグ
             - Chapter 1-10: 利用価値の高い⇒命令(条件ジャンプ)を使ってみる

      ⇒ Casio Basic入門8
             - Chapter 1-11: ダイナミックな表示機能の実装
             - Chapter 1-12: プログラムのバックアップ


Chapter 2 - 初級
動きのあるプログラムを作る
反射ゲーム - REACT を作る

      - Lbl / Goto ループ
      - Dsz命令 (ディクリメント・ジャンプ命令)
      - Int( ) / Frac( ) 関数
      - Break コマンド
      - 例外処理 / 例外フラグ
      - 複数条件分岐 - Else If
      - ブロック構造 (構造化プログラミングの勧め)
      - アルファベット小文字の表示
      - For~To~Next
      - Progコマンド(サブルーチン)

      ⇒ Casio Basic入門9
             - Chapter 2-0: Lbl / Gotoループを使う
             - Chapter 2-1: 回る羽根を作る

      ⇒ Casio Basic入門10
             - Chapter 2-2: ランダム関数を使う
             - Chapter 2-3: 再びGetkeyとDoループでカウンタ計測
             - Chapter 2-4: 例外処理・例外フラグ・Breakコマンド

      ⇒ Casio Basic入門11
             - Chapter 2-5: プログラム制御
             - Chapter 2-6: 複数条件分岐の記法

      ⇒ Casio Basic入門12
             - Chapter 2-7: ゲーム終了条件の実装

      ⇒ Casio Basic入門13
             - Chapter 2-8: ゲーム進行に変化を付ける
             - Chapter 2-9: ゲームの仕上げ - 構造化プログラミング

      ⇒ Casip Basic入門14
              - Chapter 2-10: For文とProgコマンドを使ってみる


Chapter 3 - 中級
自由自在に入力する
入力ボックス - INPI を作る

      - 配列変数
      - 論理演算コマンド
      - For~To~Next
      - Progコマンド(サブルーチン)
      - サブルーチンの使い方
      - アルファベット小文字の表示
      - デバッグ方法
      - ド・モルガンの法則
      - 変数の使い方 - 予約変数と使捨て変数
      - 変数の適用範囲

      ⇒ Casio Basic入門15
             - Chapter 3-0: 動作確認用メインルーチンを作る

      ⇒ Casio Basic入門16
             - Chapter 3-0(続き): 「入力ボックス」を作る - 論理演算をする

      ⇒ Casio Basic入門17
             - Chapter 3-1: 「入力ボックス」プログラムの改造

      ⇒ Casio Basic入門18
             - Chapter 3-2: 入力ボックス - 末尾文字の削除機能を追加する
                デバッグ方法、ド・モルガンの法則、変数の適用範囲を理解する


Chapter 4 - 中級
換算プログラムを作る
和暦・西暦変換プログラム - YEAR CONV を作る

      - Progコマンド (サブルーチン)
      - サブルーチンの使い方
      - 変数の使い方 - 予約変数と使い捨て変数

      ⇒ Casio Basic入門19
             - Chapter 4-0: 和暦・西暦換算プログラム - 完成状態の紹介
             - Chapter 4-1: 最初にプログラム構造を考える
             - Chapter 4-2: 和暦・西暦換算プログラムを実装する

      ⇒ Casio Basic入門20
             - Chapter 4-3: オマケ機能の追加 - 数の桁数の求め方

      ⇒ Casio Basic入門21
             - Chapter 4-4: キー長押しによるメニュー選択

      ⇒ Casio Basic入門22
             - Chapter 4-5: キー長押しの処理を作る
             - Chapter 4-6: サブルーチンを使いこなす


Chapter 5 - 中級
サブルーチンを使いこなす

世界時間換算プログラム - TIME ZONE を作る

      - 入力ボックスを使う
      - サブルーチンを活用した効率的な機能追加
      - 変数の使い方 - 予約変数と使捨て変数
      - キー長押しの活用
      - 矢印キーによる循環項目選択

      ⇒ Casio Basic入門23
            - Chapter 5-0: プログラムの仕様
            - Chapter 5-1: TIME ZONE プッログラムの完成形

      ⇒ Casio Basic入門24
            - Chapter 5-2 Getkey、入力ボックス、Locate の活用

      ⇒ Casio Basic入門25
            - Chapter 5-3: 同様の機能を追加する

      ⇒ Casio basic入門26
            - Chapter 5-4: 少し異なるルーチンを、分かりやすく追加する

      ⇒ Casio Basic入門27
            - Chapter 5-5: 少し異なるルーチンを、分かりやすく追加する(2)

      ⇒ Casio Basic入門28
            - Chapter 5-6: キー長押しによる機能呼び出し

      ⇒ Casio Basic入門29
            - Chapter 5-7: 矢印キーの活用

      ⇒ Casio Basic入門30
     - Chapter 5-8: 類似処理による機能追加

      ⇒ Casio Basic入門31
     - Chapter 5-9 キー長押しによる別機能の呼び出し


Chapter 6 - 中級
プログラムを速くする
入力ボックスの高速化と拡張 - 入力ボックス 2.0 を作る

      - 処理速度の遅いコマンド/命令を見極める
      - プログラムロジックの見直し

      ⇒ Casio Basic入門32
     - Chapter 6-0: コマンドや命令の処理速度を比較する
     - Chapter 6-1: 具体的に対処する遅い処理を見つける

      ⇒ Casio Basic入門33
     - Chapter 6-2: ロジックの見直しでプログラムを高速化する

  ⇒ Casio Basic入門34
     - Chapter 6-3: 処理速度を意識して機能拡張する

  ⇒ Casio Basic入門35
     - Chapter 6-4: 処理速度を意識して機能拡張する

  ⇒ Casio Basic入門36
     - Chapter 6-5: キーリピートを抑制する

  ⇒ Casio Basic入門37
     - Chapter 6-6: fx-5800P から fx-9860GII へ移植する


Chapter 7 - 超初級
ゼロからのプログラム作成と機能追加
温度換算プログラム- TEMP CONV を作る

      - 初めての fx-5800P プログラミング
      - プログラム作成の手順
      - プログラムの実行方法
      - ?(入力)命令

  ⇒ Casio Basic入門38
     - Chapter 7-1: 最もシンプルなプログラム

  ⇒ Casio Basic入門39
     - Chapter 7-2: 同様の機能を追加する

  ⇒ Casio Basic入門40
     - Chapter 7-3: 選択肢3つの換算プログラムに拡張する

  ⇒ Casio Basic入門41
     - Chapter 7-4: バグの原因と対処 - フラグの利用

  ⇒ Casio Basic入門42    
     - Chapter 7-5: プログラムの効率化


Chapter 8 - 初級
Basic 命令を使ってみる
温度換算プログラム - TEMP CONV を作る

   - ?(入力)命令を Baisc コマンでに置き換える
     ・ Getkey と Do ループ の使い方
     ・ 入力ボックスの使い方
   - ⇒(条件分岐)命令のメリット
   - キー入力制御
     ・ Getkey と While ループの使い方

  ⇒ Casio Basic入門43
     - Chapter 8-1: メニュー選択に Getkey を使う

  ⇒ Casio Basic入門44
     - Chapter 8-2: 入力ボックスを使ってみる

  ⇒ Casio Basic入門45
     - Chapter 8-3: 換算プログラムの入力ボックスを実装する

  ⇒ Casio Basic入門46
     - Chapter 8-4: テンキー以外のキー入力を利用する

  ⇒ Casio Basic入門47
     - Chapter 8-5: [EXIT] キーで正常終了させる

  ⇒ Casio Basic入門48
     - Chapter 8-6: グラフ関数電卓用入力ボックスを準備する

  ⇒ Casio Basic入門49
     - Chapter 8-7: グラフ関数電卓へプログラムを移植する

  ⇒ Casio Basic入門50
     - Chapter 8-8: グラフ関数電卓用に表示を最適化する


Chapter 9 - 初級
簡単な換算プログラム - 入力ボックスの活用
福利計算プログラム - CompInt を作る

   - Getkey と Do ループ の使い方
   - 入力ボックスの使い方
   - 数値の3桁区切り表示をサブルーチンで実装
   - 3桁区切りのロジックを改善(高速化)

  ⇒ Casio Basic入門51
     - Chapter 9-1: fx-5800P で複利計算プログラムを作る

  ⇒ Casio Basic入門52
     - Chapter 9-2: fx-5800P で3桁区切り表示をする

  ⇒ Casio Basic入門53
     - Chapter 9-3: fx-5800P での3桁区切り表示を高速化する

  ⇒ Casio Basic入門54
     - Chapter 9-4: fx-5800P での3桁区切り表示を改良する


Chapter 10 - 中級
3桁区切り出力 - 汎用サブルーチンの活用
簡単な計算プログラム - Calc を作る

   - 数値の3桁区切り出力を汎用サブルーチン化
   - 旧来の出力命令 " " 、出力命令 の癖
   - 大域変数の使いこなし

  ⇒ Casio Basic入門55
     - Chapter 10-1: 高速3桁区切り出力サブルーチンの特長

  ⇒ Casio Basic入門56
     - Chapter 10-2: 高速3桁区切り出力サブルーチンの評価と改善

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

  ⇒ Casio Basic入門58
     - Chapter 10-4: 3桁区切りサブルーチン fx-5800P版の使いこなし

  ⇒ Casio Basic入門59
     - Chapter 10-5: 3桁区切りサブルーチン グラフ関数電卓版


5. Casio Basicでグラフィックス [fx-9860G (OS2.04) 向け]

Casio Basicでグラフィックス
グラフィックスコマンドの仕様や特徴

  ⇒ Casio Basic入門G01
     - Chapter G01: LCDと3つの座標系

  ⇒ Casio Basic入門G02
     - Chapter G02:  グラフィックス画面の設定と描画

  ⇒ Casio Basic入門G03
     - Chapter G03: ClrGraphViewWindow

  ⇒ Casio Basic入門G04
     - Chapter G04: Plot コマンド

  ⇒ Casio Basic入門G05
     - Chapter G05: PlotViwWindow

  ⇒ Casio Basic入門G06
     - Chapter G06: F-Line と 線のスタイル設定

  ⇒ Casio Basic入門G07
     - Chapter G07: 点線と ViewWindow

  ⇒ Casio Basic入門G08
     - Chapter G08: ViewWindow (直交座標系) の有効活用 / RclPictRclCapt の違い

  ⇒ Casio Basic入門G09
     - Chapter G09: ViewWindow と設定変数

  ⇒ Casio Basic入門G10
     - Chapter G10: Circle コマンド

  ⇒ Casio Basic入門G11
     - Chapter G11: PxlOn コマンド

  ⇒ Casio Basic入門G12
     - Chapter G12: PxlOff コマンド

  ⇒ Casio Basic入門G13
     - Chapter G13: PxlChg コマンド

  ⇒ Casio Basic入門G14
     - Chapter G14: PxlTest() コマンド

  ⇒ Casio Basic入門G15
     - Chapter G15: 



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







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

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

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

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回増え約 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 



つづく...

⇒ 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つの評価が正しく実行されます。

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

D→X
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回1の乗算が使われていて、これは無駄です。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 が走るとこれらの変数の値が変化します。メインルーチンでこれらの変数を使う時は、3DS で値が変わっても問題無いように使います。一番簡単な方法は、メインルーチンで上記変数名を使わないことです。

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

処理速度が遅くなるが万能な方法もあります。配列変数 (fx-5800P) や行列 (グラフ関数電卓) を使って、3DS を使う前にかち合う変数を配列変数 (行列) にコピー (待避) し、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≤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桁を一旦 x108 倍する処理がある。2桁の x108 倍は10桁になるが、K≤8 (9桁以下) の時は、一気に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


 
 
 
 
 



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

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



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



つづく...

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




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








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

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


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

Casio Basic入門54

Casio Basic入門
<目次>

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

修正 2016/07/18
追記: 2017/07/02
追記・修正: 2017/10/27

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

Chapter 9 - 初級

前回: Casio Basic入門53 を見る


◆ Chapter 9 の目標: 簡単な換算プログラム - 入力ボックスの活用


Chapter 9-4 
fx-5800P での3桁区切り表示を改良する

前々回(Casio Basic入門52 - Chapter 9-2)で作ったものは、3桁区切りがパラパラと表示されます。
前回(Casio Basic入門53 - Chapter 9-3)で改良したものは、3桁区切り表示が高速化しました。

ところが、いずれも表示する桁数が1行以内に収まらない時はエラーが発生します。これを一旦はそのままにしていたのですが、ここでエラーが出ないように手を入れてから、fx-9860GII へ移植することにします。

fx-5800P用パラパラ表示版

・サブルーチン: 3DIGIT
・メインルーチン: COMPINT2

ファイル名: 3DIGIT

Z=0⇒Retuen
Int(log(Z))+1→D
D-3Int(D÷3)→F

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next



ファイル名: COMPINT2
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"



fx-5800P用高速表示版

・サブルーチン: 3DIGIT2
・メインルーチン: COMPINT3

ファイル名: 3DIGIT2

Z=0⇒Return
Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I

1x103Frac(Z÷1
x103)→U
Int(1x103Frac(Z÷1x106))→V
Int(1x103Frac(Z÷1x109))→W
Int(Z÷1x109)→D

If K≤8:Than
Locate X,Y,1x108W+1x104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
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



変数の説明
入力値: Z
X座標: X
Y座標: Y


ワーク変数 U:下3桁
ワーク変数 V:中3桁
ワーク変数 W:上3桁
ワーク変数 D:最上位1桁
ワーク変数 K:数値の桁数
ワーク変数 I:三桁区切り文字の数


ファイル名: COMPINT3
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT2"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT2"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT2"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"





1行の桁数を超えた表示の際のエラーを抑制

このエラーは、3桁区切りを行うと ,(コンマ)が追加されるから発生します。そこで、3桁区切りの桁数を調べ、それが1行の桁数を超える時は、3桁区切り無しで表示させるようにします。

元の桁数と3桁区切り表示の桁数は以下のようになります。

表1 桁数の一覧
元の数値例元の桁数3桁区切り表示コンマの数3桁区切り表示の桁数
11101
1221202
123312303
123441,23415
12345512,34516
1234566123,45617
123456771,234,56729
12345678812,345,678210
1234567899123,456,789211
1234567890101,234,567,890313
123456789011112,345,678,901314
12345678901212123,456,789,012315
1234567890123131,234,567,890,123417
123456789012341412,345,678,901,234418

これを見れば、

[3桁区切り表示の桁数] = [元の桁数] + [コンマの数]

だと分かります。

元の数値は、変数Z に格納してから、サブルーチン 3DIGIT3DIGIT2 が起動されるので、このサブルーチンの中で、

3DIGIT
Int(log(Z))+1→D [元の桁数]


3DIGIT2
Int(logZ))+1→K [元の桁数]

のように、求められています。

=====

次に、[コンマの数] を求めると、[3桁区切り表示の桁数] を計算できます。

上の表1を見ると、[元の桁数] を3で割った時の商 が [コンマの数] になることが分かります。

[コンマの数] = Int([元の数] ÷ 3) 

従って、

[3桁区切り表示の桁数] = [元の数] + Int([元の数] ÷ 3])

となります。


あるいは、もう一つ [コンマの数] を求める面白い方法があります。これは、既に sentaro様が提案された 3DIGIT2 で使われています。

Int(log(Z))+1→K [K: 元の桁数]
(K≥4)+(K≥7)+(K≥10)→I 
[I: コンマの数]


[2017/07/02 追記]
2行目が何故コンマの数を示すのか、説明を加えます。
最初の (K≥4) をみてみます。Kが4以上の時 K≥4 の値が 1 になる性質を利用しています。
詳しく見てゆきます。 は論理演算を行い、K≥4 が正しければ(つまり真ならば)1を返します。正しくなければ(偽ならば)0を返します。これは Casio Basic を含む多くの高級言語で採用されている仕様です。
(K≥4) 自体が値を持つわけです。
Kが5ならば、(K≥4)(K≥7)(K≥10)0 になるので、I1 となり、コンマの数になります。
Kが8ならば、(K≥4)(K≥7)1 になり、(K≥10)0 になるので、I2 となり、コンマお数になります。
=== 追記おわり ===

従って、

[3桁区切り表示の桁数] = [元の数] + I

となります。

=====

3桁区切り表示を始める桁は、変数 X に入れた直後にサブルーチン 3DIGIT あるいは 3DIGIT2 が呼び出されるので、このサブルーチンが起動した時、変数 X が表示を始める桁数になっています。

すると、3桁区切り表示を行う行に [表示される全ての桁数] は、

[表示される全ての桁数] = X + [3桁区切り表示の桁数] - 1

となります。

fx-5800P では、Locate コマンドで [表示される全ての桁数] は16桁で、これを超えるとエラーになります。このエラーが発生する条件は、

[表示される全ての桁数] > 16

つまり、

X + [3桁区切り表示の桁数] - 1 > 16

この式を整理すると、

X + [3桁区切り表示の桁数] > 17

となります。

====

この条件を満たすとき、どうするかを決めます。

1) 何もしないで、サブルーチンを終了させる

2) エラーにならない換わりに、例えば -------- を表示をする

3) 3桁区切り表示ではなくて、元の数を表示する

といった処理を行えば良いですね。

今回は、「3) 3桁区切り表示ではなくて、元の数を表示する」 を採用することにします。

====

以上をまとめると、

If X+[3桁区切りの桁数]>17
Then
Locate X,Y,Z
Retuen
IfEnd


とすれば、表示が1桁に収まらない時のエラーを回避でき、3桁区切り無しで見づらいが数値が表示されます。

具体的に、3DIGIT3DIGIT2 に追加するプログラムコードは以下のようになります。

3DIGITへの追加分
Int(log(Z))+1→D [既にあるコード]

If X+D+Int(D÷3)>17
Then
Locate X,Y,Z
Return
IfEnd



3DIGIT2への追加分
Int(log(Z))+1→K [既にあるコード]
(L≥4)+(L≥7)+(L≥10)→I [既にあるコード]

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




fx-5800P用パラパラ表示版

・サブルーチン: 3DIGIT
・メインルーチン: COMPINT2

ファイル名: 3DIGIT

Z=0⇒Retuen
Int(log(Z))+1→D
D-3Int(D÷3)→F
If X+D+Int(D÷3)>17
Then
Locate X,Y,Z
Return
IfEnd


For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next



ファイル名: COMPINT2 (変更なし)
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"




fx-5800P用高速表示版

・サブルーチン: 3DIGIT2
・メインルーチン: COMPINT3

ファイル名: 3DIGIT2

Z=0⇒Return
Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I

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


Frac(Z÷1x103)×1x103→U
Int(Frac(Z÷1x106)×1x103)→V
Int(Frac(Z÷1x109)×1x103)→W
Int(Z÷1x109)→D

If K≤8:Than
Locate X,Y,1x108×W+1x104V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
Locate X+K-6+(I≥3),Y,1x107+1x104V+W
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



ファイル名: COMPINT3 (変更なし)
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Locate X,Y,"      " (スペース11個)
Prog "3DIGIT2"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT2"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT2"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"




fx-5800P 用の2つのバージョン、パラパラ表示版と高速表示版を並行して作りました。

[2017/10/27 追記・修正]
今回の高速表示版は優れているので、次回で詳細を検討し、さらに高速化や機能追加を行って、汎用サブルーチンとして仕上げようと思います。

[2017/11/04 追記]
高速3桁区切り出力・汎用サブルーチン:3DS を 3DIGIT2 の変わりに使えます。
fx-5800P版3DS 





つづく...

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




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








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

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




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

Casio Basic入門53

Casio Basic入門
<目次>

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

追記修正 2017/10/25


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

Chapter 9 - 初級

前回: Casio Basic入門52 を見る


◆ Chapter 9 の目標: 簡単な換算プログラム - 入力ボックスの活用


Chapter 9-3 
fx-5800P での3桁区切り表示を高速化する

前回作った3桁区切りできる複利計算プログラムを再掲します。

・サブルーチン: 3DIGIT
・メインルーチン: COMPINT2

ファイル名: 3DIGIT

Z=0⇒Retuen
Int(log(Z))+1→D
D-3Int(D÷3)→F

For 1→I To D
Int(Z÷10^(D-I))→C
Locate X+I-1,Y,C
Z-C10^(D-I)→Z
If I-3Int(I÷3)=F
Then Isz X
I<D⇒Locate X+I-1,Y,","
IfEnd
Next



ファイル名: COMPINT2
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT"

IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"





前回のプログラムと高速化の試み

以下のように、3桁区切りで表示ができましたが、

8digit_input 

左から右へ、パラパラと表示されて時間がかかります。

今回のプログラムで一番動作時間がかかるのは、Locate コマンドです。そして、For ループで Locate が何度も実行されているので、表示に時間がかかると考えています。このプログラムでは、例えば 12345678 を表示するには Locate を10回実行しています。

そこで、表示を高速化するには、Locate が実行される回数を減らせば良いことになります。

私が最初に考えたのは、例えば 1234567812,345,678 として表示するために Locate を使って、

1) 12 を表示
2) ,(コンマ)を表示
3) 345 を表示
4) ,(コンマ)を表示
5) 678 を表示


つまり、Locate 実行の回数が10回から5回へ半減しますので、良さそうです。実際に作ってみると、問題がありました。

それは、例えば 139096 を3桁区切りにすると 139,096 となるべきところ、そうはならないバグです。文字列を使えない fx-5800P で数値を出力する時に避けられない問題でした [2017/11/06 校正]

上の考え方だと

1) 139 を表示⇒問題なし
2) ,(コンマ)を表示⇒問題なし
3) 096 を表示⇒
問題発生


Locate コマンドで 数値 096 を表示すると 96 になってしまいます。
つまり、3桁区切りの表示が 139,96 と妙なことになります。

fx-5800P Casio Basic では文字列を扱うコマンドが無いので、096 を一旦文字列に変換して Locate で表示することができません。
ただし、この問題は簡単に解決できます。096 は、3桁でなくて2桁なので、3桁未満の時は文字 "0" を先に表示してから3桁未満の数値を表示すれば良いだけです。

あるいは、先に文字列 "000" を表示した上に 必要な桁から2桁か2桁の数値を上書きする方法もあります。 
過去の Casio Basic 入門でも、この方法は使っています。

但しこれらの方法では、ある所定の数値の場合に Locate の実行回数を減らすことができずい、本質的な解決策とはならない中途半端な方法だと考えました。

そんなわけで、表示に時間がかかるものの、ロジックとしては素直でコンパクトな前回のプログラムを紹介したわけです。




3桁表示の高速化

sentaro 様から面白いロジックをご提案頂き、それを紹介したいと思います。これは、3桁区切りをチョット巧妙に実現するものです。そのロジックやプログラムの実装方法は初級というよりも中級に入るかも知れません。

例えば 12345678 を表示する前に、コンマが入るところに 0 を入れた数値を作って、

1203450678

として、一旦この数値を Locate で表示します。

次に、コンマが入るところの 0,(コンマ)で上書きして(Locate コマンド使用)、

12,345,678

とすれば良い...といった考え方です。私には思いつかなかった面白いものです。

この8桁の数値を3桁区切り表示する時の Locate 実行回数は3回になって、激減します(前回のプログラムだと10回実行)。

このロジックだと、上で問題が発生した 139096 の場合は、一旦 1390096 に変換して、この数値を Locate で表示。続いてコンマが入るべき 0 の位置に Locate, (コンマ)を上書きするので、

139,096

と正しく表示されます。

なかなかよく考えられたロジックですね。

前回作ったプログラムでは、Locate を7回実行するところ、2回で済むので、表示が大いに高速化されます。




新ロジックの実装

そこで、3桁区切り表示を行うサブルーチン 3DIGIT3DIGIT2 とします。
メインルーチンは、COMPINT2COMPINT3 にします。


プログラムを以下に示します。

・サブルーチン: 3DIGIT2
・メインルーチン: COMPINT3

ファイル名: 3DIGIT2

Z=0⇒Retuen
Int(log(Z))+1→K
(K≥4)+(K≥7)+(K≥10)→I
Frac(Z÷1
x103)×1x103→U
Int(Frac(Z÷1x106)×1x103)→V
Int(Frac(Z÷1x109)×1x103)→W
Int(Z÷1x109)→D

If K≤8:Than
Locate X,Y,1x108×W+1x104×V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
Locate X+K-6+(I≥3),Y,1x107+1x104×V+W
Locate X,Y,1x104×D+W
Locate X+K-2+(I≥3),Y,","
Locate X+K-6+(I≥3),Y,","
I≥3⇒Locate X+K-9,Y,","
IfEnd



変数の説明
入力値: Z
X座標: X
Y座標: Y


ワーク変数 U:下3桁
ワーク変数 V:中3桁
ワーク変数 W:上3桁
ワーク変数 D:最上位1桁
ワーク変数 K数値の桁数
ワーク変数 I:三桁区切り文字の数


ここで、解説を2つだけ...


青文字の( ) の部分

この ( ) は、0か1かの値になります。( ) の中が正しいなら(真ならば)1、正しくなければ(偽ならば)0になります。この性質をうまく使って計算式に中で利用しています。


赤文字 x104 の表記

これは [x10x] キーを押して入力します。


メインルーチンは、呼び出すサブルーチン名を変更するだけ...

ファイル名: COMPINT3
Locate 1,1,"1-C:"
Locate 1,2,"2-R:"
Locate 10,2,"3-Y:"
Locate 1,3,"TOTAL"
Locate 1,4,"MONTH"


0→B:0→R:0→N:0→T:0→M

Do

0→K:Do
Getkey→K
LpWhile K=0
K=73⇒Break

If K=35
Then
5→X:1→Y:8→D:1→E
Locate X,Y,"      " (スペース11個)
Prog "INP":Z→B
Prog "3DIGIT2"
Else If K=36
Then
5→X:2→Y:4→D:1→E
Prog "INP":Z→R
Else If K=37
Then
14→X:2→Y:3→D:1→E
Prog "INP":Z→N
IfEnd:IfEnd
IfEnd

If BRN:Then
Int(B(1+R÷100)^(N))→T
Locate 7,3,"     " (スペース10個)
T→Z:7→X:3→Y
Prog "3DIGIT2"
Int(T÷N÷12)→M
Locate 7,4,"     " (スペース10個)
M→Z:7→X:4→Y
Prog "3DIGIT2"
IfEnd

LpWhile
 1
Cls
Locate 7,2,"BYE!"



3桁区切りでの表示が劇的に速くなりました。
コードを眺めて、プログラムの巧妙さを楽しんでください。



fx-5800P の Casio Basic には文字列処理の機能がありませんが、工夫次第で色々と実現できるわけで、逆に言えば Casio Basic がそれだけ高機能だとも言えますね。



つづく...

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




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

人気ブログランキングへ


FC2ブログランキングへ







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

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




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

Casio Basic入門G05

Casio Basic入門
<目次>

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

2015/07/25 追記
2017/09/25 追記



 5. Casio Basic でグラフィックス


前回: Casio Basic入門G04


Chapter G05
Plot と ViewWindow

前回は、Plot コマンドについて、色々と調べましたが、論理座標系での動作しか確認していません。

今回は、Plot コマンドのカーソル表示座標は、ViewWindow座標系を反映するのか?という疑問について調べて見ました。

なお、fx-9860GII の取扱説明書(fx-9860GII_Soft_J_2.04.pdf)の 8-24 ページには、

Plot <X座標値>,<Y座標値>

と記載があるだけなので、前回同様、実際にプログラムを作りながら細かい点を確認してゆきます。



最初に、以下のプログラム VW.PLOT1 を作ります。

ファイル名: VW.PLOT1
ClrGraph
CoordOn
GridOff
AxesOn
LabelOff

Plot 6,3◢
Text 1,1,"x=  " (スペース4個)
Text 1,35,"y=   " (スペース5個)
Text 1,10,X
Text 1,45,Y◢

ViewWindow -10,116,10,-10,52,10
Plot 6,3◢
Text 1,1,"x=  " (スペース4個)
Text 1,35,"y=   " (スペース5個)
Text 1,10,X
Text 1,45,Y


⇒ ダウンロード: VW.PLOT1

プログラム冒頭で、ClrGraph を実行しているので、ここで自動的にデフォルトの論理座標系になっています(ClrGraph の仕様)。
そして、Plot 6,3◢ で、座標 (6, 3) にカーソルを表示します。ここで [EXE] を押せば、この位置に点が描画されるはずです。
そして、描画された点の位置を示す X座標値とY座標値は、それぞれ変数 XY に自動的に代入されます。
従って、続く Text コマンドで各座標値が表示され、そこで出力命令 によりプログラムは一旦停止します。

ここまでは、前回見てきた内容です。続いて今回のテーマである座標系変更に伴う Plot コマンドの動作を確認するためのコードを書きます。

上で赤文字で示したような ViewWindow座標系を設定し、続いて Plot 6,3◢ を実行します。
ここで、[EXE] を押せば、カーソル位置に点が描画されます。その後、同様に Text コマンドで、描画された点の座標値 XY を表示します。

以上が、プログラムの内容です。実際に起動してみます。

VW.PLOT1-1 

CoordOn によりカーソルの座標値が最下行に表示されていて、確かに、カーソルが座標 (6, 3) に表示されていることが確認できます。

ここで、[EXE] を押すと、

VW/PLOT1-2 

座標 (6, 3) に点の描画が確認できます。さらに、点が描画されると、十字カーソルが消えて、それに連動して座標値の表示も消えます。

CoordOn はカーソルの位置を示すのであって、描画された点の座標値を示さないことが、併せて確認できます。十字カーソルとカーソル位置の座標値表示は、Plot コマンドを一旦停止した時だけ現れるということです。

さて、この状態では Text 1,45,Y◢ のところでプログラムが一旦停止しています。そこで [EXE] を押して一旦停止を解除します。

すると、ViewWindow の設定が実行されて、座標系が変更され、その上で、Plot 6,3◢ が実行された結果が表示されます。

VW,PLOT1-3 

十字カーソルが再び表示され、最下行にカーソル位置の座標値も表示され、カーソル位置が (6, 3) になっていますね。つまり、Plot コマンドで表示されるカーソル位置は、設定したViewWindow座標系に従うことが、確認できました。

ここで、もう一つ Plot コマンドの特徴が分かります。ViewWindow を実行すると、それまで描画されていたグラフィックスが消去されるはずですが、Plot で描画した点は、消去されていないのです。右上の点が消えずに残っています

今この状態では、Plot 6,3◢ によりプログラムが一旦停止しているので、[EXE] を押して、一旦停止を解除すると、

WV.PLOT1-4 

カーソル位置に点が描画され、同時にカーソルが消えて最下行にある CordOn による座標値の表示も消えました。そして、Text コマンドにより、今描画された点の座標値が表示されました。Plot コマンドによる2つの点が表示されています。

[AC] を2回押してプログラムを終了します。

==========

では、もう一度プログラム VW.PLOT1 を起動してみます。今度は、カーソルを移動させてから [EXE] を押してみます。

プログラムを起動すると、

VW.PLOT1-1 

カーソルを移動させると、最下行にある CordOn により表示される座標値が、リアルタイムに変化します。

VW.PLOT1-5 

そして、[EXE] を押すと、

VW.PLOT1-6 

カーソルと最下行の座標値表示が消え、Text コマンドによる点の座標値が表示されます。

[EXE] で一旦停止を解除すると、

W.PLOT1-7 

新しい座標系が設定され、再びカーソルと最下行の座標値表示が復活し、座標 (6, 3) にカーソルがあることが分かります。そして、右上の Plot により描画された点は、やはり残っています。

カーソルを適当に移動し、

VW.PLOT1-8 

ここで、[EXE] を押すと、カーソルと最下行の座標値表示が消え、Text コマンドにより点の座標が表示されました。そして、2つの点も表示されます。

Plot コマンドで描画した点は、ViewWindow では消去されないことが再確認できました。



Plot コマンドで描画された点と ViewWindow によるグラフィックス描画の消去について、もう少し詳しく調べてみます。具体的には、ViewWindow 設定を次々と変更しながら、その都度 Plot コマンドでカーソルを表示し [EXE] で点を描画させてみます。

そこで、以下のプログラム VW.PLOT2 を入力してください。

ファイル名: VW.PLOT2
ClrGraph
CoordOn
GridOff
AxesOn
LabelOff

For 5→I To 20
ViewWindow -2I,40-2I,2,-I,20-I,2
Plot -2,-2◢
Next


⇒ ダウンロード: VW.PLOT2

このように、ViewWindow は、変数を用いて設定することもできます。
このプログラムでは、For 文を用いて、座標系の原点を左下から右上まで徐々に変更しながら、常に座標 (-2, -2)Plot でカーソル表示+[EXE] で、点描画を繰り返します。

Casio Basic コマンドリファレンス - For 文

プログラムを起動し、[EXE] キーを何回か押してゆくと、画面表示が変化してゆきます。



動画を見れば分かるように、この For 文では、ViewWindow 座標系の横幅を 41、縦幅を 21 に固定、原点の位置だけを変更して、それぞれで Plot -2,-2◢ を実行していることになります。


Plot で描画された点は、直前の描画は残りますが、それ以前の描画は消去されていることが分かりますね。おそらく、Plot と連動して使う Line コマンドを活かして互換性を保つために、このような仕様になっていると想像しています。但し、ViewWindow を実行すると Line で描画した直線は消去されます。

試しに、上のプログラムに Line コマンドを追加して実行してみると分かります。

ClrGraph
CoordOn
GridOff
AxesOn
LabelOff

For 5→I To 20
ViewWindow -2I,40-2I,2,-I,20-I,2
Plot -2,-2◢
Line
Next


一瞬直線が表示されてスグに消去されますが、最後の直線は残ります。



さて、VW.PLOT2 を実行してみて、1つ気になることがあります。

Plot -2,-2◢ では、整数値を指定しているのに、CoordOn で最下行に表示される座標値が小数値になっています。



ViewWindow座標系で描画される点が、物理的なピクセル位置に完全に対応せず、四捨五入計算で最も近いピクセルを On にし、そのピクセル位置から逆算して座標値を求めているのが原因だと考えられます。

グラフを描画するのではなくて、単にグラフィックス表示を行うプログラムでは、このあたりの計算による誤差が問題になることが実際に発生します。これについては、次回以降で具体的に検証する予定です。

物理的なピクセルは、Casio Basic でプログラムを作る限りは、横 127 ピクセル、縦 63 ピクセルの表示エリアを使う(Casio Basic入門G01参照)ので、ViewWindow 座標系の指定では、この数に合うように設定すれば、座標の設定値と読取値は、整数のまま一致するはずです。

そこで、今回は妙な小数にならないように、物理的なピクセル数に合わせた ViewWindow 設定を試してみます。

プログラム VW.PLOT2 を以下のような ViewWindow 設定に書き換えてみます。

ファイル名: VW.PLOT3
ClrGraph
CoordOn
GridOff
AxesOn
LabelOff

For 20→I To 62 Step 3
ViewWindow -2I,126-2I,10,-I,62-I,10
Plot -10,-10◢
Next


⇒ ダウンロード: VW.PLOT3

これを実行してみると、



この動画からスグに分かると思いますが、ViewWindow 座標系の横幅を 127、縦幅を 63 に固定して、原点だけを移動させていることになります。今度は座標値の表示が設定値と全く同じ (-10, -10) と、正しく整数になっていますね。


以上で、PlotViewWindow の関係が詳しく分かりました。



ところで、プログラム VW.PLOT2 や VW.PLOT3 のように、ViewWindow 設定を切り替えるようなプログラムでは、ViewWindow 設定の保存と読出機能が便利になることがあります。

ViewWindow 設定は、StoV-Win コマンドで 6通り保存することができ、RclV-Win コマンドでそれを呼びだすことができます。

StoV-Win コマンド

・書式StoV-Win <番号>
  • <番号> は、1 から 6 の整数、合計 6 通りを保存できる。
  • 現在の ViewWindow 設定を保存する。
  • <番号> には、数値と変数が使える。
  • <番号> が 7 以上の時は、Argument ERROR (引数エラー) となる。
  • メインメモリの空容量が足りない時は、実行時にエラーとなり、保存できる数が 6 未満のこともある。設定1つで 152 バイト使います。
・入力方法[SHIFT] [F3] (V-Window) [F2] (Sto)


RclV-Win コマンド

・書式RclV-Win <番号>
  • <番号> は、1 から 6 の整数。StoV-Win で設定した番号を指定する。
  • 保存された ViewWindow 設定を呼び出して有効にする。
  • <番号> には、数値と変数が使える。
  • <番号> が 7 以上の時は、Argument ERROR (引数エラー) となる。
入力方法[SHIFT] [F3] (V-Window) [F3] (Rcl)


プログラム VW.PLOT3StoV-Win / RclV-Win を使って書き換えてみます。但し保存できる数が最大 7 なので、For 文のステップ数を増やして、保存する数を 7 以下にする必要があります。

ファイル名: VW.PLOT4
ClrGraph
CoordOn
GridOff
AxesOn
LabelOff

1→V
For 27→I To 62 Step 7
ViewWindow -2I,126-2I,10,-I,62-I,10
StoV-Win V
Isz V
Next

V-1→W
For 1→V To W
RclV-Win V
Test 1,1,V
Plot -2,-2◢
Next


⇒ ダウンロード: VW.PLOT4

ClirGraph
に続くグラフ設定を行い、続いて 複数の ViewWindow 設定を StoV-Win V (変数 V は 1 から始まり、1つづつ増やす) で次々と保存しています。結果的に 6 通り保存しています。
引き続き、保存した ViewWindow 設定を RclV-Win V (変数 V は 1 から始まり、1つづつ増やす) で呼び出し、それぞれで Plot -2,-2◢ を実行します。[EXE] を何回か押してゆきます。



ここで、StoV-WinRclV-Win のパラメータに変数 XY を使うと、プログラムは誤動作します。試しに、上のプログラムで、V の代わりに X を、W の代わりに Y に変更して、実行してみてください。エラーになります。

誤動作の理由は分かりますか?

Plot コマンドでカーソル表示の際に、[EXE] を押すと、カーソルの座標値が自動的に 変数 XY に代入される仕様です。つまり、変数 Y には予期せぬ値が入ってしまうのが誤動作原因です。Plot の仕様を理解していないと、バグに悩むことになりますね。

なお、直接 ViewWindow で座標系を設定せず、RclV-Win で設定しても、Plot -2,-2◢ で描画された最後の点は、消去されません。RclV-Win の動作は、ViewWindow による直接設定と同じだと分かります。



ViewWindow の保存と呼び出し機能を使ったので、次にグラフィックス画面全体の保存と呼び出し機能を試してみます。グラフィックス画面全体を保存するには StoPict コマンド、呼び出して描画するのは RclPict コマンドを使います。

StoPict コマンド

・書式StoPict <番号>
  • <番号> は 1 から 20 の整数、合計 20 通保存できる。
  • 現在のグラフィックス画面全体を保存する。
  • <番号> には、数値と変数が使える。
  • <番号> が 21 以上の時、Argument ERROR (引数エラー) となる。
  • メインメモリの空容量が足りない場合は、実行時にエラーになり、保存できる数が 20 未満のこともある。設定1つに 2068 バイト使います。
・入力方法[OPTN] [F6] (▷) [F6] (▷) [F2] (PICT) [F1] (Sto)


RclPict コマンド

・書式RclPict <番号>
  • <番号> は 1 から 20 の整数、StoPict で設定した番号を指定する。
  • <番号> には、数値と変数が使える。
  • 保存されたグラフィックス画面を呼びだして表示する。
  • <番号> が 21 以上の場合は、Argument ERROR (引数エラー) になる。
・入力方法: [OPTN] [F6] (▷) [F6] (▷) [F2] (PICT) [F2] (Rcl)


プログラム VW.PLOT3 の描画を一旦保存しておき、あとでそれを呼び出して表示するプログラムを作ってみます。

ファイル名: VW.PLOT5
ClrGraph
CoordOn
GridOff
AxesOn
LabelOff

1→P
For 20→I To 62 Step 3
ViewWindow -2I,126-2I,10,-I,62-I,10
Plot -10,-10
StoPict P
Isz P
Next

AxesOff
P-1→Q
For 1→P To Q
ClrGraph
F-Line -6.3,-3.1,6.3,3.1
RclPict P◢
Next


⇒ ダウンロード: VW.PLOT5

VW.PLOT3
に追加した部分を赤文字で示しています。なお、Plot -10,-10 の後の は外しています。

ClrGraph でグラフィックス画面を消去し、種々のグラフ設定を行った後、SotPict <番号><番号> に使う変数 P を 1 で初期化し、Plot -10,10 により描画した点、表示された座標軸ごとグラフィックス画面として、StoPict P で保存します。 P は、1, 2, 3, ... です。

その後、AxesOff で座標軸表示を Off にした上で、保存したグラフィックス画面を、順次 RclPict P で呼出して表示しています。座標軸表示を Off にしたのは、座標軸も保存され、呼出されるのかどうかを確かめる目的です。また、RclPict の前に ClrGraph と F-Line を実行しています。ClirGraph により論理座標系が設定され、同時にメモリ間隔が 1 に設定される影響も確かめられます。さらに、F-Line で左下から右飢えへ直線を描画していますが、この直線が RclPict でどのように影響されるのかも確かめます。



結果として、StoPictRclPict は、グラフィックス画面に表示されている内容を、丸ごと保存し、呼出することが分かりました。そして、RclPict は、グラフィックス画面に上書きするのではなくて、既にあるグラフィックス描画に重ね合わせて表示することも分かりました。

RclPict
コマンドは、グラフィックス画面全体のデータを一度にLCD転送するので描画が速いのが最大の利点です。20個の画面データを扱えるので、プログラミングでの利用価値はあると思います。詳しくは次回以降取り上げようと思います。

[2015/07/25 追記]
StoPict / RclPict は、fx-CG20 / 10 でも今回のCasio Basic プログラムは100% で動作するのこと。但し、fx-9860GII に比べて描画がかなり遅いという情報を頂きました。保存先のメモリが、fx-9860GII は RAMであるのに対して、fx-CG20 / 10 では、フラッシュメモリ(保存メモリ)なのが原因だそうです。




今回のまとめ
  • Plot は、ViewWindow 座標系の設定に従って動作する。
  • CoordOn 設定時に Plot でカーソルが表示されている時、[EXE] で点描画を行うと、カーソルと 座標値の表示が消える。
  • CoordOn により表示される座標値は、カーソル位置を示すもの。
  • Viewwindow で座標系を設定する際、グラフィックス描画は消去されるが、例外的に Plot で直前に描画した点 のみが消去されずに残る。
  • CorrdOn で表示される座標値は、Plot X,Y で指定される座標(X, Y) を示すのではなく、実際に表示されるピクセル位置を、座標系から換算された位置を示すため、計算された結果となるから、Plot X,Y で整数値を指定しても表示される座標値が小数になることがある。
  • 座標系を StoV-Win で保存し、RclV-Win で呼び出す場合は、ViewWinidow 設定と全く同じ動作をする。
  • StoV-Win / RclV-Win で指定する番号は、整数を格納した変数でも良い。
  • StoPict / RclPict で保存 / 呼出しされるグラフィックス画像は、座標設定を含めて画面に表示される全てを扱う。
  • RclPict でグラフィックス画像を呼び出す場合、既にあるグラフィックス描画に上書き表示せずに、元のグラフィックスを消さずに重ねて表示する。
  • RclPict は画面全体のデータを LCD転送するので、描画が速い。但し fx-CG20 / 10 では保存メモリ(フラッシュメモリ)を使うため非常に遅くなる。

今回使ったグラフィックス コマンド
  • Plot
  • ViewWindow
  • Text
  • StoV-Win / RclV-Win
  • StoPPict / RclPict
  • F-Line




つづく...

Casio Basic入門 G06 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ








keywords: fx-9860GIICasioBasic、プログラミング入門グラフィックスプログラム関数電卓

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


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

Casio Basic入門G03

Casio Basic入門
<目次>

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

修正 2015/07/30
修正 2017/09/25



 5. Casio Basic でグラフィックス


前回: Casio Basic入門G02


Chapter G03
ClrGraphViewWindow

今回は、グラフィックス画面を消去する ClrGraph コマンドと 座標系を設定する ViewWindow について調べて見ます。



ClrGraph の詳細動作

最初に、ClrGraph の機能を確認するため、次の2つのプログラムで実験します。

ファイル名:CLRGRPH1
ViewWindow -10,30,2,-5,15,2
CoordOff
GridOff
AxesOn
LabelOff
PlotOn 2,2



ファイル名:CLRGRPH2
ClrGraph
PlotOn 2,2



CLRGRPH1 は、ViewWindow 座標系を指定し、グラフ設定は AxesOn で座標軸表示を On にする以外は全て Off にし、最後に 座標 (2, 2) に点を描画します。

ClrGraph-5 

座標系とグラフ設定は、指定された通りで、座標 (2, 2) に点が描画されています。

この座標系設定とグラフ設定は保存されていて、グラフィックス画面もこの状態で保存されているはずです。そこで、続いて CLRGRPH2 を実行すると、ClrGraph が実行され、再び座標 (2, 2) に点を描画するはずです。実行画面は以下のようになりました。

ClrGraph-6 

ClrGraph コマンドは、グラフィックス画面を消去するだけでなく、座標系をデフォルトの論理座標系に変更することが確認できました。

さらによく見てみると、目盛間隔が指定通りになっていません。
1つめのプログラム CLRGRPH1 で目盛間隔を 2 に指定しているのに、CLRGRPH2 を実行した結果、目盛間隔(スケール)が 1 に変更されています。つまり、ClrGraph は目盛間隔(スケール)も変更することが分かりました。


ここで、消去や設定について、まとめます。

コマンドの機能 - グラフィックス画面の消去と座標系の設定について
コマンド描画の消去座標系グラフ設定
ViewWindow消去する※1)再設定現状設定を維持
ClrGraph消去する論理座標系に変更※2)
現状設定を維持
Cls消去する現状設定を維持現状設定を維持
※1) 例外的に、ViewWindow 実行の直前にPlot コマンドで描画した点については、適用されない。
※2) ClrGraph は、論理座標系に変更し、さらにスケールを 1 に設定する。

ViewWindow
このコマンドで座標系を設定すると、グラフィックス画面は、クリア(消去)されます。但し1つだけ例外として、Plot コマンドでクリア直前に描画された点には適用されません [2017/09/25 追記修正]Plot コマンドは特殊で面白いコマンドなので、後で別に取り上げます。
ViewWindow 設定は、このコマンドで明示的に設定するか、あるいは ClrGraph を実行する以外は、設定は保存され、グラフィックス画面に反映されます。

ClrGraph
グラフィックス画面をクリア(消去)するだけでなく、座標系を論理座標系に設定、スケールを1に設定します。

Cls
グラフィックス画面をクリア(消去)します [2015/7/30 修正]。座標系は現在の設定が維持されます。
CLRGRPH2ClrGraphCls に置き換えて実験してみると、確認できます。

グラフ 設定コマンド
4種類の設定の On /Off を行うもので、これら4つのコマンドの設定内容は、ViewWindow, ClrGraph, Cls の影響を受けません。
1) CoordOn / CoordOff : カーソル位置の座標値出力を On / Off する、Plot コマンドを使う時のみ意味があります。
2) GridOn / GridOff : グリッドの表示を On / Off する
3) AxesOn / AxesOff : 座標軸の表示を On / Off する
4) LabelOn / LabelOff : 座標軸の X、Y ラベル表示を On / Off する



グラフィックス画面とテキスト画面の切り替え

以下のプログラムを実行してみます。

ファイル名: PLOT1.1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

PlotOn 1,0



グラフィックス画面を消去し、論理座標系が設定され、座標値表示 / グリッド表示 / 座標軸表示 / 軸ラベル表示 を全て Off にした上で、PlotOn コマンドで、(x, y) = (1, 0) に点を描画します。

グラフィックスコマンド PlotOn が実行されると、グラフィックス画面に点を1つ描画します。

Plot-1-1-1 

この表示のままプログラムが終了します。

ここで、[EXE] [EXIT] [AC] のいずれかのキーを押すと、画面右上に Done と表示されます。

Plot1-1-2 

さらに [EXE] [EXIT] [AC] のいずれかのキーを押すと、Program List へ戻ります。

Plot-1-1-3 

もう一度、このプログラムを起動します。

Plot-1-1-1 
そして、点が1つ描画されているグラフィックス画面が表示されている時、[SHIFT] [F6] (G↔T) を押してください。これは、グラフィックス画面とテキスト画面の表示を切り替える操作です。1回押せばテキスト画面 (Done と表示) になり、もう一度このキー操作を行うと、グラフィックス画面に戻ります。

Plot1-1-2 
Done と表示されているのは、テキスト画面であることが分かります。

そして、グラフィックス画面を表示してプログラムが終了した場合、Program List へ戻るには、テキスト画面へ一旦遷移することも分かります。fx-9860GII OS 2.04 ~ OS 2.09 では、このような仕様になっているようです。

==========

それでは、次のプログラムを実行してみます。

ファイル名: PLOT1.2
CllrGraph
CoordOff
GridOff
AxesOff
LabelOff

PlotOn 1,0
Locate 1,1,"Text"



このプログラムを起動すると、Locate 1,1,"Text" の結果として、画面左上に Text と表示しますが、PlotOn 1,0 の結果は表示されていません。

Plot1-2 
プログラムの最後に、テキスト画面に表示するコマンドが実行されたので、自動的にグラフィックス画面からテキスト画面に切り替わっていることが分かります。これで正常なのでしょう。

ここで、[SHIFT] [F6] (G↔T) を押すと、グラフィックス画面に切り替わり、点が描画されていることが確認できます。
Plot-1-1-1 

グラフィックス画面への描画は行われたが、裏に回って表示されないということです。

==========

グラフィックス画面には、Locate コマンドや出力命令 " " で出力ができません。fx-9860GII OC2.04 ~ OS 2.09 の Casio Basic の仕様です。

グラフィックスと文字を同時に表示するには、グラフィックス画面で文字表示を行うコマンドが必要で、そのために Text コマンドが用意されています。

Text コマンド

書式Text [y],[x],[出力内容]
  • [y], [x]物理座標系での座標で、物理的なピクセル位置を指定する。y座標(縦方向) の [y] を先に指定するLocate とは [x], [y] の指定順序が異なる
  • [出力内容] は、"文字列" 、変数、数値、Getkeyコマンドが使える。これは Locate と同様。
入力方法
[SHIFT] [F4] (Sketch) [F6] (▷) [F6] (▷) [F2] (Text)

Text コマンドは、現在選択されている座標系に関係無く、物理座標系を用いる仕様です。物理座標系での位置指定で、縦方向つまり y 座標を先に指定するのは、慣れるまでは分かりにくいと思います。物理座標系を使う PxlOn などの位置指定も同じです。

では、上で作ったプログラムに、Text コマンドの行を追加してみます。

ファイル名: PLOT1.3
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff

PlotOn 1,0
Locate 1,1,"Text"
Text 1,1,"Graphic"



実行してみると、

Plot1-3 

点が1つ描画され、さらに文字列 Graphic も表示されました。

ちなみに、Text コマンドで描画されるフォントは テキスト画面のフォントよりも小さくなっています。そのため、見た目が貧弱で見づらいのですが、LCDの解像度が低いので仕方ないですね。古い機種との互換性を考え、このようなフォントをそのまま使っているのでしょう。Text コマンドで表示されるフォントは、プログラム編集画面に入ったところで、[F6] (CHAR) を押すと一覧が現れます。

さて、ここで [SHIFT] [F6] (G↔T) を押すと、裏に回っていたテキスト画面が表示されますね。

Plot1-1-2 

ただ、本来 Text と表示されるべきですが、Done としか表示されません。そこで、Locate コマンドで表示する位置を1行下へずらしてみます(以下の赤文字に注目)。

ファイル名: PLOT1.4
CllrGraph
CoordOff
GridOff
AxesOff
LabelOff

PlotOn 1,0
Locate 1,2,"Text"
Text 1,1,"Graphic"


これを実行し、裏へ回っているテキスト画面に切り替えると、今度は文字列 Text が出てきました。

Plot1-4 

Done という表示は、テキスト画面の内部カーソル行に表示され、丸々1行を上書きしているようです。そのため、1行目に Text と表示した場合は、上書きされて消えたのですが、Locate コマンドで2行目に表示すると、カーソル行が1行目のままなので、2行目の文字列 Text が見えたわけです。

テキスト画面の内部カーソル行は、出力命令 " "  を1回実行すると1行下がり、ClrTextCls を実行するとリセットされて1行目に戻ります。
 ⇒ Casio Basic コマンドリファレンス - 出力命令 " "

グラフィックス描画の際に、テキスト画面に表示される Done が出現するのは、テキスト画面に出力するコマンド/命令が実行されるタイミングだということは分かっていますが、完全な法則性はまだ確認できていません。いずれはっきりと分かったら、紹介したいと思います。



ViewWindow の性質

ViewWindow コマンドは、座標系を設定します。直交座標系と極座標系の設定ができますが、当面直交座標系の設定について紹介します。

直交座標系 での書式
ViewWindow [Xmin],[Xmax],[Xscale],[Ymin],[Ymax],[Yscale]
  • Xmin: X軸(横方向)の左端の値
  • Xmax: X軸(横方向)の右端の値
  • Xscale: X軸(横方向)の目盛間隔
  • Ymin: Y軸(縦方向)の下端の値
  • Ymax: Y軸(縦方向)の上端の値
  • Yscale: Y軸(縦方向)の目盛間隔
ここで、注意が必要なのは、Xmin は、X軸の最小値ではなく、左端の値だということ。
例えは、Xmin = 63、Xmax = -63 と設定することもできます。この時は、X軸(横方向)は、右が小さく、左にゆくほど値が大きくなり、座標軸の方向を逆に設定できるわけです。

ここで、XminXmax などと紛らわしい表現をしたのには、理由があります。

例えば、

ViewWindow -10,30,5,-5,15,5

と記述する代わりに、

-10→Xmin
30→Xmax
5→Xscl
-5→Ymin
15→Ymax
5→Yscl


と記述することもできます。Xmin、Xmax、Xscl、Ymin、Ymax、Yscl は、Casio Basic で予め予約された変数で、これに値を代入することで座標系を設定できます。或いは、現在の座標系で設定されている各値を知ることもでき、プログラムを書く時役立つことがあります。

これら2つの異なる記法の整合性をとるために、紛らわしい表現になってしまっています。

==========

では、プログラムの中で ViewWindow で座標系の設定を変えると、どうなるのかを調べてみます。

先ずは、次のプログラムを入力してください。

ファイル名:VW.PCL.1
ClrGraph
CoordOn
GridOff
AxesOn
LabelOn

ViewWindow -20,20,5,-5,15,5

Text 7,1,"[EXE]"
PxlOn 20,30
Text 1,1,"PxlOn 20,30"◢

PlotOn 10,10
Text 1,1,"PlotOn 10,10"◢

Circle 0,0,15
Text 1,1,"Circle 0,0,15"◢

F-Line 0,0,10,10
Text 1,1,"F-Line 0,0,10,10"◢


以下からダウンロードして、fx-9860GII へ転送もできます。
⇒ Casio Basic プログラムファイル VW.PCL.1.g1m のダウンロード


これを起動すると、以下の画面になります。

VW-PCL-1 
テキスト表示は、PxlOn 20,30 を実行したことを示していて、物理座標の (y, x) = (20, 30) に点が描画されています。

[EXE] キーを押すと、

VW-PCL-2 
PlotOn 10,10 により、ViewWindow -20,20,5,-5,15,5 で設定された座標系で (x, y) = (10, 10) に点が追加されます。

さらに、[EXE] キーを押すと、

VW-PCL3 
Circle 0,0,15 により、原点 (0, 0) を中心にして、半径 15 の円が描画されます。既に描画した2つの点も見えます。

続いて、[EXE] キーを押すと、

VW-PCL-4 
F-Line 0,0,10,10 により、座標 (0, 0) から (10, 10) へ直線が描画されます。


ここでは、以下の描画コマンドを使いました;
  • PxlOn: 指定した座標のピクセルを On にする。物理座標系を使う
  • PlotOn: 点を描画する。論理座標系か ViewWindow 座標系を使う
  • Circle: 円を描画する。論理座標系か ViewWindow 座標系を使う
  • F-Line: 線を描画する。論理座標系か ViewWindow 座標系を使う
PxlOn

書式PxlOn [y],[x]
  • y と x で指定した座標のピクセルを On にする。
  • 物理座標系のみを使うコマンド。y = 1, 2, 3...63 の整数値、x = 1, 2, 3...127 の整数値。
  • y 座標(縦方向) を先に設定する。
入力方法[SHIFT] [F4] (Sketch) [F6] (▷) [F6] (▷) [F3] (PIXL) [F1] (On)


PlotOn

書式PlotOn [x],[y]
  • 座標 (x, y) に点を描画する。
  • 論理座標系 あるいは ViewWindow 座標系を使うコマンド。x, y は、小数でも良い。
入力方法[SHIFT] [F4] (Sketch) [F6] (▷) [F1] (PLOT) [F2] (Pl・On)


Circle

書式Circle [x],[y],[r]
  • 座標 (x, y) を中心として、半径 r の円を描画する。
  • 論理座標系 あるいは ViewWindow 座標系を使うコマンド。x, y, r は小数でも良い。
入力方法[SHIFT] [F4] (Sketch) [F6] (▷) [F3] (Crcl)


F-Line

書式F-Line [x1],[y1],[x2],[y2]
  • 座標 (x1, y1) と (x2, y2) を両端とした直線を描画する。
  • 論理座標系 あるいは ViewWindow 座標系を使うコマンド。x, y は小数でも良い。
入力方法[SHIFT] [F4] (Sketch) [F6] (▷) [F2] (LINE) [F2] (F・Line)

==========

さて、ここまで描画したところで、座標系を左へ10シフトしてみます。つまり、

座標系指定: ViewWindow -20,20,5,-5,15,5



座標系指定: ViewWindow -10,30,5,-5,15,5

に、変更します。


ファイル名:VW.PCL.1に1行追加
ClrGraph
CoordOn
GridOff
AxesOn
LabelOn

ViewWindow -20,20,5,-5,15,5

Text 7,1,"[EXE]"
PxlOn 20,30
Text 1,1,"PxlOn 20,30"◢

PlotOn 10,10
Text 1,1,"PlotOn 10,10"◢

Circle 0,0,15
Text 1,1,"Circle 0,0,15"◢

F-Line 0,0,10,10
Text 1,1,"F-Line 0,0,10,10"◢

ViewWindow -10,30,5,-5,15,5



これを実行すると、

VW-PCL-5 

と、テキスト画面が表示されます。

ここで [SHIFT] [F6] (G↔T) で、裏に回ったグラフィックス画面を表示させると、

VW-PCL-6 

座標軸とラベル XY 以外、何もありません。ViewWindow を実行すると、グラフィックス画面を消去することが分かります。
但し、グラフ設定はそのまま維持され、座標軸とラベルはグラフィックス画面の背景として表示されたままです。
ViewWindow はグラフィックス描画コマンドでないので、グラフィックス画面が裏へ回っています。

そこで、プログラムの最後に PlotOn を実行させると、グラフィックス画面を表示したままプログラムが終了するはずです。

ファイル名:VW.PCL.2
ClrGraph
CoordOn
GridOff
AxesOn
LabelOn

ViewWindow -20,20,5,-5,15,5

Text 7,1,"[EXE]"
PxlOn 20,30
Text 1,1,"PxlOn 20,30"◢

PlotOn 10,10
Text 1,1,"PlotOn 10,10"◢

Circle 0,0,15
Text 1,1,"Circle 0,0,15"◢

F-Line 0,0,10,10
Text 1,1,"F-Line 0,0,10,10"◢

ViewWindow -10,30,5,-5,15,5
PlotOn 10,10



以下からダウンロードして、fx-9860GII へ転送しても使えます。
⇒ Casio Basic プログラムファイル VW.PCL.2.g1m のダウンロード


これを起動して、[EXE] を4回か押すと、以下の画面になります。

VW-PCL-7 

全てのグラフィックス描画が消去された後、PlotOn コマンドで1つだけ点が描画されていて、グラフィックス画面が表に表示されています。



ClrGraph とグラフ設定 / ViewWindow 以外の座標系設定法

ClrGraph コマンドを実行すると、グラフィックス画面が消去されるだけでなく、論理座標系に設定されます。

例えば、以下のような ViewWindow 座標系を指定します。これは、論理座標系と同じです。

ViewWindow -6.3,6.3,0,-3.1,3.1,0

また、以下のような別の表記で同じ設定ができます。

-6.3→Xmin:6.3→Xmax:0→Xscl
-3.1→Ymin:3.1→Ymax:
0→Yscl


但し、赤文字で示した3番目と6番目のパラメータは、座標軸と一緒に表示される目盛の間隔を設定するものです。座標軸を On にする時(AxesOn) に意味があります。これはグラフ設定の1つですが、4つのグラフ設定コマンドでは指定できません。

ClrGraph を実行すると目盛間隔が 1 に設定されることを、別の方法で確認してみます。

ファイル名:CLRGRPH3
AxesOn
0→Xscl:0→Yscl
"Set Scale to 0."◢

ClrText
ClrGraph
Locate 1,1,"Xmin:"
Locate 6,1,Xmin
Locate 12,1,"Xmax:"
Locate 17,1,Xmax
Locate 1,2,"Xscl:"
Locate 6,2,Xscl
Locate 1,3,"Xfct:"
Locate 6,3,Xfct
Locate 12,3,"Xdot:"
Locate 17,3,Xdot

Locate 1,5,"Ymin:"
Locate 6,5,Ymin
Locate 12,5,"Ymax:"
Locate 17,5,Ymax
Locate 1,6,"Yscl:"
Locate 6,6,Yscl
Locate 1,7,"Yfct:"
Locate 6,7,Yfct



入力が面倒な場合は、以下からダウンロードして、fx-9860GII へ転送できます。
⇒ Casio Basic ファイル CLRGRPH3.g1m のダウンロード


Xmin, Xmax, Xscl, Xfct, Xdot, Ymin, Ymax, Yscl, Yfct の入力は、ショートカットが分からない時は [SHIFT] [4] (CATALOG) で現れるコマンドリストから探せます。

Xmin の入力
[VARS] [F1] (V・WIN) [F1] (X) [F1] (min)

Xmax の入力
[VARS] [F1] (V・WIN) [F1] (X) [F2] (max)

Xscl の入力
[VARS] [F1] (V・WIN) [F1] (X) [F3] (scal)

Xdot の入力
[VARS] [F1] (V・WIN) [F1] (X) [F4] (dot)

Ymin の入力
[VARS] [F1] (V・WIN) [F2] (Y) [F1] (min)

Ymax の入力
[VARS] [F1] (V・WIN) [F2] (X) [F2] (max)

Yscl の入力
[VARS] [F1] (V・WIN) [F2] (Y) [F3] (scal)

Xfct の入力
[VARS] [F2] (FACT) [F1] (Xfct)

Yfct の入力
[VARS] [F2] (FACT) [F2] (Yfct)


なお、このプログラムでは、XsclYscl 以外に、Xfct, Xdot, Yfct についても値を調表示します。

先ず最初に、AxesOn で座標軸を表示させる設定にし、X と Y 座標軸の目盛間隔を 0 に設定。これで、座標軸を表示するが目盛は表示しないようになります。この設定を行ったところで、出力命令◢ で一旦実行を止めて、Set Scale to 0. (目盛に 0 をセット)と表示させます。

ClrGraph-1 

ここで、グラフィックス画面を確認するために、[SHIFT] [F6] (G↔T) で裏に回っているグラフィックス画面を表示してみると、

ClrGraph-3 

座標軸は表示されているが、目盛は表示されていない、つまりプログラムコード通りに表示されていることが確認できます。

出力命令◢ で一旦停止しているプログラムを、[EXE] キーを押して停止解除すると、残りの処理を最後まで実行して、各変数の値を表示します。

ClrGraph-2 

XsclYscl が共に 1 になっています。ClrGraph を実行すると、スケールが 1 に設定されるようです。

再び裏に回っているグラフィックス画面を確認するために、[SHIFT] [F6] (G↔T) を押すと、

ClrGraph-4 

目盛が間隔 1表示されていることが、再度確認できました。ここで、例えば PlotOn 1,1 を実行すると、目盛間隔が 1 になっていることも確認できます。


なお、Xdot は1ピクセルの値を示したり、設定する変数です。Ydot は準備されていないようです。1→Xdot とするとピクセルあたり 1 に設定できることは、簡単に確かめられます。

XfctYfct は拡大率を示していて、共に 2 に設定されるようです。
これは、0→Xscl:0→Yscl の下に、1→Xfct:1→Yfct を追加して、プログラムを実行すると、これがの値が 2 に変更されることが確認できます。是非やってみてください。

fx-9860GII OS 2.04 では、グラフ機能の1つにデュアルグラフといって、1画面に2つのグラフを表示する機能があります。ここからは推測ですが、デュアルグラフ機能を前提にして、ClrGraph で拡大率を 2 に設定するのではないかと思われます。

以上の実験から、ClrGraph の動作内容が詳しくわかりました。

ClrGraph の動作
  • グラフィックス画面を消去すると同時に、座標標系を論理座標に設定する。
  • 再設定の内容は、ViewWindow -6.3,6.3,1,-3.1,3.1,1 と同じで、X、Y 軸の目盛間隔を 1 に設定する。
  • 併せてグラフの拡大率を X、Y 軸共に 2 に設定する。



Casio Basic プログラムのファイル名について

fx-9860GII OS 2.04 の Casio Basic では、電卓上ではプログラムファイル名に  の文字が使えます。
これらの文字を使ったプログラムファイルを PCリンクソフト FA-124 Ver 2.04 を使ってPCへ転送・保存できます。

ところが、ファイル名に を含んだファイル、例えば TEST-1 を FA-124 で 別のフォルダへ Export しようとすると、This file nmae is invalid. (このファイル名は無効です.) とエラー表示が出て、保存ができないことを見つけました。ファイル名に が含まれたもの、例えば TEST.1 はエラーが出ません。

TEST-1 を別のフォルダで Export しようとして、ファイルダイアログで上のエラーが出たとき、ファイル名を TEST.1.G1M に変更すると、保存できます。そして、今度は逆に 今保存した TEST.1.G1M を FA-124 で Import すると、TEST-1 へ上書きされ、TEST.1 として保存されません。

Casio ファイル、g1m ファイルは、ファイル先頭部分でファイル名情報を保持しています。そして、FA-124 では、ファイル名自体をチェックせず、ファイルの先頭部にあるファイル名情報をみでチェックしているため、実際のファイル名とファイル名情報に矛盾が発生していることになります。

FA-124 は基本的に古いソフトなので、以前のグラフ関数電卓では、- 文字をファイル名に使えなかった時の仕様を引きずっているのではないかと思われます。

実際のファイル名と内部で保持しているファイル名情報に矛盾があるのは、あまり良いことでないので、プログラムファイル名に 文字を使わないほうが良いでしょう。



今回のまとめ
  • ClrGraph コマンドは、グラフィックス画面の消去だけでなく、座標系を論理座標系に変更する。
  • ClrGraph コマンドは、スケールを 1 に変更する。
  • Cls コマンドは、テキスト画面とグラフィックス画面の両方を消去するのみ。座標系の変更は行わない。
  • テキスト画面に表示するコマンドは、グラフィックス画面への出力には使えない。
  • グラフィックス画面に文字列を描画するには、Text コマンドを使う。
  • 明示的な消去を行うコマンドを使わない限り、グラフィックス画面の描画はそのまま残る。
  • [SHIFT] [F6] (CHAR) で、グラフィックス画面とテキスト画面の表示を切り替える。
  • ViewWindow コマンドは、グラフィックス画面の描画を消去する。但し Plot コマンドによる描画は例外(次回紹介する)。
  • Casio Basic ファイル名には、- 文字を使わないほうが良いと思われる。


今回使ったグラフィックス コマンド
  • ClrGraph
  • CoordOff
  • GridOff
  • AxesOff
  • LabelOff
  • ViewWindow
  • Text
  • PlotOn
  • PxlOn
  • Circle
  • F-Line
  • 座標系設定やグラフ設定で使える変数: Xmin, Xmax, Xscl, Xfct, Xdot, Ymin, Ymax, Tscl, Yfct




つづく...

Casio Basic入門G04 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ







keywords: fx-9860GIICasioBasic、プログラミング入門グラフィックスプログラム関数電卓

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


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

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

やす (Krtyski)

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


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

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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR