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
CllrGraph
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、プログラミング入門グラフィックスプログラム関数電卓

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


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

Casio Basic入門G01

Casio Basic入門
<目次>

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

追記 2015/06/26
更新 2015/08/15
修正 2015/12/07
追記 2017/09/25

※ 文章と図が重なって表示される時は、ページを再読込してください(最近この現象が発生しています)。

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


はじめに

グラフ描画機能を世界で初めて電卓に取り入れたのが、カシオの fx-7000G です。それ以来、カシオのグラフ関数電卓は、教育現場の意見や要望を取り入れながら、数学教育ツールとして開発が継続されています。その延長線上に fx-9860GII があります。

私自身は、これまで fx-5800P を使いこなしてきたので、fx-9860GII のグラフ機能やグラフィックス機能が、Casio Basic にどのように実装されているのかは殆ど知らず、カシオのグラフ関数電卓のグラフィックス描画速度が非常に遅いという感覚だけが有りました。

fx-9860GII やグラフ関数電卓の Casio Basic でグラフィックス プログラミングがどのようなものか知りたいと思っても、fx-9860GII の取扱説明書のプログラム機能の記述は、特にグラフィックスに関しては、fx-5800P 以上に不親切です。

そこで、入手できる情報を元にして、自分で色々と調べて、Casio Basic 入門として記録してゆこうと思います。


Chapter G01
LCDと3つの座標系

グラフィックス描画の単位は、LCD(液晶ディスプレイ)の1ピクセルです。
fx-9860GII はモノクロLCDを使っているので、必要なピクセルをOn / Off すれば、グラフィックス描画ができます。

ピクセル1つを On したり、Off したり、On と Off を切り替えるなどのコマンドがあり、線分、水平線や垂直線、円を描画するコマンドがあります。さらに、関数をグラフとして表示するための高度なコマンド もありそうです。


Casio Basic のグラフィックス描画エリア


グラフィックス表示エリア fx-9860GII のLCDは、128 x 64 ピクセルのドット・マトリックスです。ところが、Casio Basic では、LCDの横 127ピクセル、縦63ピクセルがグラフィックス描画エリアになっています。横と縦のピクセル数を奇数にすれば、エリアの中央のピクセルを原点として、エリアを対称に使えます。グラフ描画を主眼に考えてのことだと推察されます。ちなみに Add-in プログラムを作る際には、128 x 64 ピクセル全てを使えることから、127 x 63 ピクセルの描画エリアは Casio Basic の仕様だと分かります。



3つの座標系
[2017/09/25 追記]
以下の3つの座標系を切り替えて使います。

論理座標系
 ・デフォルトの論理座標系 (ClrGraph で設定)
 ・ViewWindow座標系 (ViewWindow で設定)
物理座標系
 設定コマンドはない。物理座標系専用コマンドを使えば自動的に物理座標で使える。
 ※物理座標系専用コマンド: PxlOn、PxlOff、PxlChg、PxlTest(、Text


デフォルトの論理座標系

論理-座標系
Casio Basic で用いる座標系の1つに、描画エリア中央を原点にし、左の図のような論理座標系があります。1dot の値が 0.1 に固定されています。

例えば、座標 (5, -3) は、原点ピクセルから、右に50 dot、下に 30dot の位置になります。





この座標系で使えるコマンドには、Plot, PlotOn, PlotOff, PlotCng, Line, F-Line, Circle, Horizonal, Vertical などが挙げられます。

この座標系は、数学でグラフを書く時に分かりやすいのですが、1dot の値が 0.1 に固定されているので、この狭い範囲にグラフが収まりきらないことが多く発生します。そこで、1dot の値を自由に設定し、原点も自由に設定できれば、あらゆるグラフが書ける座標系を設定できるようになります。


ViewWindow 座標系

Casio Basic には、論理座標系を自由に設定するために、ViewWindow コマンドが用意されています。

ViewWindow 座標系設定の書式 (直行座標系の場合) [2015/06/27 更新]

ViewWindow
[左端のxの値],[右端のxの値],0,[下端のyの値],[上端のyの値],0 
  1. 3番目と6番目のパラメータは、座標軸を描画する際、AxesOn を指定した場合の目盛間隔(スケール)を指定する。座標軸と共にグラフを描画しない場合は、両方とも 0 としておけば良い。
  2. 例えば、ViewWindow 1,127,0,63,1,0 とすれば、物理座標系と同様になる(但し、小数値での座標設定ができる点が、物理座標とは異なる)。

ViewWindow座標系   
例えば、
ViewWindow 0,126,0,0,62,0 [2015/08/15 訂正]
とすれば、左の図の座標系を設定できます。
この設定例は、1dot の値が 1 つまり、数値とピクセル数が一致するので、グラフィックス描画を行う時、分かりやすくなります。


プログラムのロジックや使う変数に応じて、処理速度を最適化するために、柔軟に座標系を設定できる点も、グラフィックス プログラミングに適しているかも知れません。

この座標系で使えるコマンドには、デフォルトの論理座標系と同じ Plot, PlotOn, PlotOff, PlotChg, Line, F-Line, Circle, Horizontal, Vertical などが挙げられます。


物理座標系

さて、Casio Basic には、もう一つの座標系があります。

物理-座標系
LCDの左上隅のピクセルを原点とする座標系で、PCなどのグラフィックスで最も一般的な座標系です。

但し、原点は (0, 0) でなくて、(1, 1) で、x や y には 1以上の整数しか使えません。整数でないとエラーになります。

ちなみに、論理座標系や ViewWindow座標系では(x, y) に小数を使ってもエラーにならず、指定位置に最も近いピクセルが自動的に選ばれます。

さらに、物理座標系で使えるコマンドの座標値の記法は、x と y の順序を逆、つまり y の値を先に x の値を後にして (y, x) としなければなりません。

この座標系では、Text, PxlOn, PxlOff, PlxChg, PxlTest( ) が使えます。これらのうち、Text を除く他のコマンドでは、座標値に変数を用いる時、PxiOn Y,X というように、変数 XY を使えません。他のアルファベットは使えます。X と Y は、内部動作のための予約変数で、XY を使うとエラーになります。

[2015/12/07 修正]

座標指定に変数 X と Y を使う際、例えば、PxlOn Y,X と記述する時には注意が必要です。Text を除く他のコマンドを実行すると、変数 X と Y には、指定した物理座標系での位置を論理座標系に変換した座標 (X, Y) が自動的に格納されます。PxlOn B,A を実行しても、物理座標系での座標 (A, B) が 論理座標系に変換された座標 (X, Y) に対応する値が X と Y に自動格納されます。

さらに、X と Y には論理座標系での値が自動的に入るので、負の値や小数になることが多く、PxlOn B,A の実行直後に PxlOn Y,X を実行すると、X と Y に正の整数以外が入っている場合はエラーになります。Text を除く物理座標系で使うコマンドには、X と Y 以外の変数を座標指定に使った方が、このエラーに悩まされずに楽かも知れません。
====== 修正ここまで =====

これは、面白いので後で取り上げる予定ですが、確認するために作ったプログラムをダウンロードできます。興味のある方には、先行して遊んでみてください。
 ⇒ PxlOn の予約変数 X, Y を調べて見る
   (上を左クリックして現れるポップアップウィンドウで、リンクを右クリックし、[名前を付けてリンク先を保存] を選択)



サンプルプログラムを作ってみる

fx-9860GII は、128 x 64 ドットのモノクロLCD(液晶ディスプレイ)を搭載していますが、Casio Basic でのグラフィックスエリアは 127 x 63 ドットです(上記参照)。

以下のプログラムを実行すると、LDCの上端の1ラインと左端の1ラインが、グラフィックスエリアに使われていないことが確認できます。(但し、グラフィックス描画以外には、使われるケースがあることも分かっています。今後紹介します)。

なお、プログラム実行中の方が視認性が良くなります。見づらい場合はLCDのコントラストを調整してみてください。

ClrGraph
LabelOff
For -3.1→Y To 3.1 Step 0.1
Horizontal Y
Next

(論理座標系)

プログラムの入力と実行の操作方法は、「ソフトウェア バージョン Ver 2.04 取扱説明書」の第8章 プログラム機能、8-1 ページにある 「1.プログラムの作成から実行までの流れ」 を参照してください。

fx-9860GII の取扱説明書は、製品に添付されているCDに PDF ファイルとしてあります。または、カシオのサイトからダウンロードできます。
 ⇒ fx-9860GII_Soft_J.pdf

fx-9860GII で入力するコマンドは、複数のメニューに分散していて、最初は探すのに苦労します。fx-5800P のようにスッキリとまとまっていないので、なんとかして欲しいと思います。

- ClrGraph の入力
[SHIFT] [VARS] (PRGM) [F6] (▷) [F1] (DLR) [F2] (Grph)


- LabelOff の入力
[SHIFT] [MENU] (SET UP) [F5] (LABL) [F2] (Off) 


- For / To / Step / Next の入力
[SHIFT] [VARS] [F1] (COM) [F6] (▷) 
とすると、[F1][F4] にそれぞれ、ForToStepNext が割り当てられている。


- Horizontal の入力
[SHIFT] [F4] (Skeych) [F6] (▷) [F5] (Hztl)



コマンド類は、おおよそ以下の場所に分散しています;

- プログラムの制御に関するもの:
[SHIFT] [VARS] から下位のメニュー

- グラフ機能(グラフィックス機能) の描画に関するもの;
[SHIFT] [F4] (Sketch) から下位のメニュー

-グラフ機能(グラフィックス機能)の設定に関するもの;
[SHIFT] [MENU] (SET UP) から下位のメニュー

- ViewWindowの設定に関するもの;
[SHIFT] [F3] (V-Window) から下位のメニュー


上記のプログラムは、グラフィックスエリアを塗りつぶしています。同様にエリアを塗りつぶすために、PxlOn コマンドでピクセルを順に塗りつぶすプログラムは以下になります。

ClrGraph
For 1→A To 63
For 1→B To 127
PxlOn A,B
Next
Next

(物理座標系)

描画速度を比較すると、Horizontal コマンドを用いる方が、圧倒的に速いことが分かります。



今回のまとめ
  • fx-9860GII のLCDは 128 x 64 ピクセル
  • fx-9860GII のグラフィックス描画エリアは 127 x 63 ピクセル
  • fx-9860GII は3つの座標系を使い分ける
    • デフォルトの論理座標系: LDC中央が原点、1dot = 0.1 で固定
    • ViewWindow座標系: 自由に設定可能な座標系
    • 物理座標系: LCDピクセルを直接指定する座標系、1 dot = 1、整数指定
  • グラフィックス コマンドにより描画速度が大きく異なる

今回使ったグラフィックス コマンド
  • ViewWindow
  • ClrGraph
  • Horizontal
  • PxlOn





つづく...

Casio Basic入門G02 / 目次




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

人気ブログランキングへ









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

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


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

Casio Basic入門G02

Casio Basic入門
<目次>

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

訂正 2015/07/29
訂正 2017/09/25



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


前回: Casio Basic入門G01


Chapter G02
グラフィックス画面の設定と描画

Casio Basic でグラフィックスを描画するには、グラフ描画を主目的に考えられている fx-9860GII の特徴を理解しておくと、その後の理解が楽になるので、前回は Casio Basic でのグラフィックス描画エリアがLCDの全エリアでないこと、3種類の座標系(デフォルトの論理座標系、ViewWindow 座標系、物理座標系)を使えることを紹介しました。

今回は、fx-9860GII の特徴をさらに調べながら、グラフィックス コマンドを使ってみます。


グラフィックス画面とテキスト画面

fx-9860GII の Casio Basic では、グラフィックス コマンドで描画を行うグラフィックス画面と、テキスト出力コマンドで表示されるテキスト画面があって、グラフィックス コマンドとテキスト出力コマンドは、1つの画面に一緒に出力できないようになっています。また、グラフィックス画面やテキスト画面は、それぞれ1枚づつしかなく、全てのCasio Basic プログラムで共用されます。
  • fx-5800P では、出力命令 " " と Locate コマンドで画面出力しますが、これらはテキスト画面へ出力します。fx-9860GII でもこれらの命令・コマンドが使えますが、同様にテキスト画面へ出力します。
  • グラフィックス コマンドとテキスト出力は、これら2つの画面を切り替えて表示が行われます。詳しくは次回以降で紹介します。


グラフィックス消去コマンド

グラフィックス画面の消去は、ClrGraph Cls コマンドで行います。

fx-5800P と fx-9860GII の画面消去コマンドをを整理しておきます。共通して使える Cls は、画面消去コマンドです。

Casio Basic の画面消去コマンド [2015/07/29 訂正]
コマンドfx-5800Pfx-9860GII
Cls画面消去(テキスト画面のみ)グラフィックス画面の消去
(座標系の変更は行わない)
ClrTextなしテキスト画面の消去
ClrGraphなしグラフィックス画面の消去と座標系をクリアして論理座標系へ戻す
  • fx-9860GII では、グラフィックス描画のためには、専用のグラフィックス画面が使われます。
  • fx-5800P と共通して使える出力命令 " "Locate コマンドは、テキスト画面に表示され、グラフィックス画面への表示はできません。
  • fx-5800P の Cls コマンドは、fx-9860GII の ClrText と同じ動作です。
グラフィックス画面に描画された状態は、ClrGraph を実行しない限り残っています。1つのプログラムでグラフィックス描画を行い、ClrGraph で消去しないでおくと、プログラムで ClrGraph しないと、その残った画面の上にグラフィックス描画が行われる仕様です。

従って、プログラムの最初か最後に ClrGraph を実行しておくのが望ましいでしょう。

fx-9860GII での Cls 入力方法
[SHIFT] [F1] (Cls)

fx-9860GII での ClrText 入力方法
[SHIFT] [VARS] (PRGM) [F6] (▷) [F1] (CLR) [F1] (Text)

fx-9860GII での ClrGraph 入力方法
[SHIFT] [VARS] (PRGM) [F6] (▷) [F1] (CLR) [F2] (Grph)


サンプルプログラム 1

ちょっと実験してみます。以下の2つのプログラムを入力して、先にプログラム H を実行し、その後プログラム V を実行してください。

ファイル名: H (水平線を描く)
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
Horizontal 0


ファイル名: V (垂直線を描く)
Vertical 0


※ プログラム HCoordOffGrifOffAxesOffLablelOff を入力する方法は、下の グラフ設定コマンド にあります。
Horizontal の入力方法
  [SHIFT] [F4] (Sketch) [F6] (▷) [F5] (Hztl)
Vertical の入力方法
  [SHIFT] [F4] (Sketch) [F6] (▷) [F4] (Vert)

プログラム H を実行すると、グラフィックス画面に水平線が描かれますが、最後に ClrGraph が実行されていないので、グラフィックス画面には水平線が残ったままです。次に、プログラム V を実行すると、垂直前のみを描くにもかかわらず、画面には水平線と垂直線の両方が描かれています。グラフィックス画面上の描画は、ClirGraph や Cls が実行されない限り、残っていることが確かめられました。

さらに、グラフィックス画面はプログラムごとに別に用意されるのではなく、共通して全てのプログラムで使われることも確認できました。

ところで、プログラム H と V では、座標系の指定を行っていませんが、ClrGraph を実行しています。ClrGraph により座標系がクリアされて論理座標系に設定されていることが、分かると思います。[2015/07/08 修正] 座標系については、Casio Basic入門G01 を参照してください。



グラフ設定コマンド

fx-9860GII には、4種類のグラフ設定コマンドがあります。

1) CoordOn / CoordOff : カーソル位置の座標値出力を On / Off する
この設定コマンドは、Plot コマンドで入力待ちになっている時に有効となる。座標値出力領域にはグラフィックス描画されない。詳しくは次回以降で紹介する。

この設定は、プログラムとは関係無く保存され、1つのプログラムで On にすると、それ以降実行するプログラムでも On の設定が生きている。従って、プログラムごとに 設定するのが望ましい。

fx-9860GII での CoordOn 入力方法
[SHIFT] [MENU] (SET UP) [F2] (COOR) [F1] (On)

fx-9860GII での CoordOff 入力方法
[SHIFT] [MENU] (SET UP) [F2] (COOR) [F2] (Off)


2) GridOn / GridOff : グリッドの表示を On / Off する
この設定コマンドは、グリッド表示を On / Off する。グリッド表示の上にグラフィックスが描画されるので、画面の背景だと思うと分かりやすい。

この設定は、プログラムとは関係無く保存され、1つのプログラムで On にすると、それ以降実行するプログラムでも On の設定が生きている。従って、プログラムごとに 設定するのが望ましい。

fx-9860GII での GridOn 入力方法
[SHIFT] [MENU] (SET UP) [F3] (GRID) [F1] (On)

fx-9860GII での GridOff 入力方法
[SHIFT] [MENU] (SET UP) [F3] (GRID) [F2] (Off)


3) AxesOn / AxesOff : 座標軸の表示を On / Off する
この設定コマンドは、座標軸表示を On / Off する。座標軸表示の上にグラフィックスが描画されるので、画面の背景だと思うと分かりやすい。

この設定は、プログラムとは関係無く保存され、1つのプログラムで On にすると、それ以降実行するプログラムでも On の設定が生きている。従って、プログラムごとに 設定するのが望ましい。

fx-9860GII での AxesOn 入力方法
[SHIFT] [MENU] (SET UP) [F4] (AXES) [F1] (On)

fx-9860GII での AxesOff 入力方法
[SHIFT] [MENU] (SET UP) [F4] (AXES) [F2] (Off)


4) LabelOn / LabelOff : 座標軸の X、Y ラベル表示を On / Off する
この設定コマンドは、X座標とY座標を示す X, Y ラベル表示を On / Off する。ラベル表示の上にグラフィックスが描画されるので、画面の背景だおt思うと分かりやすい。

この設定は、プログラムとは関係無く保存され、1つのプログラムで On にすると、それ以降実行するプログラムでも On の設定が生きている。従って、プログラムごとに 設定するのが望ましい。

fx-9860GII での LabelOn 入力方法
[SHIFT] [MENU] (SET UP) [F5] (LABL) [F1] (On)

fx-9860GII での LabelOff 入力方法
[SHIFT] [MENU] (SET UP) [F5] (LABL) [F2] (Off)


実際の表示例を示すと以下のようになります。

座標描画 w/o Grid 
GridOff (グリッドなし)、AxesOn (座標軸あり)、LabelOn (ラベルあり) を設定した時のグラフィックス画面

座標描画 w/ Grid 
GridOn (グリッドあり)、AxesOn (座標軸あり)、LabelOn (ラベルあり) を設定した時のグラフィックス画面

この2つの画面を見比べると、座標軸の目盛りとグリッドの点が共用されていることが分かります。面白いアイデアですね。

なお、4つの設定全てを Off にすると、グラフィックス画面の背景は何もなくなります。


サンプルプログラム 2

次のような表示を作ってみます。

PlotOn 2,2 

(x, y) = (2, 2) の座標に点が1つあります。
  • 最初に グラフィックス画面を消去します。
  • 次に、座標軸とラベルの表示を On にします。
  • 最後に、PlotOn コマンドで、座標 (x, y) = (2, 2) に点を表示します。
PlotOn の書式
PlotOn x,y
現在の座標系(論理座標系か ViewWindow座標系)で、座標 (x, y) に点を描画する。

PlotOn の入力方法
[SHIFT] [F4] (Sketch) [F6] (▷) [F1] (PLOT) [F2] (Pl・On}

以下を入力して実行してみてください。上の写真のようになりますか?

ClrGraph
CoordOn
GridOn
AxesOn
LabelOn
PlotOn 2,2


ViewWindowで座標系を指定しなければ、ClrGraph により論理座標系が適用されています。



画面塗りつぶしプログラム

グラフィックス領域の半分を塗りつぶすプログラムを4通りの方法で作ってみます。

MarkOut Half 

ファイル名: MARKOUT1
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 31
For 0→X To 126
PlotOn X,Y
Next
Next


プログラムの説明
・グラフィックス画面の消去

・4つのグラフ設定:
 全て Off にする

ViewWindow 座標系設定:
 グラフィックス画面左下隅を原点 (0, 0) とし、
 右下隅のピクセルの座標を (126, 0)、
 右上隅のピクセルの座標を (126, 62) とする。  

・ピクセルの描画: PlotOn を使う
 ピクセルを左から右へ、そして下から上へ順に表示してゆく。
 ここで For 文を使っています。
 ⇒ CasioBasic コマンドリファレンス - For 文

プログラムの実行
結構な時間がかかります。fx-9860GII のグラフィックスは処理が遅いことが分かります。

プログラムのダウンロード
 ⇒ MarkOut1
 ⇒ ダウンロードしたファイルを fx-9860GII へ転送する方法

==========


次に、水平線を下から上へ順に描画する方法を試します。

ファイル名: MARKOUT2
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 31
Horizontal Y
Next


プログラムの説明
・グラフィックス画面の消去

・4つのグラフ設定:
 全て Off にする

ViewWindow 座標系設定:
 グラフィックス画面左下隅を原点 (0, 0) とし、
 右下隅のピクセルの座標を (126, 0)、
 右上隅のピクセルの座標を (126, 62) とする。  

--- ここまでは、MARKOUT1 と同じ ---

・水平線の描画: Horizontal を使う
 水平線を下から上へ順に表示してゆく。

 Horizontal の書式
 Horizontal y
 現在の座標系で、縦軸の y 座標の位置に水平線を描画する。

 Horizontal の入力方法
 [SHIFT] [F4] (Sketch) [F6] (▷) [F5] (Hztl)

プログラムの実行
MARKOUT に比べて、かなり高速化されました。

プログラムのダウンロード
 ⇒ MarkOut2
 ⇒ ダウンロードしたファイルを fx-9860GII へ転送する方法

==========


今度は、左端から右端までの直線を下から上へ順に描画する方法を試します。

ファイル名: MARKOUT3
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 31
F-Line 0,Y,126,Y
Next


プログラムの説明
・グラフィックス画面の消去

・4つのグラフ設定:
 全て Off にする

ViewWindow 座標系設定:
 グラフィックス画面左下隅を原点 (0, 0) とし、
 右下隅のピクセルの座標を (126, 0)、
 右上隅のピクセルの座標を (126, 62) とする。  

--- ここまでは、MARKOUT1 / MARKOUT2 と同じ ---

・直線の描画: F-Line を使う
 左端から右端までの直線を下から上へ順に表示してゆく。

 F-Line の書式
 F-Line x1,y1,x2,y2
 現在の座標系で、起点座標 (x1, y1) から終点座標 (x2, y2) まで直線を描画する。

 F-Line の入力方法
 [SHIFT] [F4] (Sketch) [F6] (▷) [F2] (LINE) [F2] (F-Line)

プログラムの実行
MARKOUT2 と同じ描画時間でした。

プログラムのダウンロード
 ⇒ MarkOut3
 ⇒ ダウンロードしたファイルを fx-9860GII へ転送する方法

==========


最後に、太い水平線を下から上へ順に描画する方法を試します。

ファイル名: MARKOUT4
ClrGraph
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 31 Step 2    
[2017/09/25 修正: Step 2 が抜けていたのを追加]
SketchThick Horizontal Y
Next


プログラムの説明
・グラフィックス画面の消去

・4つのグラフ設定:
 全て Off にする

ViewWindow 座標系設定:
 グラフィックス画面左下隅を原点 (0, 0) とし、
 右下隅のピクセルの座標を (126, 0)、
 右上隅のピクセルの座標を (126, 62) とする。  

--- ここまでは、MARKOUT1 / MARKOUT2 / MARKOUT3 と同じ ---

・太い水平線の描画: Sketch Horizontal を使う
 太い水平線を下から上へ順に表示してゆく。

 SketchThick の書式
 SketchThick [線や円の描画コマンド]
 線や円の描画を、太線で実行する。
 ここで、使える 線や円の描画コマンドは、
 ・ LineF-LineHorizontalVerticalCircle がある。

 線の描画に Horizontal を適用すると、
 SketchThick Horizontal y となって、ピクセル2つの太さで水平線を描画する。

 SketchThick の入力方法
 [SHIFT] [F4] (Sketch) [F6] (▷) [F6] (▷) [F5] (STYL)

プログラムの実行
MARKOUT2 や MARKOUT3 よりも、さらに高速化されました。

プログラムのダウンロード
 ⇒ MarkOut4
 ⇒ ダウンロードしたファイルを fx-9860GII へ転送する方法

==========


Casio Basic のグラフィックス描画も、場合によってはかなり高速になることが分かりました。

グラフィックス コマンドによる描画時間の違い
プログラム ファイル名コマンド描画時間
MARKOUT1PlotOn x,y203.5秒
MARKOUT2Horizontal y2.0秒
MARKOUT3F-Line x1,y1,x2,y22.0秒
MARKOUT4SketchThick Horizontal y1.3秒




グラフィックス描画のしくみ - 描画時間を決める要素

グラフィックスデータは、マイクロブロセッサにより、VRAMと呼ばれるメモリ(領域)に送られます。次に、VRAM のデータが液晶ディスプレイ (LCD)へ転送されてグラフィックスが表示されます。

PlotOn コマンドが実行される時は、ピクセル1個の描画データが VRAM へ書き込まれるたびに、そのデータが LCD へ転送されます。

fx-9860GII では、この転送速度が遅く、従ってMARKOUT1 プログラムの実行に時間がかかるわけです。実行されている時、実際にピクセルが1個づつ描画されるのが見えます。

次に、Horizontal コマンドで水平線を1本づつ描画する時は、水平線1本分の描画データが VRAM に送られると、そのデータがまとめて LCD へ転送されます。時間がかかる転送動作が少なくて済むので、それだけ描画が速くなります。

3つめの、F-LINE コマンドで直線を1本づつ描画する場合も、水平線の時と同様に、直線1本分のデータが VRAM に送られ、それがまとめて LCD へ転送されるので、Horizontal と同じ時間がかかるわけです。

最後のプログラム例では太い水平線を描画していますが、水平線2本分の描画データが、まとめて LCD に転送されるため、さらに描画が速くなるのがわかります。

MARKOUT1 では、127 x 32 = 4064 ピクセルを描画する時、1ピクセルごとに LCD転送するので、転送回数は 4064回。
MARKOUT2 では、直線1本ごとに LCD転送するので、転送回数は 32回。
MARKOUT3 でも、水平線1本ごとにLCD転送するので、転送回数は 32回。
MARKOUT4 では、水平線2本ごとにLCD転送するので、転送回数は 16回。

そこで、描画時間を LCD 転送回数で割ってみると (T / F) 下表のようになり、数十ミリ秒のオーダーでほぼ同じくらいになっています。但し、転送回数が少なければ、1回の転送データが大きくなるので、T / F が下へゆくほど大きくなるのは理解できて、10~20ミリ秒の違いは、VRAM へのブロック転送の時間の違いだと考えれば、納得できる範囲です。

LCD 転送1回あたりの描画時間 [fx-9860GII USB POWER GRAPHIC 2]
プログラム ファイル名描画時間 / TLCDへの転送回数 / FT / F
MARKOUT1203.5秒4064回0.05
MARKOUT22.0秒32回0.06
MARKOUT32.0秒32回0.06秒
MARKOUT41.3秒16回0.08

==========


さて、Casio Basic で作った MARKOUTx と同様のプログラムを Casio SDK を使ってC言語でアドインを作ってみました。

 ⇒ アドインのダウンロード: markout3.zip 

ダウンロードした圧縮ファイルに、含まれる markout3.g1a がアドインファイルです。これを fx-9860GII に添付されているPCリンクソフト FA-124 Ver 2.04 を使って fx-9860GII へ転送します。詳しい操作は、FA-124 Ver 2.04 の取扱説明書をご参照ください。

add-in icon markout3 
[MENU] (MAIN MENU) から [MArK 3] アイコン を選び [EXE] キーで起動すると、

add-in startup markout3 
F1: MarkOut Dot
F2: MarkOut Line
F3: MarkOut Thick Line


と表示されます。

[F1] は、ピクセルごとに、順に LCD へ転送して描画します。
[F2] は、水平な線ごとに、順に LCD へ転送して描画します。
[F3] は、水平な線を2本ごとに、順に LCD へ転送して描画します。

add-in result markout3 
画面の下半分を塗りつぶしたとことで、所要時間を表示します。


その結果は、Casio Basic と同じ傾向になります(速度自体は圧倒的に速いのですが...)。同じ傾向を示すので、グラフィックス描画コマンドによる速度の違いは、LCD転送の回数の違いであることが確かめられました。Casio Basic と Add-In のC言語の言語の違いはあっても、LCD へのデータ転送がグラフィックス描画の処理速度を決めているわけです。

グラフィックス描画を速くしたい時は、LCD への転送回数を減らす工夫がポイントになることが分かります。



今回のまとめ

グラフィックス画面
  • グラフィックス コマンドの出力のためのグラフィックス画面とテキスト出力のためのテキスト画面があって、これらは別のもの。
  • グラフィックス コマンドとテキスト出力を1つの画面で行うことはできない。
  • グラフィックス画面は、全てのプログラムで共用される。
グラフィックス画面消去
  • グラフィックス画面消去には、ClrGraph コマンドを使う。
  • グラフィックス画面上の描画は、ClrText や Cls を実行しない限り、残っている。
デフォルト座標系
  • 座標系を指定しなければ、論理座標系が使われる。
グラフ設定コマンド
  • グラフ設定コマンドで、座標軸、グリッド、X, Y ラベル をグラフィックス画面の背景として On / Off する。
  • 座標値表示 On / Off は、Plot コマンドが入力待ちの時に有効になる(Plot コマンドと密接な関係)。
グラフィックの描画速度がコマンドによって異なる
  • fx-9860GII でも、コマンドによっては高速なグラフィックス出力が可能な場合がある。
  • グラフィックス描画データは、一旦VRAMへ送られ、さらにLCDへ転送されて描画が行われる。
  • グラフィクス描画は、主にLCD転送速度で決まる。
  • グラフィックス描画を速くするには、LCD転送回数を減らす工夫が有効になる。


今回使ったグラフィックス コマンド
  • ClrGraph
  • Horizontal
  • Vertical
  • CoordOn / CoordOff
  • GridOn / GridOff
  • AxesOn / AxesOff
  • LabelOn / LabelOff
  • ViewWindow
  • PlotOn
  • F-Line
  • SketchThick




つづく...

Casio Basic入門G03 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ







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

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


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

Casio Basic入門49

Casio Basic入門
<目次>

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

2015/04/17
修正 2017/08/16

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

Chapter 8 - 初級

前回: Casio Basic入門48 を見る


◆ Chapter 7 の目標: Basic コマンドを使ってみる

前回で、fx-9860GII 専用入力ボックスの準備が整いました。今回は、残りの移植作業を進めます。

移植前の fx-5800P 用プログラムを再掲載します。変更する部分を赤文字で示しています。

fx-5800P:温度換算プログラム TEMP CONV
0→A
While 1


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
K=73⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd
While Getkey
WileEnd
IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"



新世代 Casio Basic は fx-5800P だけでなく、他のグラフ関数電卓にも搭載されています。そこで、今回は fx-5800P 用に作った温度換算プログラムを fx-9860GII に移植することにします。

Chapter 8-8
fx-9860GII へプログラムを移植する


新世代 Casio Basic は、機種間の互換性は高いのですが、移植するにあたって、幾つかの制限があります。

fx-5800P から fx-9860GII への移植時に互換性の無いもの

出力" "(出力命令詳細動作がかなり異なる
(出力)命令fx-9860GII では -DISP- 表示にブロックされる
Cls コマンドfx-9860GII では ClrText コマンドに置き換える
入力(入力)命令fx-9860GII では ?A と言う記法が使えない
Getkey コマンドキーコードが全く異なる
変数配列変数fx-9860GII では 配列変数が無い
行列記法が異なる
その他キー同じキーが必ずしも無い
関数記法が異なることがある
プログラム名fx-9860GII では 8文字以下

" " (出力)命令は、表示行の全てを上書きします。同じ行に 先に Locate コマンドで表示してあると、それを上書き消去してしまいます。表示行を " " 命令だけで表示する場合のみ、互換性があります。

(出力)命令
-DISP- と言う表示で1行占有される。先にLocate コマンドで表示された1行が -DISP- で完全に上書きされ、画面設計が潰されます。

?(入力)命令
?A と言う記法が使えず、?→A のみが使えます。?A と書くと、変数 A に入っている値を表示した上で、そのままで良ければ[EXE] で確定できる付加機能が得られ、使いやすいプログラムが作れます。fx-9860GII ではこの機能を使えず、?→A を書くしかありません。

Cls
fx-9860GII では ClrText と書き換えます。機能は全く同じなので書き換えるだけで使えます。
[2017/08/16 修正] fx-9860GII の Cls は グラフィックス画面の消去のみを行います。というのも、グラフィックス画面の消去コマンドには ClrGraph もありますが、これは同時に座標系をデフォルトの論理座標系に変更します。Cls は座標系の変更は行わずにグラフィックス画面の消去のみを実行します。

Getkey
キーコードが全く異なるので、キーコードを変更します。Getkeyコマンド自体の動作は全く同じです。

配列変数
fx-9860GII には無いので、行列に置き換えれば使えます。

行列
扱う際の書式が一部異なるので、そこを修正すれば使えます。

キー
同じキーが無いことがあります。

関数
関数の記法が一部異なります。

ファイル名
fx-5800P は12文字以内、fx-9860GII は 8文字以内。


旧来の命令は、Basicコマンドほど互換性が高くなく、どうやっても同じ動作を実現できないことがあります。詳しくは、下記を参照してください。
 ⇒ fx-9860GIi への移植 - 厄介な旧来の命令
 ⇒ fx-9860GII への移植 - 素因数分解
 ⇒ fx-9860GII への移植 - ピタゴラス数

一方、Basic コマンドは、適切な変更を行えば、100%の移植が可能です。


温度換算プログラム TEMP CONV について言えば、

 ・ Getkey使用の際して、キーコードを変更する。
 ・ ClsClrText に変更する。
 ・[FMLA] キーが無いので、他のキーに変更する。
 ・ ファイル名 TEMP CONV を8文字以内に変更する。

先ずはこの程度の変更で、同じ動作を行うプログラムとして移植できます。上のプログラムコードで赤文字で示した部分が、移植に際して変更が必要です。

なお、Chapter 7 で作ったプログラムは、?命令の機能が異なるので、100%同じ動作をさせる移植は不可能です。fx-9860GII などのグラフ関数電卓への将来の移植を考える場合は、旧来の命令はできるだけ使うべきではありません。



キーコードの変更

TEMP CONV で使うキーコードについて、fx-5800P と fx-9860GII の違いをまとめます。

キーコード
キーfx-5800Pfx-9860GII
[1]3572
[2]3662
[3]3752
[EXIT]7347
[FMLA]74---
[VARS]---58

計算式を表示させるためにfx-5800P では [FMLA] キーを利用しましたが、fx-9860GII にはこのキーは無いので、変わりに [VARS] キーを使うことにします。

TC10-9860GII 

[VARS] キーは [EXIT] キーの左上にあって、互いに近いので、使いやすいと思います。


Cls → ClrText の変更

単に書き換えるだけでOK.。


ファイル名の変更

TEMP CONV は9文字なので、8文字以内にするためにスペースを取って TEMPCONV に変更する。



以上の変更を反映させると、以下のプログラムになります。

fx-9860GII:温度換算プログラム TEMPCONV
0→A
While 1


ClrText
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<VARS>"

-1→M
Do
Getkey→L
LpWhile L=0
L=72⇒1→M
L=62⇒2→M
L=52⇒3→M
L=58⇒4→M
K=47⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
ClrText
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠47
WhileEnd
While Getkey
WileEnd
IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"




これを実行してみます。

fx-9860GII の電源を入れ、[MENU] キーで MAIN MENU 画面を表示;

TC10-MainManu_1 

矢印キーで PRGM アイコンを選択;

TC10-MainMenu_2 

そして [EXE] キーを押すと Program List が表示されます。

ProgramList 

矢印キーでカーソルを移動させ、TEMPCONV を選択

TC10-ProgramList 

[EXE] キーか [F1] (EXE) を押すと、プログラムが起動します。

TC10-Main 

なんだか間の抜けた感じですね。後で、それらしくなるように表示を変更することにします。先ずは動作確認をします。

[1] キーで、入力ボックス起動

TC10-[1] 

摂氏 -40 を入力し、

TC10-Input-40 

[EXE] で入力確定すると、換算結果が表示されます。

TC10-Converted 

換算は正常のようですね。では、[VARS] キーを押して計算式を表示させてみます。

TC10-Dormula_1 

では、[EXIT] キーでメイン画面へ戻ります。念のため、[EXIT] キーを押っ放しにしてみてください。

何も画面変化がなければ正常です。では [EXIT] キーを離してみると、

TC10-Converted 

メイン画面に戻りました。

プログラムを終了させるために、[EXIT] キーを押すと、

TC10-Quit_Bye 

正常終了の画面が現れます。ここで、[EXIT][AC][EXE] のいずれのキーを押しても、Program List 画面に戻ります。

TC10-ProgramList 


これで、機能面では正常であることが確認できました。



さて、間抜けな感じの表示をなんとかしたいと思います。

fx-9860GII 用の画面をどのようにするかは、それぞれ好みがあると思いますが、ここでは以下のような画面にしようと思います。

TC10-Main_2 

TC10-Formula\2 

TC10-Quit_Bye_2 

先ずは、画面表示変更に挑戦してみてください。次回は、この画面に変更する方法を紹介します。







つづく...

Casio Basic入門50 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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




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

Casio Basic入門48

Casio Basic入門
<目次>

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

2015/04/10
修正 2017/08/16

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

Chapter 8 - 初級

前回: Casio Basic入門47 を見る


◆ Chapter 8 の目標: Basic コマンドを使ってみる

fx-5800P 用に 温度換算プログラムを作りました。

fx-5800P:温度換算プログラム TEMP CONV
0→A
While 1


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
K=73⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd
While Getkey
WileEnd
IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"


fx-9860GII への移植で変更するところを赤文字で示しています。



Chapter 8-7
fx-9860GII 用入力ボックスを準備する

新世代 Casio Basic は fx-5800P だけでなく、他のグラフ関数電卓にも搭載されています。そこで、fx-5800P 用に作った温度換算プログラムを fx-9860GII に移植してみます。

新世代 Casio Basic は、機種間の互換性は高いのですが、移植するにあたって、幾つかの制限があります。

fx-5800P から fx-9860GII への移植時に互換性の無いもの

出力" "(出力命令詳細動作がかなり異なる
(出力)命令fx-9860GII では -DISP- 表示にブロックされる
Cls コマンドfx-9860GII では ClrText コマンドに置き換える
入力(入力)命令fx-9860GII では ?A と言う記法が使えない
Getkey コマンドキーコードが全く異なる
変数配列変数fx-9860GII では 配列変数が無い
行列記法が異なる
その他キー同じキーが必ずしも無い
関数記法が異なることがある
プログラム名fx-9860GII では 8文字以下

" " (出力)命令は、表示行の全てを上書きします。同じ行に 先に Locate コマンドで表示してあると、それを上書き消去してしまいます。表示行を " " 命令だけで表示する場合のみ、互換性があります。

(出力)命令
-DISPー と言う表示で1行占有れ、Locate コマンドによる画面設計を潰されます。

?(入力)命令
?A と言う記法が使えず、?→A のみが使えます。

Cls
fx-9860GII では ClrText と書き換えます。機能は全く同じなので書き換えるだけで使えます。
[2017/08/16 修正] fx-9860GII での Cls はグラフィックス画面の消去のみを行います。ちなみに ClrGraph もグラフィック画面の消去ですが、画面消去と同時に座標系を デフォルトに論理座標系に戻します。これに対して Cls は座標系は変更せずグラフィックス画面の消去のみを実行します。

Getkey
キーコードが全く異なるので、キーコードを変更します。Getkeyコマンド自体の動作は全く同じです。

配列変数
fx-9860GII には無いので、行列に置き換えれば使えます。

行列
扱う際の書式が一部異なるので、そこを修正すれば使えます。

キー
同じキーが無いことがあります。

関数
関数の記法が一部異なります。

ファイル名
fx-5800P は12文字以内、fx-9860GII は 8文字以内。


旧来の命令は、互換性が低く、移植時に思わぬ仕様違いから混乱するかも知れません。旧来の命令を使う限り、どうしても fx-5800P と同じ動作を実現できないこともあります。詳しくは、下記を参照してください。
 ⇒ fx-9860GIi への移植 - 厄介な旧来の命令
 ⇒ fx-9860GII への移植 - 素因数分解
 ⇒ fx-9860GII への移植 - ピタゴラス数

一方、Basic コマンドは、適切な変更を行えば、100%の移植が可能です。

さて、温度換算プログラム TEMP CONV では、e-Gadget オリジナルの入力ボックスを利用しています。先ずは、fx-5800P 用の入力ボックスではなくて、fx-9860GII を利用する必要がありまず。

今回は、その準備をします。



fx-5800P から fx-9860GII への入力ボックスの移植は、以下で紹介しています。
 ⇒ Casio Basic入門37

また、プログラムライブラリにも収録しています。
 ⇒ fx-9860GII プログラムライブラリ - 入力ボックス
 
fx-9860GII は、パソコンとのリンクができる点が、fx-5800P よりも便利な利点です。fx-9860GII をパソコンと繋ぎ、Casio Basic プログラムを 拡張子 g1m のファイルとして、パソコンに転送できますし、その逆もできます。

上記のプログラムライブラリから、入力ボックスをパソコンにダウンロードしてから、fx-9860GII へ転送できるので、自分で入力する必要はなく、入力間違いの危険性もありません。

今回の温度換算プログラムでは、IN 2.1G for fx-9860GII を使います。これをダウンロードしてください。プログラム名 IN です。

プログラム名は、fx-5800P と同じなので、入力ボックスが fx-9860GII に有れば、温度変換プログラムで 入力ボックスを使う部分は、変更なしで動作します。

念のために、以下のテストプログラムを入力して、転送した入力ボックス IN 2.1G for fx-9860GII の動作確認をしてみてください。

プログラム TEST
0→Z
"1:"
"2:"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
L=72⇒1→M
L=62⇒2→M

Locate 1,4,"           " 
(スペース21個)

If M=1:Then
3→X:1→Y:10→D:2→E
Prog "IN"
Else If M=2
Then
3→X:2→Y:9→D:1→E
IfEnd:IfEnd

Locate 1,4,"Z="
Locate 3,4,Z

WhileEnd


==========

正しく動作しますか?

fx-9860GII はCPUが速いので、より快適に入力ボックスを使えます。



さて、冒頭に記載したプログラムで、赤文字で示した部分が、fx-9860GII への移植の際に変更が必要なところです。

 ・ Getkey使用に際して、キーコードを変更する。
 ・ ClsClrText に変更する。
 ・[FMLA] キーが無いので、他のキーに変更する。
 ・ ファイル名 TEMP CONV を8文字以内に変更する。

これだけで、同じ動作を行うプログラムとして移植できます。

次回までに、移植を試してみてください。それほど難しくないと思います。




つづく...

Casio Basic入門49 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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




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

Casio Basic入門1

Casio Basic入門
<目次>

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


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

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

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

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

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

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

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

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

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



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

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

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

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

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

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

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


プログラミング言語仕様から読み解く Casio Basicの開発史

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

プログラム関数電卓 fx-4000番台の製品に搭載された言語は、使いにくく、中途半端な仕様のまま成功せずに終わったと感じています。私見ですが、fx-4000番台では、2行表示の液晶ディスプレイを使って構造化プログラミングを実現しようとして、うまくいかなかったのではないかと、その跡が感じられます。

一方で、グラフ関数電卓での搭載言語は着実な進化を見せました。fx-7400シリーズでは、一応 構造化Basic といえる形にまで進化しました。そして、2005年に登場した CFX-9580GC PLUS の Casio Basic では、ついに GetkeyLocate コマンドが搭載され、現在の世代のCasio Basic に近づきました。但し制御構文の改行ができないので、もう一歩という感じです。しかし、これは Casio Basic の歴史上極めて重要な一歩だと言って良いと思います。GetkeyLocate が、Casio Basic の実用性を格段に向上させているからです。

翌年の 2006年に登場した fx-5800P は、基本的に CFX-9850GC PLUS の Casio Basic をベースに制御構文の改行を許すように改造され、さらにグラフィックス関連とI/O関連のコマンドを取り去り、あとはほぼ同じ構成で実装して、さらに使いやすく進化しました。

代表的な改良点を挙げてみます。

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

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

CFX-9850GC PLUS にあった グラフィックス関連とI/O関連のコマンドは、fx-5800P にはありません。fx-5800P をプログラム関数電卓に位置づけるなら、グラフィックス関連のコマンドは不要といっても良いと思いまが、I/O関連コマンドは残して欲しかったと思います。結果的に、fx-5800P の最大にして唯一の弱点はI/O関連だと思います。電卓とPCの間で、プログラムファイルをやりとりするPCリンク機能が無いのも fx-5800P の利便性を発揮しきれない仕様上の大きな弱点です。

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

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

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

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

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

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

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

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

[2017/07/02 追記]:fx-CG50 が欧米で販売開始
2017年春に fx-CG10/20 の後継機として fx-CG50 が欧米で発売開始されました。残念ながら日本国内では発売開始の情報はありません。fx-CG50 は fx-CG10/20 とほぼ同じ仕様で、アドインプログラムも使え、さらに処理速度が1.5倍程度速くなっているようです。そのデザインは fx-JP900 と極めて似通ったものになっています。アメリカで fx-CG10 PRIZM が発売されてから1年後に 日本で fx-CG20 として発売開始されたので、fx-CG50 の国内販売が行われるとしても1年程度遅れる可能性がありそうです。

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

カシオは、プログラム電卓については欧米ならびに中国市場を中心に考えているののが残念なところですが、シャープがプログラム電卓開発から事実上撤退している状況で、日本企業として唯一カシオがプログラム電卓の開発を続けていることは、歓迎したいと思います。

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

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




fx-5800Pの特徴

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

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

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

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

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

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


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

My ProgCalcs 20170806 
※ 管理人所有のプログラム電卓


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

カシオプログラム関数電卓 FX-5800P-Nカシオプログラム関数電卓 FX-5800P-N
(2006/09/22)
CASIO(カシオ)

商品詳細を見る


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

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

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

Webinarの一例

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

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



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

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


プログラムって何だ?

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

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

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

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



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

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

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

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


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

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

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

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

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



プログラムで計算

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

1234 x 5678

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

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

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

A = 1234
B = 5678

としておいて、

C = A x B
Print C


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

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

1234→A
5678→B
AxB→C


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


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

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

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

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

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

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

例えば、

1234→A
5678→B
A→B


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

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

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

A = 1234

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



4) は出力命令

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

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

AxB

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

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


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

?→A

と書くと、画面表示が、

?

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

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

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

?

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

9999÷3

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

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

"A="?→A

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

A= ?

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

"A="?→A
5678→B
AxB


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

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


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

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

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

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


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



*****


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


つづく...

⇒ CasioBasic入門2 / 目次



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



  


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

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

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

Casio Basic入門54

Casio Basic入門
<目次>

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

修正 2016/07/18
追記: 2017/07/02


 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
(LK4)+(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+3+2×(I≥3),Y,1x107+1x104×V+W
Locate X+0,Y,1x104×D+W
Locate X+K-2+(I≥3),Y,","
Locate X+K-6+(I≥3),Y,","
I≥3⇒Locate X+1,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 [L: 元の桁数]
(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桁区切り無しで見づらいが数値が表示されます。

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

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+1x104×V+U
I≥1⇒Locate X+K-2-(I=1),Y,","
I≥2⇒Locate X+K-6,Y,","
Else
Locate X+3+2×(I≥3),Y,1x107+1x104×V+W
Locate X+0,Y,1x104×D+W
Locate X+K-2+(I≥3),Y,","
Locate X+K-6+(I≥3),Y,","
I≥3⇒Locate X+1,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つのバージョン、パラパラ表示版と高速表示版を、ここで完成とします。



つづく...

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




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




  



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

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




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

Casio Basic入門47

Casio Basic入門
<目次>

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

修正:2016/12/24


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

Chapter 8 - 初級

前回: Casio Basic入門46 を見る


◆ Chapter 8 の目標: Basic コマンドを使ってみる

メニュー選択や入力にBasic コマンドたけを使って、温度の単位変換プログラムを作りました。出力には、プログラムの冒頭では簡単なため、旧来の " "(出力)命令をまだ併用しています。


温度換算プログラム TC8
0→A
Lbl 0


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"MENU N°?"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

Goto 0



プログラム全体の流れをまとめてみます。プログラムは上から下へ順に処理が進んでゆくものだと理解することがとても重要です。そして、特定のコマンド、例えば If 文Do 文While 文Break コマンド 或いは ⇒ (条件ジャンプ)命令などがある時のみ例外的に処理の順序を変える、と理解することが基本になります。そして、今回のプログラムを機能ごとにまとめると、以下のような流れになっています。

プログラム全体は、Lbl 0Goto 0 により無限ループになっています。
その中では、[表示] を行うブロック、[メニュー選択とメニュー番号取得] を行うブロック、そして [温度入力と換算] を行うブロックに分けられます。

ここで、是非注目してもらいたいのは、これらの機能別の処理ブロックは、上から下へ順に処理が流れていることです。このように、各処理ブロックが上から下へ順に流れるようにプログラムを作ると、プログラムが分かりやすくなります。こうしておくと、機能変更や機能追加は、特定の処理ブロックに集中して行えば良くなり、結果的に修正、機能追加、バグ潰しが楽になります。

このように、機能ごとにまとめた処理ブロックが上から下へ流れてゆくような構造のプログラムを作る手法を構造化プログラミングと言って、一般に推奨される考え方です。Casio Basic は構造化プログラミングが出来るのです。


プログラムの構造

Lbl 0

 [表示]

 [メニュー選択とメニュー番号取得]

 [温度入力と換算]

Goto 0



さて、fx-5800P のような電卓でのプログラムは、プログラムを強制終する [AC] キーが備わっているので、プログラム終了に [AC] キーを使えば、終了のためのコードを書く必要が無いので、プログラミングは楽になります。
 
この方法が良いと思ってきたのですが、最近ちょっと考えが変わってきて、プログラムを正常終了させた方が良いのではないかと、思い始めています。その理由は前回書いていますが、どちらが正しいと言うことは無いと思います。好みの問題であり、ポリシーの問題でもあります。

どちらが正しいかは横に置いておいて、正常終了させるプログラムも作れることを紹介します。

そこで今回は、[EXIT] キーで正常終了させる方法を盛り込みます。



Chapter 8-6
[EXIT] キーで正常終了させる

プログラムのメイン画面を以下のようにします。

TC9-Main 

そして、[EXIT] キーを押したらプログラムが終了します。

まず方針を決めます。

[EXIT] キーが押されたことを検出するには、Getkey を使います。既に、計算式表示からメイン画面に戻る時に、[EXIT] キーを利用しているので、具体的には同様のコードを適用します。 

次に、どうやってプログラムを正常終了させるのか? プログラムの処理が一番下、つまりプログラムコードの最後までたどり着いたら、正常終了します。

一方で、今のプログラム TC8 は、Lbl 0Goto 0 の間を無限に繰り返す(無限ループ)構造です。そこで、[EXIT] キーで正常終了させるには、[EXIT] キーが押されたら無限ループから脱出して、プログラムの一番下に処理が進むようにします。都合の良いことに、Caso Basic には、他の Basic と同様に ループから脱出するための Break コマンドが用意されているので、それを使います。

Break コマンドは、以下のループなら、そこからから抜け出せます。
 ・While ループ
 ・Do ループ
 ・For ループ


しかし、LblGoto によるループでは、Break コマンドで脱出できません。これは、Break コマンドの仕様です。

 ⇒ Casio Baisc コマンドリファレンス - Break


そこで、現在の Lbl / Goto ループを While / WhileEnd を使った無限ループに変更します。結論から言えば、

Lbl 0
・・・
Goto 0




While 1
・・・
WhileEnd


に置き換えます。


While 文の書式
While [ループ継続条件]
[処理]
WhileEnd


While / WhileEnd ループを無限ループにするには、[ループ継続条件] が必ず成り立つ、つまり常に「真」となるようにします。

実は、0「偽」で、0 以外「真」と言うのが、プログラミング言語では標準で、Casio Basic もこれに従っています(取扱説明書には書かれていませんが...)。

そこで、

While 1
[処理]
WhileEnd


としたら、無限ループになるわけです。


次に、[EXIT] キーを検出したら Break を実行するように修正します。ここで、[メニュー選択とメニュー番号取得] のブロックを以下に抜き出します。

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M


[EXIT] キーのキーコードは 73 なので、L73 になった時に Break を実行すれば、一気に While 1 / WhileEnd ループから脱出します。これを実現するには、

L=73⇒Break

を上のブロックの一番下に追加します。


最後に、メイン画面の一番下の行(4行目)の表示を忘れずに変更します。

Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"




以上をまとめて、プログラム TEMP CONV とします。

先ず、プログラム TC8 のファイル名を TEMP CONV に変更します。プログラムの修正とプログラム名の変更の具体的な操作方法は、Chapter 7Chapter 8 でこれまでに説明しているので、割愛します。

温度換算プログラム TEMP CONV
0→A
While 1


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
K=73⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd



では、これを実行してみます。

[EXIT] キーを2回押して Program Manu 画面へ戻り、

TC7-ProgMenu 

[2]
(2:RUN)Prog List 画面に切り替え、 

TC9-PROG_ProgList 

TEMP CONV にカーソルがあるので、そのまま [EXE] キーでプログラムを起動します。

TC9_Main 

ここで、[EXIT] を押すと、プログラムは終了するはずです。

TC9-Quit_Done 

右下に Done と表示があり、プログラムが正常終了したことが分かります。

ここで、[EXIT][EXE][AC] のいずれかを押せば、Prog List 画面に戻ります。


さて、最後の仕上げを行います。右下の Done 表示だけでは、プログラム終了を示すには控えめな気がするので、終了時には以下のような画面にしようと思います。

TC9-Quit_Bye 


そこで、
WhileEnd の下に、画面消去コマンド Cls と Locate 7,2,"BYE!" を追加することにします。

!の入力方法
[FUNCTION] [1] (1:MATH) [5] (5:X!)

Cls は画面消去を行います。 



温度換算プログラム TEMP CONV
0→A
While 1


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
K=73⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!" 



もう一度、動作確認します。

TEMP CONV を起動すると、

TC9_Main 

[FMLA] を押して、計算式を表示、

TC9-Formula 

ここで、[EXIT] 押すと、

TC9-Quit_Bye 

メイン画面に戻らず、プログラムが終了してしまいます。

計算式が表示されている時、[EXIT] を素早く叩いて、できるだけ短い時間だけ押すと、メイン画面に戻ることもありますが、

TC9_Main 

チョット油断すると、プログラムが終了していまいます。

その理由を考えてみます。

メイン画面から正常終了する時にも [EXIT] キーを押すので、計算式表示画面で [EXIT] キーを押す時間が少しでも長いと、メイン画面に戻っても [EXIT] キーが押されたことになるので、すぐに終了するわけです。

計算式画面からメイン画面に戻る時のキーと、正常終了するキーを、別のものにすれば、この問題は解決します。しかし、それでは面白くないので、今回は両方とも [EXIT] キーを使うことにして、問題を解決します。実は、定番の方法があります。

作戦は以下の通り;

1) 計算式画面表示中は、[EXIT] キーが押されるまで While ループが回っている

2) [EXIT] キーが押されたら、この While ループから脱出 

3) [EXIT] キーが押された状態では、プログラムが先へ進まないように、 次のループに入る

4) [EXIT] キーが離されたら、そのループから脱出する

5) メイン画面に戻るが、[EXIT] キーは押されていないことが確実なので、改めて [EXIT] キーを押さない限り終了しない


要するに、3) を実現すれば良いのですが、以下のように赤文字の2行を追加するだけです。

While Getkey≠73
WhileEnd

While Getkey
WhileEnd


緑色の上2行は、[EXIT] キーが押されるまで回り続けるループで、1) と 2) を実現しています。
赤色の下2行は、[EXIT] を含めて何かキーが離されるまで回り続けるループで、3) を実現しています。

Getkey は、それが実行された時に何もキーが押されていない時は、0 になります(0 を返す、と言います)。何かキーが押されていると、2桁のキーコードを返すので、Getkey は2桁の数値、つまり 0 以外の値を持っています。

While [ループ継続条件] 
WhileEnd

という書式で、[ループ継続条件] が 0以外 つまり「真」の時は、ループが回り続けます。[EXIT] キーがまだ押されている状態では、Getkey73 、つまり 0 以外(=「真」) なので、ループは回り続けます。

[EXIT] キーが離されたら、Getkey0 になるので、[ループ継続条件]0 (=「偽」になるので、ループから脱出します。

この2行の赤文字While ループは、キーが離されるまでプログラムの実行が先へ進まないようにする関所の役割を果たしています。

ちなみに、

While Getkey
WhileEnd




While Getkey≠0
WhileEnd


は、全く同じ動作をします。これは、Getkey が戻り値を返すと言う性質を利用しています(詳細は前回説明しています)。
そして、≠0 が無い方が動作は速くなるので、上の表記を用いるほうが良いでしょう。


以上のように、Getkey と ループを使いこなすことで、キー操作をうまく制御することができ、Casio Basic を含めた Basic プログラミング習得のための重要ポイントです。そのようなわけで、Casio Basic入門の最初の Chapter 1 では、GetkeyLocate コマンドを使いこなすことを目標にしているわけです。

 ⇒ Casio Basic入門3 Chapter 1 - Getkey と Locate を使いこなす



ここまでをまとめます。

温度換算プログラム TEMP CONV
0→A
While 1


Cls
"1:      °C" (スペース11個)
"2:      °F" (スペース11個)
"3:      K"  (スペース12個)
If A:Then
Locate 4,1,C
Locate 4,2,F
Locate 4,3,K
IfEnd
Locate 13,1,"°C"
Locate 13,2,"°F"
Locate 13,3," K"
Locate 1,4,"<EXIT>"
Locate 11,4,"<FMLA>"

-1→M
Do
Getkey→L
LpWhile L=0
L=35⇒1→M
L=36⇒2→M
L=37⇒3→M
L=74⇒4→M
K=73⇒Break

Locate 1,4,"        " (スペース16個)
If M=1:Then
4→X:1→Y:9→D:2→E
Prog "IN":Z→C
C(9÷5)+32→F
C+273.15→K
1→A
Else If M=2
Then
4→X:2→Y:9→D:2→E
Prog "IN":Z→F
5(F-32)÷9→C
C+273.15→K
1→A
Else If M=3
Then
4→X:3→Y:9→D:2→E
Prog "IN":Z→K
K-273.15→C
C(9÷5)+32→F
1→A
Else If M=4
Then
Cls
Locate 2,1,"C = 5(F-32)÷9"

Locate 2,2,"F = (9÷5)C+32"
Locate 2,3,"K = C+273.15"

Locate 11,4,"<EXIT>"
While Getkey≠73
WhileEnd
While Getkey
WhileEnd

IfEnd:IfEnd
IfEnd:IfEnd

WhileEnd
Cls
Locate 7,2,"BYE!"



プログラム修正が終わったら、[EXIT] キーを2回押して、Program Menu 画面に戻ります。

TC7-ProgMenu 

[2] (2:RUN) で、Prrog List を表示さると、TEMP CONV にカーソルが合っているので、

TC9-PROG_ProgList 

そのまま [EXE] キーを押せば、TEMP CONV が起動します。

TC9_Main 

[FMLA] キーで計算式画面を表示

TC9-Formula 

[EXIT] キーを押したままにしてみると、何も変化は起こらず、

TC9-Formula 

[EXIT] キーを離すと、画面が切り替わり

TC9-Main 

メイン画面に戻ります。つまり、[EXIT] キーを離したら先に進むようにプログラムを書いたので、その通りの動作になっていることが確認できまし。計算式表示画面で、普通に [EXIT] キーをポンッと叩けば、違和感無くメイン画面に戻ると思います。

メイン画面で、改めて [EXIT] を押すと正常終了します。

TC9-Quit_Bye 

ここで、[EXIT]、[EXE][AC] のいずれかのキーを押せば、Prog List 画面に戻ります。

TC9-PROG_ProgList 

[EXE] で再び起動します。

TC9-Main 


ところで、バナナを液体窒素に漬けて凍らせると、釘が打てる...と言うのを見たことがあると思います。液体窒素はとても低温で、絶対温度で77度です。そこで、絶対温度77Kは、摂氏何度か? 調べて見ましょう。

[3] キーを押すと、入力ボックスが現れるので、

TC9-Press_Menu3 

ここで、77 と入力し、

TC9_Press_77K 

インジケータ <EXE>:ENTER に従って、[EXE] を押すと、入力が確定され、

TC9_result_77K 

摂氏と華氏の換算温度が表示されます。液体窒素温度は、-196.15℃ なのですね。



これで温度換算プログラム TEMP CONV が完成です。完成したプログラムは、COMP モードから実行することをお勧めします。COMP モードから実行すると、強制終了した時に、うっかりプログラムを触ってしまう危険性が無いからです。

但し、TEMP CONV は強制終了ではなくて、正常終了するようにしていますので、この心配はありません。念のため、COMP モードからプログラムを起動してみます。

[MODE] [1] (1:COMP)COMPモードに戻ります。

[FILE] キーを押して、Prog List を表示

TC9-COMP_ProgList_TimeZone 

[▼] [▲] キーで TEMP CONV にカーソルを合わせ

TC9-COMP_ProgList_TempConv 

[EXE] キーで TEMP CONV を起動します。

TC9-Main 

色々と操作してから、[EXIT] キーで終了させます。

TC9-Quit_Bye 

さて、本当に終了させるには、ここで [AC] キーを押す。

[EXIT] キーを押しても、何も変化はありません。

ここで [EXE] を押すと、再び TEMP CONV が起動します。これは以前も紹介している COMP モードでの特徴ですね。

プログラム終了時は、PROGモードで起動したか、COMPモードで起動したかで、多少異なることが確認できました。



温度換算プログラムを Chapter 7 では、 旧来の?(入力)命令を使って作り、それを Capter 8 では、Basic コマンドに置き換えました。

既に Basic を使いこなしている人には、Chapter 8 の内容は簡単だと思います。そして 構造化プログラミングが可能な 新世代Casio Basic の能力を再認識できたと思います。

プログラミング経験の少ない人には、Chapter 8 の内容は慣れない部分もあると思います。ループを使いこなすことはプログラミング習得の第一歩です。Casio Basic で習得すれば、次に パソコンなどで Basic プログラミングを行う時にそのまま役立ちます。


さて、新世代 Casio Basic は fx-5800P だけでなく、他のグラフ関数電卓にも搭載されています。そこで、次回は ここまで作った温度換算プログラムを fx-9860GII に移植することにします。





つづく...

Casio Basic入門48 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ



 



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

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



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

Casio Basic入門44

Casio Basic入門
<目次>

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

2015/03/15
2016/12/24 修正

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

Chapter 8 - 初級

前回: Casio Basic入門43 を見る


◆ Chapter 8 の目標: Basicコマンドを使ってみる

前回作ったプログラム TC6 では、温度入力画面と温度出力画面が異なる画面構成となっています。

例えば、以下のような温度出力画面になっているとします。

TC5 6 

ここで、摂氏温度を 20℃ に変更したらどうなるかを見るためには、一旦以下のような入力画面で入力します。

TC6 4 

入力を確定すると、以下の出力画面になります。

TC6 5 

これでもプログラムとして全く問題ないのですが、出力画面のまま、摂氏表示ののところで、別の値を入力したいと思うわけです。

と言うのも、スマホやパソコンのプログラムではそうなっているので、電卓プログラムでの同様の機能を実現できないだろうか?と言うのが今回のテーマです。



Casio Basic には、位置を指定して、そこで入力させるようなコマンドが用意されていません。そこで、この機能を実現させるために、入力ボックス を作りました。

 ⇒ fx-5800P プログラムライブラリ - 入力ボックス

 ⇒ fx-9860GII プログラムライブラリ - 入力ボックス

入力ボックスは、汎用サブルーチンとして作っていて、他のプログラムから呼びだして使うことを前提にしています。従って、Basic コマンドとは少し使い方が異なります。

Basic コマンドの使い方は、

[コマンド] [設定1],[設定2],[設定3], ...

といった使い方になります。

入力ボックスはサブルーチンです。サブルーチンを呼びだす時に色々な設定を一緒に指定することができません。そこで、

[入力ボックスの設定]
Prog "入力ボックス"
[結果の受け取り]


といった書式になります。

今回は、温度換算プログラムで、入力ボックスを使ってみようと思います。



Chapter 8-2
入力ボックスを使ってみる

入力ボックスには、使い勝手を考えて複数のバージョンがあります。

入力する数値の種類応答性が速い
バージョン(Ver2.0)
キーリピート抑制が
バージョン(Ver2.1)
プログラム名
0以上の整数(INPI Ver2.0)INPI Ver2.1INPI
0以上の小数と政数INP Ver2.0(INP Ver2.1)INP
正負の小数と整数IN Ver2.0(IN Ver2.1)IN

入力ボックスには、fx-5800P で使うために、大きく Ver 2.0Ver 2.1 の2種類があります。fx-5800P はCasio Basic プログラムの実行速度が比較的遅いので、できるだけキー入力の応答性を高める必要があり、その目的で作ったのがVer 2.0 で、応答性を高めるために、キーを押したままにするとその数字が繰り返し入力される(キーリピートが発生する)仕様になっています。

一方、キーリピートを抑制したものが Ver2.1 です。

Ver 2.0 / Ver 2.1 それぞれについて、入力する数値の種類に応じて3つのバージョン、INPI、INP、IN を用意しています(上の表参照)。

実際に使用してみると、Ver 2.0INPI の処理が軽いのでキーリピートが発生しやすいと思います。そこで INPI を使う場合はキーリピートを抑制した Ver 2.1 をお勧めします。

INPIN については、INPI に比べて相対的に処理が少し重く、キーリピートがあまり問題になりません。むしろキーリピートを抑制すると応答性の悪化を感じるので、Ver 2.0 の利用を勧めます。

上の表で赤文字で示したように、INPI Ver2.1INP Ver2.0IN Ver2.0 を使えば、間違いないと思います。なお、今回、温度換算プログラムで利用する場合は、温度値は正負の小数と整数なので IN Ver2.0 を使うことにします。


IN Ver2.0 の準備

fx-5800P は、パソコンとのリンク機能がないので、プログラムをパソコンから転送することが出来ません。最初は面倒でもプログラムをキー入力する必要があります。

fx-5800P に入力ボックス IN Ver 2.0 が保存されていない場合
もし、あなたの fx-5800P に入力ボックスが保存されていない場合は、面倒でも最初はキー入力する必要があります。
入力するソースコードは、fx-5800P プログラムライブラリ - 入力ボックス の プログラム- IN Ver2.0: プログラム名 IN に掲載していますので、間違えないように入力してください。

fx-5800P に入力ボックスが保存されている場合
入力ボックスは、既に Casio Basic入門で扱っているので、既にプログラムが保存されているかも知れません。今回は、正負小数対応の IN を使います。もし、バージョンに応じて異なったファイル名で保存している場合は、今回使う IN Ver2.0 のファイル名を IN にしてください。

先ずは、fx-5800P で入力ボックスを導入して温度換算プログラムを作りますが、後で fx-9860GII へ移植する予定です。そこで、fx-9860GII で入力ボックスを準備する方法も書いておきます。fx-9860GII はPCリンク機能を使ってプログラムを簡単に転送できるので、準備が楽です。

fx-9860GII で入力ボックスを準備する場合
もし、fx-9860GII をお使いの場合は、fx-9860GII 専用入力ボックス Ver 2.1GG1M ファイルをダウンロードできるようにしています。このファイルを一旦パソコンにダウンロードすれば、専用リンクソフトを使って fx-9860GII へ転送できるので、入力の手間はありません。
 ⇒ e-Gadget アーカイブ - Archaive ページ - fx-9860GII Casio Basic から IN.G1M をダウンロード  
あるいは、
 ⇒ ここ から IN.G1M をダウンロード



入力ボックス IN 2.0 の使い方

入力ボックスは、汎用サブルーチンです。サブルーチンを呼びだすには、Prog コマンドを使い、呼びだすプログラム名を " " で括ります。正負小数に対応した IN を使うので、

Prog "IN"

と書きます。

ちなみに、Prog の入力は、[SHIFT] [FILE] です。

入力ボックスを呼びだす前に、以下の4つの変数の設定を行います。

・ 入力ボックスを表示する桁(X座標): 変数X
・ 入力ボックスを表示する行(Y座標): 変数Y
・ 入力ボックスの桁数: 変数D
・ 入力ボックスの確定インジケータの種類の設定:
変数E

具体的には、以下の書式で使います。

入力ボックスの書式
△→X:△→Y:△→D:△→E (入力ボックスの設定)
Prog "IN"          (入力ボックスの呼出し)
Z→▽              
(入力値の受け取り)


は任意の数、は任意の変数、但し使用機種の画面範囲内に収まるように設定する。
  参考 fx-5800P: 1≦X≦16、1≦Y≦4、X+D≦16

- X: 入力ボックス表示開始桁
- Y: 入力ボックス表示開始行
- D: 入力ボックス桁数
- E: 入力ボックスインジケータの選択
   E=2: 画面右下に <EXE>:ENTER と表示
   E=1: 画面右下に ▶E と表示
   E=(上記以外): インジケータ非表示
- Z: 入力ボックスで確定した数値が代入される



入力ボックスの動作確認
入力ボックス IN をキー入力した場合は、入力ミスの可能性もあるので、テストプログラムで入力ボックスの動作テストを行います。併せて、入力ボックスの使い方を紹介します。

以下のテストプログラムを使います。

プログラム TEST
0→Z
"1:"
"2:"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
L=35⇒1→M
L=36⇒2→M

Locate 1,4,"        " (スペース16個)

If M=1:Then
3→X:1→Y:10→D:2→E
Prog "IN"
Else If M=2
Then
3→X:2→Y:6→D:1→E
IfEnd:IfEnd

Locate 1,4,"Z="

Locate 3,4,Z

WhileEnd


==========

<裏技>

代入命令 → を入力する良い方法を紹介します。

4→X を速く入力する方法
[4] キー
[SHIFT] [RCL] キーで が入力され、この時 アルファベット入力モードになる
[0] キー を押すと、アルファベットモードなので X が入力される

入力ボックスを使う書式では、代入命令を多く使うので、この方法を知っていると入力が楽になります。

ちなみに、Prog の入力は、[SHIFT] [FILE] です。

==========

では、テストプログラム TEST 作成の操作です。

[MODE] [5] (5:PROG]Program Menu を表示

IB-ProgramMenu 

新たにプログラム TEST を作るので、[1] (1:NEW) を押し、File Name 入力画面へ...

IB-FileName 

ここで、プログラム名 TEST を入力し、[EXE] で確定。File Mode 設定画面が現れる。

IB-FileMode 

[1] (1:COMP) を選択すると、プログラム入力画面に切り替わります。

ここで、プログラム TEST を入力します。

入力が終わったら、[EXIT] を押して、Program Menu 画面に戻ります。

IB-ProgramMenu 

では、プログラム TEST を実行してみます。

[2] (2:RUN) を押して、Prog List を表示させ、

IB-ProgList  

[EXE] キーで、プログラム TEST を実行します。

TEST-1 

[1] キーを押すと、1: の右に10桁の入力ボックスが表示されます。

TEST-2 

入力ボックス表示の左端は3桁目(X座標が3)、1行目(Y座標が1)で、桁数は10です。つまり、X に 3、Y に 1 、D に 10 を指定しています。さらに右下に、<EXE>:ENTER と表示されていますが、これがインジケータで、E に 2 を指定するとこの表示になります。

つまり、

3→X:1→Y:10→D:2→E
Prog "IN"


と書いておき、これが実行されると、上のような入力ボックスが表示され、入力モードになります。

ここで、項目1 に、-12.345678 を入力すると、以下のようになります。

TEST-3 

右下のインジケータは、入力モードにあることを示し、[EXE] キーを押して確定することを示す操作案内です。
入力モード中に [DEL] キーを押せば入力した数字が削除され、内容を編集できます。

[EXE] で入力確定すると、変数 Z に 確定した値が格納されてから、入力ボックスが終了します。

TEST-4 

一番下の行で変数 Z の値を表示しています。
これは、プログラム TEST の以下のコードによるものです。

Locate 1,4,"Z="
Locate 4,4,Z


このように、希望の位置に希望の桁数で入力させることができます。色々な入力を試して、Z の値が正しいことを確認します。


さて、次に項目2に、入力してみます。[2] を押すと、以下のようになります。

TEST-5 

入力ボックスの左端は、3桁目(X=3)、2行目(Y=2)で、桁数が6(D=6)です。そして、インジケータは簡略化した表示(E=1)です。

プログラムに書く場合は、以下のようにします。

3→X:2→Y:6→D:1→E
Prog "IN"


ここで、-9.876 と入力すると、

TEST-6 

正しい位置に入力中の内容が表示されています。[DEL] で削除できて、入力内容の編集ができます。
右下のインジケータ ▶E は、[EXE] で確定、との操作方法を示しています。

[EXE] で確定すると、変数 Z に入力値が代入され、入力ボックスが終了します。

TEST-7 

Locate 1,4,"Z="
Loxate 3,4,Z


によって、4行目に、Z の値を表示しています。


では、ここで [1] を押して、再び入力ボックスを表示させ、

TEST-8 

このまま、[EXE] を押す、つまり何も入力しないで確定すると、変数 Z には 0 が代入され、入力ボックスが終了するので、

TEST-9 

このように表示されます。

テスト用プログラムをもう一度掲載しますが、赤文字で示した部分、つまり入力ボックスの桁数とインジケータの種類を変更してみて、色々と試してみてください。

プログラム TEST
0→Z
"1:"
"2:"

While 1

-1→M
Do
Getkey→K
LpWhile K=0
L=35⇒1→M
L=36⇒2→M

Locate 1,4,"        " (スペース16個)

If M=1:Then
3→X:1→Y:10→D:2→E
Prog "IN"
Else If M=2
Then
3→X:2→Y:6→D:1→E
Prog "IN"  [2016/12/24] 追加修正
IfEnd:IfEnd

Locate 1,4,"Z="

Locate 3,4,Z

WhileEnd




今回は、入力ボックスを使う準備と、使い方を紹介しました。

次回は、温度換算プログラムに入力ボックスを導入してゆきます。






つづく...

Casio Basic入門45 / 目次




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

人気ブログランキングへ


FC2ブログランキングへ


 


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

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



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

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

やす (Krtyski)

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


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

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

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


人気ブログランキングへ


FC2ブログランキングへ


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

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

この人とブロともになる

QRコード
QR