プログラムライブラリ - RGB指定による色確認プログラム

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

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
2018/01/13
アップデート 2018/03/25
アップデート 2020/10/31

[C.Basic] [CG]
RGB指定による色確認プログラム:
  RGB2ap - RGB Ver 1.2ap <シンプル機能版> 
(マイナーアップデート)
  RGB4c   - RGB Ver 1.4d
 
(マイナーアップテート)
  RGB5a   - RGB Ver 1.5b (マイナーアップデート)
 ※ C.Basic for CG 最新バージョン Ver 1.45 build20 に対応した機能改善アップデート
 

著作権者

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


対応機種

Casio fx-CGシリーズ (CG10 / CG20 / CG50)


動作環境

C.Basic for CG Ver 1.45  build 20 以降


プログラムの説明

このプログラムは、一見アドインプログラムに見えますが、Casio Basic 上位互換の C.Basic (つまり BASIC) で書いたものです。チョット大がかりですが C.Basic for CG のサンプルプログラムにもなると思います。

さて、fx-CGシリーズに搭載されている高精細液晶 (216x384 pixel、16bitカラー、65536色)は、プログラムの出力に大きな表現力を与えてくれます。純正Casio Basic では 基本7色 (Black, Blue, Red, Magenta, Green, Cyan, Yellow) のみを設定できますが、C.Basic for CG では基本7色に加えて RGB値での色設定ができます。

そこで、プログラム作成時の配色を検討するためにRGB設定による実際の色を確認するプログラムを作りました。テキスト文字色、テキスト背景色、グラフィックス描画の色、それらの配色を確認できます。

RBG4d はRGB値それぞれに、0 ~ 255 を設定できる 24 bit フルカラー対応バージョンです。但し、fx-CGシリーズのカラー液晶はフルカラーではありません。

そこで、fx-CGシリーズ搭載のカラー液晶の実際の仕様に合わせた 16bit カラーバージョンの RGB5b を作りました。
fx-CGシリーズの 16bitカラーは R と B が 5 bit (32階調)、G が 6 bit (64階調) なので 65,536色です。24 bitフルカラーの 16.777,216 色に比べて使える色が少なくなっていて、実際のRGB値は 0 ~ 255 の連続した整数値ではなく、R と B は 0 ~ 248 の8刻み、G は 0 ~ 252 の 4 刻みで色が変化します。これは、RGB4d で操作すると確認できます。

そこで 16 bit カラーに対応した RGB5b を使えば、fx-CGシリーズの液晶が取り得る RGB 値を正しく調べられます。但し、24 bit カラーの RGB値を指定しても問題はありませんが、意図した色にならないことが有るのは、電卓側の仕様です。 


ダウンロード

24bit カラーバージョン シンプル機能版 - RGB2ap (Ver 1.2ap)
 24bit カラーバージョン - RGB4d (Ver 1.4d)
 16bit カラーバージョン - RGB5b (Ver 1.5b)
※ RGB4d (Ver 1.4d) / RGB5b (Ver 1.5b) は機能を詰め込みすぎて、使い方が判りにくくなっています。そこでRGB値の確認を簡単に調べるだけの機能に限定した シンプル機能版 を RGB2ap (Ver 1.2ap) として改めて公開しました。


プログラムの使い方 - RGB4d (Ver 1.4d) / RGB5b (Ver 1.5b)

起動すると、モード選択画面がポップアップ。
左が 24bit カラーバージョンの Ver 1.4d、右が 16bit カラーバージョンのVer1.5b
RGB4d_StartUp RGB5b_StartUp
[F1] でテキスト文字主体の配色確認モード、[F2] でグラフィックスを含んだ配色確認モードでプログラムが起動。

※ テキストモード
左が 24bit カラーバージョンの Ver 1.4d、右が 16bit カラーバージョンのVer 1.5b
RGB4c_Txt_Mode.png RGB5a_Txt_Mode.png 
テキストモード(テキスト主体の配色確認モード)。テキスト色 (前面色)のRGBにマーカーが付いている。

※ グラフィックスモード
左が 24bit カラーバージョンの Ver 1.4d、右が 16bit カラーバージョンのVer 1.5b
RGB4c_Grph.png RGB5a_Grph.png 
グラフィックスモード(グラフィックスを含めた配色確認モード)。背景色のRGBにマーカーが付き、テキスト背景と2つの円の配色が表示される。円の2つの配色は、テキストの背景色2つと対応している。

操作は、ファンクションキー  [F1][F6]、テンキー [1][3]、その他6つのキー [SHIFT] [ALPHA] [OPTN] [X2] [VARS] [∧] を使う。

テキストモードとグラフィックスモードは設定が異なるだけ。テキストモードで起動した後、例えば [SHIFT] [ALPHA] [SHIFT] と順に押せば、グラフィックスモードで起動した時と同じ状態になる。

[F5] (HELP) で簡易的な操作説明を表示する。

左が 24bit カラーバージョンの Ver 1.4d、右が 32bit カラーバージョンのVer 1.5b
RGB4d_QH RGB5b_QH
上下矢印キーでスクロールできる。現在のところ、英数字・記号しか出力できないので英語表記になる。そこで、[F6] (QR) で日本語クイックヘルプへのリンクをQRコードで示す。

RGB4b_5.png 

スマホやタブレットなどでQRコードを読み込めば、日本語クイックヘルプのページが読める。


キー操作

[F6] (EXIT) / [EXIT]:プログラムの終了

[ALPHA] / [ ) ]:カラーサンプルエリアの切替え
  RGB4b_6.png 
  2つ(2行)のカラーサンプルエリアを切り替える。
  マーカー が選択されているカラーサンプルエリアを示す。
  ※ Text モードでの起動時は、エリアは1つだけ表示

[OPTN] / [cos]:変更するRGBエリアの切替え
  RGB4b_7.png 
  上がテキスト文字色のRGB値、下が背景 / グラフィックスのRGB値。
  カーソルや直接入力での変更対象は、マーカー▶が付いているRGBエリア。

[SHIFT] / [sin]:テキストの背景の表示/非表示切替
  RGB4b_8.png 
  [ALPHA]で選択したテキストの背景色を非表示

  RGB4b_9.png 
  [ALPHA]で選択したテキストの背景色を表示
  ※ [SHIFT] / [sin] を押す度に切り替わる(トグル動作)

[◀] / [▶]:変更したいR, G, B へカーソル移動
  RGB4b_10.png 
  左右の矢印キーで、変更したいR、G、Bにカーソル ←↕→ を移動。

[▲] / [▼]:R、G,B値の連続変更(スキャン)
  RGB4b_10.png 
  上下の矢印キーで、カーソル ←↕→ とマーカーのある値を変更。
  上の例では、テキスト色のR値が変更対象。
  ※ 通常押しだと、1つづ値が変わる(ステップスキャン)。
  ※ 長押しするとデフォルトで値が±20スキップする(スキップスキャン)。
  ※ 長押しで値が 0 か 255 付近になると、スキップが遅くなる。

[F1] / [1] (R)、[F2] / [2] (G)[F3] / [3] (B):RGB値を直接入力
  RGB4b_11.png 
  RGB値を直接キー入力する。

[EXE]:RGB値を直接入力
  RGB4b_10.png 
  [EXE] でカーソル ←↕→ とマーカーがあるところに直接キー入力。
  上の例では、テキスト色のR値が入力を受け付ける。

[F4]:基本7色に加えて White に変更
  RGB4b_11.png 
  [F4] を押すと、カーソル ←↕→ とマーカー▶のある値を、
  基本7色 (Black, Blue, Red, Magenta, Green, Cyan, Yellow)に加えて
  White に変更する。押す度に順に切り替わる。
  ※ 7色カラーバーで現在選択されている基本色に白線のマーカーを表示。
  ※ 矢印キーや直接入力した時、基本色+Whiteの場合、[F4]ファンクションに色を表示。
  ※ 基本色以外の時は、[F4]ファンクションに Color と表示

[∧] / [→]:テキスト色と背景色を同じ色に変更
  左が 24bit カラーバージョンの Ver 1.4d、右が 16bit カラーバージョンのVer 1.5b
  RGB4c_Back.png RGB5a_Back.png 
  [OPTN]でRGBエリアをで切替え、マーカーで指定されている色を、
  テキスト色と背景色に適用する。
  ※ 結果的にテキストが消える。

[VARS] / [tan]:テキストと背景を互いに補色にする
  左が 24bit カラーバージョンの Ver 1.4d、右が 16bit カラーバージョンのVer 1.5b
  RGB4c_CC.png RGB5a_CC.png 
  [OPTN]で選びマーカーが付いたRGBエリアの補色をもう一方のRGBエリアに適用する。
  ※ テキストRGBエリアを選んでいると、背景が補色になる。
  ※ 背景RGBエリアを選んでいると、テキストが補色になる。
  ※ R=G=B の時は、補色ではなくて反対色を適用する。

[X2] / [ , ]:背景色に補色を適用する
  左が 24bit カラーバージョンの Ver 1.4d、右が 16bit カラーバージョンのVer 1.5b
  RGB4c_CC2.png RGB5a_CC2.png 
  [ALPHA]で選んでマーカーが付いたカラーサンプルエリアの背景色に、
  [OPTN]で選びマーカーが付いたたカラーエリアの色の補色を適用する。
  ※ テキストのRGBエリアにが有る時は、が付いていない方の背景が補色になる。
  ※ 背景のRGBエリアにがある時は、が付いていない方の背景が補色になる。

右手操作のための代替キー
  RGB4b_keys 
  左上の6つのキーと、右手で操作するための右下の代替キーは、
  同じ機能が同じ配置になっている。
  ※ [SHIFT] = [sin]、[OPTN] = [cos]、[VARS] = [tan]
    [ALPHA] = [ ) ]、[X2] = [ , ]、[∧] = [→]


ソースコード

[2018/01/20]
Ver 1.2a 以降で、C.Basicタイマーの時間を 00:00:00 にリセットしてしまうコードが含まれており、時計の時間がリセットしてしまう問題がありました。C.Basic for CG のマイナーアップデートでこの問題を解消しました。C.Basic for CG Ver 3.3α [2018/01/20 17:00] 以降にダウンロードしたものをお使いください。

背景色を[SHIFT]で解除しテキストRGB値を[▲]/[▼]でスキャン時、背景RGB値のちらつきを抑制しました。


謝 辞

本プログラムは、sentaro様、ツル様からのアドバイスや要望により各種機能や表示を追加したものです。両氏にお礼申し上げます。


過去バージョン [2020/10/31] 追記

Ver 1.1 - RGB [download]
テキスト色のRGB値をキー入力のみで設定する最初のバージョン

Ver 1.2 - RGB2 [download]
RGB値をカーソルキーでスキャン可能にした。

Ver 1.2a - RGB2a [download]
[F4]での基本色設定に White を追加、ヘルプ機能を追加した。

・Ver 1.2ap - RGB2ap (download)
Casio Python での RGB値 の解説のために Ver 1.2a の操作性を改善して公開した。

Ver 1.2b - RGB2b [download]
テキストのみのカラーサンプルエリアを2つに増やした。

Ver 1.2c - RGB2c [download]
背景RGB値の設定・表示を追加し、テキスト/背景の補色設定 [VARS] を追加した。

Ver 1.3c - RGB3c [download]
テキスト↔背景を同色にする設定 [∧]、テキスト背景⇒もう一つの背景へ補色設定の機能 [X2]、ヘルプは増えた機能をカバーするためのスクロール表示機能、右手操作用の代替えキーを追加した。

最新バージョンは、操作が複雑で使いづらいかも知れないので、シンプルなものとして、Ver 1.2ap をお使いください。サンプルプログラムとしても判りやすいのでご参考になりやすいと思います。





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


 



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

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

関連記事

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

Casio Python - get_pixel()

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - リファレンス 
目次
get_pixel()

Python公式サイト: 
初版:2020/10/28
追記・修正:2020/10/30

[対応モデル] - fx-CG50 OS3.40 以降、fx-9750GIII / fx-9860GIII OS3.40 以降

引数で指定した座標の位置のピクセルの点を取得します。


書式:
get_pixel(x, y) 

・(第1引数) x: 0 から始まる整数。液晶の横方向の座標、左端が 0。指定しないとエラー。
・(第2引数) y: 0 から始まる整数。液晶の縦方向の座標、上端が 0。指定しないとエラー。

・戻り値: タプル型 (R, G, B) のRGBカラー値を返します。
      なお、RGB値 (0, 0, 0,) は黒、(255, 255, 255) が白です。
      指定した座標値が液晶画面の範囲外の時は、 エラーにならずに None を返します。

この関数は、カシオ独自のモジュール casioplot に含まれる関数です。
このモジュールに含まれる関数を使うにはスクリプト冒頭に
 from casioplot import *
と記述します。


スクリプト例: cpSample.py のダウンロード
from casioplot import *

for j in range (64):
 for i in range (128):
  set_pixel(i, j)
  show_screen()
# (1)

for i in range(64):
 set_pixel(i*2, i, (255, 255, 255))
 show_screen()
# (2)

for i in range(1,1000):
 draw_string(0, 0, str(i-1), (0, 0, 0))
 show_screen()
 draw_string(0, 0, str(i), (255, 255, 255))
 show_screen()
# (3)

col = get_pixel(100, 0)
# (4)

clear_screen()
# (5)

draw_string(0, 0, '[EXIT]')
# (6)

print(col)
# (7)

動作:
実行結果は下記のようになります。
左にCGモデルの出力、右にFXモデルの出力を示します。

# (1) - 最初の for ループが終わったところ:
   128 ドット × 64 ドットを (0, 0) から (127, 63)  まで順に黒で塗りつぶし
casioplot_1 casioplot_1fx2 

# (2) - 次の for ループが終わったところ:
   左上 (0, 0) から右下 (127, 63) へ線分を白のドットで描画
casioplot_2 casioplot_2fx2 

# (3) - 3つめの for ループが終わったところ:
   左上に 0 から 999 まで1つづつ増やしながら逐次数値を描画
   1つ前の数値を黒で描画(消す)したのち、白で描画しています。
   FXモデルは液晶の応答性が悪いので、数字が変化するところは視認できません。
casioplot_3 casioplot_3fx2 

# (4) - (100, 0) のピクセルの色を取得して 変数 col に代入したところ:
   col には タプル型の (0, 0, 0) = 黒 が代入される

# (5) - グラフィック画面を消去したところ:
casioplot_5 casioplot_fx5 

# (6) - グラフィック画面右上に [EXIT] と描画したところ:
   ここで、[EXIT] を押して下さい
casioplot_6 casioplot_fx6 

# (7) - 変数 colprint(col) で、シェルl画面に出力したところ:
   変数 col には タプル型の (0, 0, 0) が代入されている
casioplot_7 casioplot_fx7_2





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


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

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

関連記事

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

Casio Python - set_pixel()

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - リファレンス 
目次
set_pixel()

Python公式サイト: 
初版:2020/10/28
追記・修正:2020/10/29

[対応モデル] - fx-CG50 OS3.40 以降、fx-9750GIII / fx-9860GIII OS3.40 以降

引数で指定した座標の位置に指定した色で点を描画します。但し、この関数はVRAMにデータを転送するだけで、グラフィック画面 (描画画面) には転送しないので、画面には変化がありません。

show_screen() を実行すれば VRAMからグラフィック画面 (描画画面) に転送され、画面に出力されます。


書式:
set_pixel(x, y, color=(255, 255, 255)) 

・(第1引数) x: 0 から始まる整数。液晶の横方向の座標、左端が 0。指定しないとエラー。
・(第2引数) y: 0 から始まる整数。液晶の縦方向の座標、上端が 0。指定しないとエラー。
・(第3引数) color: タプル型 (R, G, B) でRGBカラーを指定します。
          なお、(0,0,0) が黒、(255,255,255) が白
          color を指定しないとデフォルト (0,0,0) 黒 が設定されます。
          ※ モノクロ液晶のFXモデルでは、(255,255,255) 以外の値を設定
             しても、(0,0,0) 黒 の設定と同じ結果になります。

・戻り値: なし (常にNoneが返る)
      液晶の範囲外の座標を指定してもエラーにならず、画面上は何も起こりません。

この関数は、カシオ独自のモジュール casioplot に含まれる関数です。
このモジュールに含まれる関数を使うにはスクリプト冒頭に
 from casioplot import *
と記述します。


スクリプト例: cpSample.py のダウンロード
from casioplot import *

for j in range (64):
 for i in range (128):
  set_pixel(i, j)
  show_screen()
# (1)

for i in range(64):
 set_pixel(i*2, i, (255, 255, 255))
 show_screen()
# (2)

for i in range(1,1000):
 draw_string(0, 0, str(i-1), (0, 0, 0))
 show_screen()
 draw_string(0, 0, str(i), (255, 255, 255))
 show_screen()
# (3)

col = get_pixel(100, 0)
# (4)

clear_screen()
# (5)

draw_string(0, 0, '[EXIT]')
# (6)

print(col)
# (7)

動作:
実行結果は下記のようになります。
左にCGモデルの出力、右にFXモデルの出力を示します。

# (1) - 最初の for ループが終わったところ:
   128 ドット × 64 ドットを (0, 0) から (127, 63)  まで順に黒で塗りつぶし
casioplot_1 casioplot_1fx2 

# (2) - 次の for ループが終わったところ:
   左上 (0, 0) から右下 (127, 63) へ線分を白のドットで描画
casioplot_2 casioplot_2fx2 

# (3) - 3つめの for ループが終わったところ:
   左上に 0 から 999 まで1つづつ増やしながら逐次数値を描画
   1つ前の数値を黒で描画(消す)したのち、白で描画しています。
   FXモデルは液晶の応答性が悪いので、数字が変化するところは視認できません。
casioplot_3 casioplot_3fx2 

# (4) - (100, 0) のピクセルの色を取得して 変数 col に代入したところ:
   col には タプル型の (0, 0, 0) = 黒 が代入される

# (5) - グラフィック画面を消去したところ:
casioplot_5 casioplot_fx5 

# (6) - グラフィック画面右上に [EXIT] と描画したところ:
   ここで、[EXIT] を押して下さい
casioplot_6 casioplot_fx6 

# (7) - 変数 colprint(col) で、シェルl画面に出力したところ:
   変数 col には タプル型の (0, 0, 0) が代入されている
casioplot_7 casioplot_fx7_2





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


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

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

関連記事

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

Casio Python - draw_string()

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - リファレンス 
目次
draw_string()

Python公式サイト: 
初版:2020/10/28
追記・修正:2020/10/29

[対応モデル] - fx-CG50 OS3.40 以降、fx-9750GIII / fx-9860GIII OS3.40 以降

グラフィック画面 (描画画面) に文字列を描画します。
文字列の位置は、最初の文字の左上の座標で指定します。文字列の色とサイズも指定できます。
但し、この関数はVRAMにデータを転送するだけで、グラフィック画面 (描画画面) には転送しないので、画面には変化がありません。

show_screen() を実行すれば VRAMからグラフィック画面 (描画画面) に転送され、画面に出力されます。


書式:
draw_string(x, y, color=(255, 255, 255), size='medium') 

・(第1引数) x: 0 から始まる整数。液晶の横方向の座標、左端が 0。指定しないとエラー。
・(第2引数) y: 0 から始まる整数。液晶の縦方向の座標、上端が 0。指定しないとエラー。
・(第3引数) color: タプル型 (R, G, B) でRGBカラーを指定します。
          なお、(0,0,0) が黒、(255,255,255) が白です。
          color を指定しないとデフォルト (0,0,0) 黒 が設定されます。
          第4引数 (size) を指定する場合は省略できず、省略するとエラー。
           モノクロ液晶のFXモデルでは、(255,255,255) 以外の値を設定
             しても、(0,0,0) 黒 の設定と同じ結果になります。
・(第4引数) size: 文字列でサイズを指定。'small''medium''large' のいずれかを指定。
          これらの文字列以外を指定すると、エラーになります。
          size を指定しないとデフォルト 'medium' が設定されます。
          モノクロ液晶のFXモデルでは、'small' を設定しても 'medium'
             になります。 

・戻り値: なし (常にNoneが返る)
      液晶の範囲外の座標を指定してもエラーにならず、画面上は何も起こりません。

この関数は、カシオ独自のモジュール casioplot に含まれる関数です。
このモジュールに含まれる関数を使うにはスクリプト冒頭に
 from casioplot import *
と記述します。


スクリプト例: cpSample.py のダウンロード
from casioplot import *

for j in range (64):
 for i in range (128):
  set_pixel(i, j)
  show_screen()
# (1)

for i in range(64):
 set_pixel(i*2, i, (255, 255, 255))
 show_screen()
# (2)

for i in range(1,1000):
 draw_string(0, 0, str(i-1), (0, 0, 0))
 show_screen()
 draw_string(0, 0, str(i), (255, 255, 255))
 show_screen()
# (3)

col = get_pixel(100, 0)
# (4)

clear_screen()
# (5)

draw_string(0, 0, '[EXIT]')
# (6)

print(col)
# (7)

動作:
実行結果は下記のようになります。
左にCGモデルの出力、右にFXモデルの出力を示します。

# (1) - 最初の for ループが終わったところ:
   128 ドット × 64 ドットを (0, 0) から (127, 63)  まで順に黒で塗りつぶし
casioplot_1 casioplot_1fx2 

# (2) - 次の for ループが終わったところ:
   左上 (0, 0) から右下 (127, 63) へ線分を白のドットで描画
casioplot_2 casioplot_2fx2 

# (3) - 3つめの for ループが終わったところ:
   左上に 0 から 999 まで1つづつ増やしながら逐次数値を描画
   1つ前の数値を黒で描画(消す)したのち、白で描画しています。
   FXモデルは液晶の応答性が悪いので、数字が変化するところは視認できません。
casioplot_3 casioplot_3fx2 

# (4) - (100, 0) のピクセルの色を取得して 変数 col に代入したところ:
   col には タプル型の (0, 0, 0) = 黒 が代入される

# (5) - グラフィック画面を消去したところ:
casioplot_5 casioplot_fx5 

# (6) - グラフィック画面右上に [EXIT] と描画したところ:
   ここで、[EXIT] を押して下さい
casioplot_6 casioplot_fx6 

# (7) - 変数 colprint(col) で、シェルl画面に出力したところ:
   変数 col には タプル型の (0, 0, 0) が代入されている
casioplot_7 casioplot_fx7_2





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


 


keywords: fx-CG50Pythonfx-9759GIIIfx-9860GIIIプログラム関数電卓

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

関連記事

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

Casio Python - オブジェクト一覧

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     
- Casio Python オブジェクト一覧
目次

初版:2020/06/28
追加修正:2020/10/28


Casio Python オブジェクト一覧
<fx-CG50 OS3.50 | fx-9750GIII OS3.40 | fx-9860GIII OS3.40>


[SHIFT] [4] (CATALOG) のカタログ機能では表示されない隠しオブジェクトも含んでいます。
個別リファレンスを作成後、リンク張ってゆきます。
データ型
data_type



標準モジュール (builtins)

ステートメント 
構造制御

if | elif | else

for | in 反復可能オブジェクト | in range() | else | break | continue | pass
※ 反復可能オブジェクト = イテラブルオブジェクト (iterable object)

while | else | breakcontinue | pass

関数定義
 
def | return | yeild | global | local 

ラムダ関数 (無名関数)
 
lambda

例外処理
 
 
try | exept | else | finally | raise | as | BaseExceptionException | KeyboardInterrupt | StopIteration | SystemExit
 
テスト (デバッグ)
 
assert | AssertionError 
 
モジュール呼び出し
 
import | from | as 
 
クラス定義
 
class | with | as | classmethod()staticmethod() | object 
 
ファイル
 
open (read , write がなく、まだ使えない)
 
数値演算
 
+ | - | * | / | ** | % | //
 
比較演算
 
< | > | <= | >= | == | != | is | is not | in | not in
 
帰属(所属)検査
 
in | not in
 
ブール演算 (論理演算)
 
and | or | not
 
ビット演算 (論理演算)
 
& | | | ^ | ~ | >> | <<
 
代入
 
=
 
累算代入演算
 
+= | -= | *= | /= | //= | %= | >>= | <<= | &= | ^= | |=
 
三項演算
 
x if 条件式 else y
 
エスケープ
 
\
 
定数
 
True | False | None | Ellipsis 
 
コメント
 
# | ''' | """
 
エラー
 
 
 
 
ArithmetricError | AssertionError | AttributeError | EOFError | GeneratorExit | ImportError | IdentationError | IndexError | KeyError | LookupError | MemoryError | NameError | NotImplementedError | OSError | Overflowerror | RuntimeError | SyntaxError | TypeError | ValueError | ZeroDivisionError 


標準組込関数 (builtins)
出力
 
print()
 
入力
 
input()
 
文の実行
 
eval() | exec() 
 
高階関数
 
map() 
 
シンボルテーブル取得
 
globals() | locals() 
 
クラス/オブジェクト取得
 
 
 
callable() | dir() | getattr() | hasattr() | hash() | id() | isinstance() | issubclass() | iter() | next()repr() | setattr() | super() | type() 
 
数値の変換
 
abs()bin()divmod() | float() | int() | hex() | oct() | pow() | round() complex() | .imag | .real
 
数値と文字列の変換
 
bool() | chr() | int() | ord() | float()
 
シーケンス型:
 シーケンス型で共通
 
 
+ | * | all() | any() | .index() | .count() | len() | min() | map() | max() | sum() | zip() 
 
 リスト型と辞書型で共通
 
 
*= | .append() | .clear() | .copy() | del.extend() | .insert() | .pop() | .remove() | .reverse()
 
 リスト型
 
[ ] | list() | .sort() | sorted()
 
 タプル型
 
( ) | tuple() 
 
 文字列型とバイナリー
 シーケンス型で共通
 
 
.endswith() | .find() | .isalpha() | .isdigit() | .islowr() | .isspace() | .isupper() | .join() | .lower() | .lstrip() | .replace() | .rfind() | .rindex() | .rsplit() | .rstrip() | .startswith() | .strip() | .upper() 
 
 文字列型
   
' ' | " " | f' ' | f" "str() | eval() | .format() 
 
 バイナリーシーケンス型
 
b' ' | b" " | bytes() | .from_bytes() | .to_bytes() 
 
 range型
 
range() | slice()
 
辞書型

 
 
{ } | dict() | .fromkeys() | .get() | .items() | .keys() | .pop().popitem() | .setdefault() | .update() | .values() | globals() 
 
集合型
print(dir(set)) で取得
 
 

  
{ } | set() | .add() | .clear() | .copy() | .difference() | .difference_update() | .discard() | .intersection() | .intersection_update() | .isdisjoint() | .issubet() | .issuperset() | .pop() | .remove() | .symmetric_defference() | .symmetric_deference_update() | .union() | .update()
 


mathモジュール関数
三角関数
 
acos() | asin() | atan() | atan2(,) | cos() | pi | sin() | tan()
 
指数 / 対数
 
e | exp() | frexp(,) | idexp(,) | log() | log10() | pow() 
 
双曲線関数
 
cosh() | sinh() | tanh() 
 
小数点以下の切上げ / 切捨て
 
ceil() | floor() 
 
絶対値
 
fabs() 
 
剰余計算
 
fmod(,) 
 
整数部と小数部を同時取得
 
modf() 
 
平方根sqrt() 


randomモジュール関数
乱数発生

 
getrandbits() | randrange(,) | randint() | random() | uniform()
 
ランダムに要素を選択
 
choice()
 
乱数ジェネレータ初期化seed()


casioplotモジュール関数
グラフィックス画面消去
 
clear_screen()
 
VRAMへ出力
 
draw_string(,,,) | set_pixel(,,)
 
ピクセル色取得
 
get_pixel(,)
 
VRAMから画面へ転送
 
show_screen()
 







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


 


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

関連記事

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

Casio Python - clear_screen()

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - リファレンス 
目次
clear_screen()

Python公式サイト: 
初版:2020/10/28

[対応モデル] - fx-CG50 OS3.40 以降、fx-9750GIII / fx-9860GIII OS3.40 以降

グラフィック画面 (描画画面) を消去します。
引数はありません。戻り値もありません (常にNoneが返ります) 。

この関数は、カシオ独自のモジュール casioplot に含まれる関数です。
このモジュールに含まれる関数を使うにはスクリプト冒頭に
 from casioplot import *
と記述します。


スクリプト例: cpSample.py のダウンロード
from casioplot import *

for j in range (64):
 for i in range (128):
  set_pixel(i, j)
  show_screen()
# (1)

for i in range(64):
 set_pixel(i*2, i, (255, 255, 255))
 show_screen()
# (2)

for i in range(1,1000):
 draw_string(0, 0, str(i-1), (0, 0, 0))
 show_screen()
 draw_string(0, 0, str(i), (255, 255, 255))
 show_screen()
# (3)

col = get_pixel(100, 0)
# (4)

clear_screen()
# (5)

draw_string(0, 0, '[EXIT]')
# (6)

print(col)
# (7)

動作:
実行結果は下記のようになります。
左にCGモデルの出力、右にFXモデルの出力を示します。

# (1) - 最初の for ループが終わったところ:
   128 ドット × 64 ドットを (0, 0) から (127, 63)  まで順に黒で塗りつぶし
casioplot_1 casioplot_1fx2 

# (2) - 次の for ループが終わったところ:
   左上 (0, 0) から右下 (127, 63) へ線分を白のドットで描画
casioplot_2 casioplot_2fx2 

# (3) - 3つめの for ループが終わったところ:
   左上に 0 から 999 まで1つづつ増やしながら逐次数値を描画
   1つ前の数値を黒で描画(消す)したのち、白で描画しています。
   FXモデルは液晶の応答性が悪いので、数字が変化するところは視認できません。
casioplot_3 casioplot_3fx2 

# (4) - (100, 0) のピクセルの色を取得して 変数 col に代入したところ:
   col には タプル型の (0, 0, 0) = 黒 が代入される

# (5) - グラフィック画面を消去したところ:
casioplot_5 casioplot_fx5 

# (6) - グラフィック画面右上に [EXIT] と描画したところ:
   ここで、[EXIT] を押して下さい
casioplot_6 casioplot_fx6 

# (7) - 変数 colprint(col) で、シェルl画面に出力したところ:
   変数 col には タプル型の (0, 0, 0) が代入されている
casioplot_7 casioplot_fx7_2





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


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

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

関連記事

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

Casio Python - show_screen()

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - リファレンス 
目次
show_screen()

Python公式サイト: 
初版:2020/10/28

[対応モデル] - fx-CG50 OS3.40 以降、fx-9750GIII / fx-9860GIII OS3.40 以降

VRAMのデータをグラフィック画面 (描画画面) に転送して表示します。
引数はありません。戻り値もありません (常にNoneが返ります)。

この関数は、カシオ独自のモジュール casioplot に含まれる関数です。
このモジュールに含まれる関数を使うにはスクリプト冒頭に
 from casioplot import *
と記述します。


スクリプト例: cpSample.py のダウンロード
from casioplot import *

for j in range (64):
 for i in range (128):
  set_pixel(i, j)
  show_screen()
# (1)

for i in range(64):
 set_pixel(i*2, i, (255, 255, 255))
 show_screen()
# (2)

for i in range(1,1000):
 draw_string(0, 0, str(i-1), (0, 0, 0))
 show_screen()
 draw_string(0, 0, str(i), (255, 255, 255))
 show_screen()
# (3)

col = get_pixel(100, 0)
# (4)

clear_screen()
# (5)

draw_string(0, 0, '[EXIT]')
# (6)

print(col)
# (7)

動作:
実行結果は下記のようになります。
左にCGモデルの出力、右にFXモデルの出力を示します。

# (1) - 最初の for ループが終わったところ:
   128 ドット × 64 ドットを (0, 0) から (127, 63)  まで順に黒で塗りつぶし
casioplot_1 casioplot_1fx2 

# (2) - 次の for ループが終わったところ:
   左上 (0, 0) から右下 (127, 63) へ線分を白のドットで描画
casioplot_2 casioplot_2fx2 

# (3) - 3つめの for ループが終わったところ:
   左上に 0 から 999 まで1つづつ増やしながら逐次数値を描画
   1つ前の数値を黒で描画(消す)したのち、白で描画しています。
   FXモデルは液晶の応答性が悪いので、数字が変化するところは視認できません。
casioplot_3 casioplot_3fx2 

# (4) - (100, 0) のピクセルの色を取得して 変数 col に代入したところ:
   col には タプル型の (0, 0, 0) = 黒 が代入される

# (5) - グラフィック画面を消去したところ:
casioplot_5 casioplot_fx5 

# (6) - グラフィック画面右上に [EXIT] と描画したところ:
   ここで、[EXIT] を押して下さい
casioplot_6 casioplot_fx6 

# (7) - 変数 colprint(col) で、シェルl画面に出力したところ:
   変数 col には タプル型の (0, 0, 0) が代入されている
casioplot_7 casioplot_fx7_2





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


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

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

関連記事

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

Casio Python - CGモデルとFXモデルのPythonモードの違い

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - CGモデルとFXモデルのPythonモードの違い 
目次


初版:2020/10/25
前の記事 - 13. 10進数除算の出力と精度 |  次の記事 - 15. RGB値による色設定


14. CGモデルとFXモデルのPythonモードの違い 

これまでの記事では、fx-CG50 OS3.40 以降を前提として Casio Python のスクリプトを検討してきました。

Casio Python で使い勝手の良いスクリプトに仕上げるには、casioplot モジュールの存在が不可欠で、グラフィック画面 (描画画面) へテキストやドットを自由に出力することがポイントになります。それをサポートするためにユーザーモジュール u.py も作ってきました。

2020年10月15日に公開されたOSアップデートファイルにより、カラー高精細液晶モデル fx-CG50 のOSがアップデート可能になりました。これと同時に、2つのモノクロ液晶モデルのOSがアップデートされ casioplot モジュールが追加されました。

- fx-CG50 OS3.40 から OS3.50 にアップデート   ⇒ アップデートサイトはここを参考に
- fx-9750GIII OS3.21 から OS3.40 にアップデート  ⇒ アップデートサイトはここを参考に
- fx-9860GIII OS3.21 から OS3.40 にアップデート  ⇒ アップデートサイトはここを参考に


さて、Pythonモード搭載のモノクロ液晶モデル (fx-9750GIII, fx-9860GIII) をここでは FXモデルと、そして高精細カラー液晶モデル (fx-CG50) を CGモデルと呼ぶことにします。

結論から言えば、FXモデルPythonモードはCGモデルよりも制限があることが判りました。

この違いは、これまでにCGモデルで作ったスクリプトをFXモデルに移植する作業を行う際に見つかりました。


14.1 CGモデルからFXモデルへのスクリプトの移植
CGモデルで作成した下記2つのスクリプトをFXモデルに移植しました。以下のスクリプトファイルは、 CGモデルとFXモデルの両方に対応し、異なる解像度の画面で互換動作します。

モンテカルロ法 ver 3.1 - montec31.py      ⇒ ダウンロード
15桁対応高速素因数分解 ver 7.1 - FactorG7.py  ⇒ ダウンロード
ユーザーモジュール ver 1.5 - u.py        ⇒ ダウンロード

※ モンテカルロ法 - montec31.py - 1000回実行時の出力画面
  Monteca31_CG_1000_s  Monteca31_FX_1000_s 
  FXモデルでは1ドットが大きいので、1000回実行時のドットでかなり画面を埋めてしまいます。
  
15桁高速素因数分解 ver 7.1 - FactorG7.py - 素因数分解の出力画面
  FactorG71_CG_1_s  FactorG71_FX_1_s  
  CGモデルでは見やすくするために縦横の線分を描画しますが、FXモデルでは線分描画をせずにフォントを見やすくしました。そもそもFXモデルでは Mediumサイズのフォントは見づらいですね。

この2つのスクリプト例で CGモデルとFXモデルの両方に対応するために、以下の2点に留意しました。
1. CGモデルかFXモデルかを判定する。
2. モデル判定結果に応じて、テキストやドットの表示位置を場合分けする。

14.1.1 CGモデルからFXモードへのスクリプト移植のポイント
CGモデルとFXモデルの主な違いは、出力するグラフィック画面の解像度、つまり縦と横のドット数です。
- CGモデル: 384 ドット × 192 ドット
- FXモデル: 128 ドット × 64 ドット

従って、画面の中で同じ位置にテキストやドットを表示するためには、CGモデルとFXモデルでは指定する座標が異なります。そこで、CGモデルで作ったスクリプトをFXモデルで動作させるには座標の設定を変更すれば良いことになります。
CGモデルでの座標 (X, Y) は、FXモデルで (X//3, Y//3) と記述すれば、ほぼ同じ位置に表示できます。

演算子 // は、X//3 としたとき X を3で割った商、つまり除算結果の整数部を得る Python の演算子です。

1つのスクリプトで、CGモデルでもFXモデルでも正しく動作させるためには、CGモデルかFXモデルかを判定する必要がります。判定できれば、if 文で場合分けすれば目的を達成できます。

14.1.2 CGモデルとFXモデルの判定方法
この解像度の違いを利用して、CGモデルかFXモデルかを判定できます。casioplot モジュールで提供されている get_pixel() 関数を使う方法を考えました。get_pixel() は指定した座標の色を返します。

get_pixel() は、指定した座標が画面の範囲外の場合は None を返します。そこで、CGモデルでは存在するがFXモデルでは存在しない座標、例えば (128, 64) を指定すると、CGモデルでは意味のある値を返しますが、FXモデルでは None を返すことを利用します。

管理人は以下の関数を作って利用しました。

モデル判定関数
def isCG():
 if get_pixel(128,64)==None:
  return 0
 else:
  return 1


CGモデルで isCG() を実行すると1を返し、FXモデルでは0を返します。


14.2 FXモデルのPythonモードの制限 - バッファサイズ

上で紹介したスクリプト FactorG7.py, u.py は、スクリプトをFXモデルで開こうとすると、エラーメッセージ "Invalid Data Size" が表示されスクリプトを開けず、電卓上で編集ができません。これは、CGモデルにはない FXモデルの制限 です。編集を行うには、一旦PCに転送し、エディタでスクリプトを開いて編集できます。


14.2.1 編集できるスクリプトファイルの行数の制限 
CGモデルでは300行を超えるとスクリプトファイルを開けず、FXモデルでは150行を超えるとスクリプトファイルを開けません。
従って、上の3つのスクリプトファイルのうち、FactorG7.py と u.py は、FXモデルで開けず、電卓上で編集できません。PCに転送してエディタで編集してから電卓で動作確認を行う必要があり、かなり不便です。
オープンできるスクリプトファイルの行数は、FXモデルは最大150行、CGモデルの最大300行の半分に制限

u.py への対策
u.py からコメントの1部を削除して150行以内にしてFXモデルで開いて編集できるようにした ufx.py も同梱しました。

FactorG7.py への対策
FactorG7.py は、必要なスクリプト自体の行数が多く、コメント削除で150行以内にできないので、FXモデルで開いて編集できません。PCへ転送してエディタで編集するしかありません。


14.2.2 print() 出力のスタックサイズ
以下のスクリプトをCGモデルとFXモデルで実行してみます。

n=123
lst=list(range(n))
print(lst)


CGモデルでは n=123 までは print() でリスト lst[] を出力できますが、123を超えると MemoryEror となります。
FXモデルでは n-66 まではリストlst[] を出力できますが、66を超えると MemoryError となります。
print() 出力のスタックは、CGモデルは123バイト、FXモデルは66バイトとCGモデルの約半分に制限


14.2.3 Shell 画面出力のスタックサイズ
以下のスクリプトをCGモデルとFXモデルで実行してみます。

n=200
for i in range(n):
 print(str(n))


CGモデルでは n=200 までは shell 画面に全て表示されますが、200を超えても 200行しか出力されず、スタックの底のデータは表示されません。
FXモデルでは n=100 までは shell 画面に全て表示されますが、100を超えても 100行しか表示されず、スタックの底のデータは表示されません。
Shell 画面のスタックは、CGモデルは200行、FXモデルは100行とCGモデルの半分に制限


14.3 Casio Python自体の機能の違い

CGモデル (fx-CG50) のOSが 2020年10月15日に OS3.40 から OS3,50 へのアップデートファイルが公開されました。
同じ日に FXモデル (fx-9750GIII と fx-9860GIII) は、OS3.21 から OS3.40 へのアップデートファイルが公開されました。
そこで、CGモデルOS3.40OS3.50Casio Python の違いを調べ、次に CGモデルOS3.50FXモデルOS3.40Casio Python の違いを調べます。


14.3.1 CGモデル OS3.40 と OS3.50 の違い
実装されているクラス、オブジェクト、関数は全く同じです。
[SHIFT]-[F4] で現れるカタログ機能で OS3.40 ではリストになかった clear_screen() のみが OS3.50 で追加されました。


14.3.2 CGモデル OS3.50 と FXモデル OS3.40 の違い
実装されているクラス、オブジェクト、関数は全く同じです。

以下のスクリプトで確認できます。

ObjName.py  ダウンロード

import builtins
print(repr(builtins))
for i in dir(builtins):
 print(i)

print(repr(list))
for i in dir(list):
 print(i)

print(repr(dict))
for i in dir(dict):
 print(i)

print(repr(set))
for i in dir(set):
 print(i)

import casioplot
print(repr(casioplot))
for i in dir(casioplot):
 print(i)

import math
print(repr(math))
for i in dir(math):
 print(i)

import random
print(repr(random))
for i in dir(random):
 print(i)

CGモデルでは全てが出力されますが、FXモデルでは出力スタックが100行に制限されるので、スクリプトを適当にコメントアウトして複数回に分けて出力する必要があります。


FXモデルのPythonモードは、Pythonの開発環境としては制限が強くかなり使いづらいのですが、Casio Pythonとしての機能はCGモデルと同じです。



目 次

前の記事 - 13. 10進数除算の出力と精度

次の記事 - 15. RGB値による色設定





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


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

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


関連記事

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

Casio Python - 10進数除算の出力と精度:高速素因数分解(7)

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - 10進数除算の出力と精度:高速素因数分解(7) 
目次


初版:2020/08/24
追記:2020/10/22

前の記事 - 12. 要素数の大きいリスト |  次の記事 - 14. CGモデルとFXモデルのPythonモードの違い


13. 10進数除算の出力と精度:高速素因数分解(7) <fx-CG50 OS3.40以降>

前回は、高速素因数分解スクリプト FactorG5.py (ver 5.0) と FactorG6.py (Ver 6.0) を作りました。
FactorG6.py (Ver 6.0) はスタック不足のために実行てきないことが分かったので、FactorG5.py (Ver 5.0) が前回の成果です。

高速素因数分解 Ver 5.0 - FactorG5.py のダウンロード

Ver 5.0 で色々な入力を試していると、仕様通りに動作しないケースが見つかりました。ここで仕様とは、Casio Baisc のプログラムとできるだけ同じ動作にすることです。

例えば、Casio Basic では、計算式を入力するとその計算結果が入力される仕様になっていますが、このようにならないケースが見つかりました。これは、Casio Pythonでの10進数計算の仕様が Casio Basic と異なっているのが原因だと分かりました。

Casio Python (Python) の仕様だから、このまま受け入れることは全く問題ないと思います。但し管理人自身の興味と趣味から、できるだけ Casio Basic でのプログラムと動作が互換になるように工夫して、FactorG7.py (Ver 7.0) を作ってゆきます。


13.1 Casio Python での除算結果のデータ型
    <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

FactorG5.py (Ver 5.0) を起動して入力する時、以下のようなことがあります。

1500_10_factor 

入力時に 120/2 とすれば 整数 60 が入力されるべきところ *must be integer とエラー表示されます。同様に 15000/10 とすると 整数 1500 が入力されるはずなのに 整数でないというエラーが表示されます。つまり現在のロジックでは、小数として認識されているということです。

そこで、シェル画面で 120/215000/10 を計算させてみると、以下のような浮動小数点表示になっています。

1500_10_calc 

数値演算は内部的には2進数で実行されているので、2の乗数を2で除算する例として 256/2 を計算すると 128.0 となります。

従って、Casio Python では、除算の結果は内部2進数演算とは無関係に、必ず浮動小数点型 (float型) で出力されることが分かります。そこで、入力ルーチンを変更して、小数点以下が 0 の浮動小数点を整数に変換して、整数入力と認識できるようにしようと思います。


13.2 Casio Python での関数計算結果のデータ型 <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

Ver 5.0 の入力で、関数を使った計算結果も浮動小数点になるので、それにも対応してみます。

200_log_factor 200_cos_factor 

200*log10(10) の計算結果は整数 200 になって欲しいのですが、Ver 5.0 の入力ルーチンでは小数と判定されています。

そこで、シェル画面でこの計算を実行してみます。

200_func_calc 

すると、両方とも 200.0 と小数になっています。
Casio Python では、関数計算の結果は浮動小数点型 (float型) になっていることが分かります。

従って、Ver 5.0 の入力ルーチンを 計算結果の小数点以下が 0 の時は整数に変換し、整数入力と判定するように変更します。


13.3 Casio Python での除算計算の精度 <fx-CG50 OS3.40以降専用>

Ver 5.0 で素数 821 を入力すると、素因数として 821 1つが得られます。 

821_factor 

では、821 が計算結果になる 1642/2 を式として入力すると、以下のように小数として認識されてしまいます。

1642_div_factor 

そこで、シェル画面で 1642/2 を入力してみると、以下の計算結果となります。

1642_div_calc 

Casio Python は、小数点以下13桁目が 1 になっており、誤差が抑制されていません。内部では2進数計算を行っているので、10進数計算には必ず誤差が伴います。多くの場合では誤差がうまく抑制されますが、誤差が現れたのが今回の事例です。

CPython ではこの誤差をうまく抑制しています。Windows 10 にインストールした Python 3.6.8 での計算結果は、下記のように誤差を抑制したうえで、浮動小数点型 (float型) で出力されていることが分かります。
CPython_1642_2

NoteWindows 版 Python のインストール
Windows版 Python をインストールすると、スタートメニューには PythonIDLE の2通りの 環境があります。上で示したのは IDLE 画面です。IDEL ではスクリプトをファイルに保存したり、保存したスクリプトを読み出して実行する機能があるので、管理人は CPython の学習には IDLE をよく使います。

さて、CPython では、PCの演算仕様によりますが、多くの場合は 53桁までの精度が確保されています。一方 Casio Python は15桁の精度しかありません。

Note浮動小数点演算 - その問題と制限 (Python 公式サイト) 参照

1642/2 の計算で誤差が表面化するのは、Casio Python の限界として、受け入れるしかなさそうです。


13.4 0 および負の整数入力時の処理 <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

オリジナルの Casio Basic プログラムでは 0 以下の整数入力をチェックしてエラーメッセージを出力し、そこでプログラムを終了しています。一方、Casio Python に移植したスクリプトでは、0以下の整数入力のチェックを行っていませんでした。うっかりしていました(^_^;

そこで、今回は 0 と負の整数入力をチェックして、エラーメッセージを出力したうえで、入力ルーチンを繰り返すように修正しようと思います。


13.5 入力ルーチンの修正

以下の Ver 5.0 の入力ルーチンを修正してゆきます。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if '.' in inp:
  print('*must be integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.1 入力値が小数点以下 0 の小数の場合に処理を追加

if 文で最初に行っているのが、文字列中にコンマ . が含まれているかの判定で、ここで入力値が小数かどうかを調べています。そこで、この判定の前に、入力値の小数点以下が0の時は、入力値を整数に変換し、それを文字列変数 inp に格納する処理、具体的には以下の2行を追加します。

if frac(eval(inp))==0:
 inp = str(int(eval(inp)))


この2行の説明
変数 inp は、Input() 関数が返す値で、Input() 関数は文字列を返します。
eval()関数に 文字列変数 inp を渡すと、inp が計算式ならば、eval() 暗数はその計算結果を文字列で返します。
入力値が小数点以下 0 の浮動小数点型(float型) の数値とすると、数値から小数部を取り出す frac() に渡すと 0 を返します。 
frac() 関数はユーザーモジュール u.py で以下のように定義したものでした。
def frac(x):
 return x - int(x)

入力値が、小数点以下 0 の小数の場合は、
frac(eval(inp))==0 
True (真) となります。

これが成立するときに、小数表現の文字列 inp を整数表現に変換するため、以下のように記述します。
inp=str(int(eval(inp)))

結果出力の disp() 関数において inp 文字列変数の文字数から桁数を算出して表示しているので、ここで inp変数を更新しておく必要があります。

これまでに修正したスクリプトは以下になります。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:   ◀ 追加
  inp str(int(eval(inp)))  ◀ 追加
 if '.' in inp:
  print('*must be integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.2 入力値が負の数値の場合の処理

inp は入力を文字列にしたものです。

inp にコンマ . が含まれるかどうかで、inp が小数かどうかを判定しています。そこで、小数かどうかの判定の if 文に続き elif 文で inp にマイナス記号 - を含むかどうかで、入力が負の数値かどうかを判定します。

 elif '-' in inp:
  print('*must be positive\n integer')
  continue


これを追加して、入力ルーチンは以下のようになります。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:                ◀ 追加
  print('*must be positive\n integer')  ◀ 追加
  continue                  ◀ 追加
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.3 入力が 0 の時の処理

Ver 5 の入力ルーチンを修正してこれまでに得られたスクリプトでは、入力が 0 以上の整数の場合の処理は、上で追加した elif 文の次に続く以下の部分です。入力の文字列 inp に小数点のコンマ . を含まず、負の記号 - を含まないとき、以下のように .isdigit() 関数を用いて数値であるかどうかを判定しています。

 elif inp.isdigit():
  if len(inp)>digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f=int(inp)
   break

inp.isdigit()True (真) の時、さらに文字列の長さが digit (15桁) を超える時は、15桁以内で入力するようエラーメッセージを表示したのち、入力ルーチンを繰り返します。15桁以内の場合は、else 節において文字列 inp を 整数 f に変換してから break により入力ルーチンのループから脱出し、素因数分解ルーチンへ移ります。入力ルーチンの中の if 文による条件分岐で、この時のみ break でループから脱出し、それ以外は continue でループを継続するようにしています。

さて、この else 節で行う文字列 inp を整数 f に変換するところで、入力が 0 の時の処理を行います。
f は整数変数なので、f が 0 でない時 (f != 0) は 適切な整数入力値だと判定し break でループを脱出、そうでない時は continue でループを継続するようにします。

具体的には、else 節に追記 (赤文字) して以下のようにします。

 else:
  f=int(inp)
  if f != 0:
   break
  else:
   print('*must be positive\n integer')
   continue


以上を反映した入力ルーチンを示します。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:
  print('*must be positive\n integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   if f != 0:                  ◀ 追加
    break
   else:                    ◀ 追加
    print('*must be positive\n integer')  ◀ 追加
    continue                  ◀ 追加
 else:
  continue


以上で、Casio Basic 版とほぼ同じ入力仕様に修正できたと思います。


※ 高速素因数分解:15桁入力対応、Casio Baisc 版とほぼ同じ入力仕様版
  - FactorG7.py のダウンロード


fx-CG50 Pythonモード:高速素因数分解 - FactorG7.py
"""Sample script

 Exercise;
 ported from Casio Basic
 "Prime Factor 15 digits"
  factorG.py
   ver 7.0

 by Krtyski/e-Gadget
"""

from u import *
digit 
15
search 0

def disp():
 global aefz
 clear_screen()
 locate(00f3'm'0)
 locate(160': ' str(len(inp)) + ' digits'3'm'0)
 locate(16, 11, 'search:'+str(search), 2, 'm', 0)
 line(0,15,383,15,1,0)
 for i in range(115):
  if<= e:
   dx int(i/12)*16
   dy int(i/12)*11
   locate(0+dxi-dyz[i], 1'm'0)
   locate(10+dxi-dy'^('2'm'0)
   locate(12+dxi-dyz[i+21], 1'm'0)
   locate(15+dxi-dy')'2'm'0)
 locate
(00''0'm'1)


while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:
  print('*must be positive\n integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   if f != 0:
    break
   else:
    print('*must be positive\n integer')
    continue
 else:
  continue

list(range(23))
for e in range(1,23):
 z[e0
0
f
int(sqrt(a))

prime_list [2,3,5,7,11]
for b in prime_list:
 search+=1
 d a/b
 if frac(d)==0:
  e+=1
  z[e] = b
  while 1:
   a int(d)
   z[e+21]+=1
   d a/b
   if frac(d):
    break
  c int(sqrt(a))
 ifcbreak


increment = \
[4,2,4,6,2,6,4,2,
 4,6,6,2,6,4,2,6,
 4,6,8,4,2,4,2,4,
 14,4,6,2,10,2,6,6,
 4,2,4,6,2,10,2,4,
 2,12,10,2,4,2,4,6,
 2,6,4,6,6,6,2,6,
 4,2,6,4,6,8,4,2,
 4,6,8,6,10,2,4,6,
 2,6,6,4,2,4,6,2,
 6,4,2,6,10,2,10,2,
 4,2,4,6,8,4,2,4,
 12,2,6,4,2,6,4,6,
 12,2,4,2,4,8,6,4,
 6,2,4,6,2,6,10,2,
 4,6,2,6,4,2,4,2,
 10,2,10,2,4,6,6,2,
 6,6,4,6,6,2,6,4,
 2,6,4,6,8,4,2,6,
 4,8,6,4,6,2,4,6,
 8,6,4,2,10,2,6,4,
 2,4,2,10,2,10,2,4,
 2,4,8,6,4,2,4,6,
 6,2,6,4,8,4,6,8,
 4,2,4,2,4,8,6,4,
 6,6,6,2,6,6,4,2,
 4,6,2,6,4,2,4,2,
 10,2,10,2,6,4,6,2,
 6,4,2,4,6,6,8,4,
 2,6,10,8,4,2,4,2,
 4,8,10,6,2,4,8,6,
 6,4,2,4,6,2,6,4,
 6,2,10,2,10,2,4,2,
 4,6,2,6,4,2,4,6,
 6,2,6,6,6,4,6,8,
 4,2,4,2,4,8,6,4,
 8,4,6,2,6,6,4,2,
 4,6,8,4,2,4,2,10,
 2,10,2,4,2,4,6,2,
 10,2,4,6,8,6,4,2,
 6,4,6,8,4,6,2,4,
 8,6,4,6,2,4,6,2,
 6,6,4,6,6,2,6,6,
 4,2,10,2,10,2,4,2,
 4,6,2,6,4,2,10,6,
 2,6,4,2,6,4,6,8,
 4,2,4,2,12,6,4,6,
 2,4,6,2,12,4,2,4,
 8,6,4,2,4,2,10,2,
 10,6,2,4,6,2,6,4,
 2,4,6,6,2,6,4,2,
 10,6,8,6,4,2,4,8,
 6,4,6,2,4,6,2,6,
 6,6,4,6,2,6,4,2,
 4,2,10,12,2,4,2,10,
 2,6,4,2,4,6,6,2,
 10,2,6,4,14,4,2,4,
 2,4,8,6,4,6,2,4,
 6,2,6,6,4,2,4,6,
 2,6,4,2,4,12,2,12
]

while 1:
 for i in increment:
  search+=1
  b+=ia/b
  if frac(d)==0:
   e+=1
   z[e] = b
   while 1:
    a int(d)
    z[e+21]+=1
    d a/b
    if frac(d):
     break
   c int(sqrt(a))
  ifcbreak
 ifc
break

if a 1:
 e+=1
 z[e] = a
 1
 z[e+11] = 
1

disp
()


13.6 完成した FactorG7.py の動作確認

120/2 と入力すると、計算値 60 が入力され、正常に素因数分解されます。
60_factor 

15000/10 と入力すると、計算値 1500 が入力され、正常に素因数分解されます。
1500_factor 

200*log10(10)200*cos(0) と入力すると、計算値 200 が入力され、正常に素因数分解されます。
200_factor 

1642/2 と入力すると、Casio Python の計算精度の制限により、計算結果が 821.0000000000001 となり、整数でないのでエラー表示の上入力ルーチンが継続されます。
1642_div_factor 1642_div_calc 

この問題は Casio Basic では発生しません。Casio Python の内部2進数演算が15桁の精度では、誤差が抑制しきれていないという仕様が明らかになりました。

[2020/10/11 追記]
但し、1642/2 と入力する代わりに Python の演算子を使って 1642//2 と入力すれば、その計算結果は 821 となるので、問題は解消されます。

なお、1642/2 と入力する必然性はなく、821 と入力すれば問題無く素因数分解できるので、大きな問題ではないと考えます。今後は、スクリプトの目的に応じて10進数の除算の誤差について留意する必要があります。




目 次

前の記事 - 12. 要素数の多いリスト

次の記事 - 14. CGモデルとFXモデルのPythonモードの違い





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


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

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

関連記事

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

Casio Python - 入出力

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - Casio Python の入出力:プログラムのデザイン 
目次


初版:2020/06/20
追記:2020/10/20
前の記事 - 2. Casio Python とは? |  次の記事 - 4. Casio Python への移植


3. Casio Python の入出力:プログラムのデザイン

Casio Python の標準入出力はシェル画面です。それに加えて、グラフィックス画面が出力先として使えます。


3.1 入力 - input() <fx-CG50, fx-9750GIII, fx-9860GIII OS3.40以降>

Casio Python で入力を行うのは、input() 関数のみです。
これだけ覚えておけば、入力処理が可能です。

input() 関数で取得できるのは数値と文字列のみです。input() 関数が実行されると、入力待ちとなり、キー入力を行った後[EXE]キーを押して入力確定となり、処理が次に進みます。

Note: Casio Python の制限
input() による数値や文字列の取得以外に、電卓にある多くキーが押されたことを取得するのは、今のところ Casio Python ではできません。プログラムが動作中にキー入力により処理を変更することはできないので、リアルタイムのキー入力を可能にする機能追加が大いに待たれます。


3.2 出力 - print() と グラフィックス出力関数
   <fx-CG50, fx-9750GIII, fx-9860GIII OS3.4以降>

Casio Python で可能な出力先は、シェルとグラフィックス画面(描画画面)です。
マニュアルでは描画画面と書かれていますが、ここではグラフィックス画面と言うことにします。

シェル画面への出力は、print() 関数のみです。

グラフィックス画面への出力は、あとで追加された casioplot モジュールで提供される set_pixel()draw_string()show_screen()、そして clear_screen() が使えます。clear_screen() は、OS3.40 では隠し関数でしたが、OS3.50 で公式になりました。詳しくはマニュアルを参照してください。Casio Python では、グラフィックス出力を優先的に考えているように思われます。

Note: シェル画面とグラフィックス画面の切り替え
画面にデータを出力するとき、先ずVRAMメモリに出力データを書き込み、次にそれを画面に転送します。

print() 
関数は、VRAMへの書き込みとシェル画面への転送をまとめて実行します。
グラフィックス関数 set_pixel()draw_srting() はVRAMへの書き込みだけを実行し、VRAMからグラフィックス画面へ転送するには、show_screen() を実行する必要があります。

グラフィックス出力関数を実行すれば、グラフィックス画面に切り替わります。シェル画面に切り替えるには print() (パラメータ無し) を実行します。これらの画面切り替えを行うための 電卓のハードウェアキー (Casio Basic[F6] キーのようなもの) は、割り当てられていません (OS3.40)。


3.3 Casio Python で作るプログラム <fx-CG50 OS3.40以降専用>

入力がシェル画面でしか行えない現状は、実用的なスクリプトを作る上で極めて大きな制約になります。そこで、最初にシェル画面でスクリプトを実行するに際して必要な入力実行させ、その後グラフィックス画面に切り替えて、テキストやグラフィックスの出力を行うのが、現行仕様の Casio Python では最善の方法だと思います。

この方針で、以前 Casio Basic で作ったモンテカルロ法による円周率計算のプログラムを、Casio Python に移植してみました。
オリジナルの Casio Basic プログラムについては、fx-9860GII モンテカルロ法 をご覧下さい。


Monte Carlo Method by Python ver 1.0: monteca1.py のダウンロード

入力と出力を切り替える方法で以下のように Casio Python に移植しました。

起動直後は、シェル画面でシミュレーション回数を指定するようにしました。デフォルトで500回です。ここで、10000 と入力して、[EXE]キーを押します。
monteca_first_screen monteca_10000_start 

すると、グラフィックス画面への出力に移行します。
monteca_500 monteca_3193 

500回、3193回と、点が増えてゆきます。

monteca_7639 monteca_10000 

実際の動作をみると、Casio Python の処理速度が高いことがよく分かります。





Casio Basic のコードを Casio Python に移植しながら、Casio Python について調べた結果を、次回はざっくりと紹介しようと思います。



目 次

前の記事 - 2. Casio Python とは?

次の記事 - 4. Casio Python への移植





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


 


keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

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

関連記事

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

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

やす (Krtyski)

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


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

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

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


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR