e-Gadget - プログラム関数電卓 Casio Python

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

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


初版:2020/08/24
追記:2020/10/22
修正:2023/10/09

前の記事 - 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 のダウンロード [2023/10/09 リンク先が違っていたのを修正]

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)
   if i==12:
    line(190,15,190,191,1,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 を使ってみる
     - はじめに:電卓で作る初めてのスクリプト 
目次


初版:2020/06/13
追記修正:2020/10/20
修正:2023/04/21

前の記事 - 0. Casio Python のポテンシャル 次の記事 - 2. Casio Python とは?


対応機種:fx-CG50, fx-9750GIII, fx-9860GIII


1. はじめに: 電卓で作る初めてのスクリプト

先ずは、カシオのプログラム電卓を使って実際に Pythonスクリプトを作ってみます。


1.1 Casio Python での初めてのスクリプト
半ばお約束のようですが、画面に Hello Casio Python と表示させるスクリプトを作ります。

Casio Python では(一般の Python でも)、

 print('Hello Casio Python')

と1行だけで文字列の出力ができます。

ところで、カシオ電卓搭載の Casio Basic では、
 "Hello Casio Basic"
あるいは
 Locate 1,1,"Hello Casio Basic"
と、1行書くだけで、文字列を表示できます。アドイン版超高速Casio Basicである C.Basic も同様です。


さて、他の多くの言語では、標準出力(コンソール)に文字列を出力するコードは、シンプルに1行で書けないのです。
例えば、C言語でコードを書いてみます。

#include <stdio.h>
int main(void) {
 printf("Hello C");
 return 0;
}


C# で書くと、

using system;
namespace Hello
{
 class program
 {
  static void Main()
  {
   System.Console.WriteLine("Hello C#");
  }
 }
}

まぁ、C# は、実際はに全て自分でコーデイングしないで、殆どが開発環境で自動作成されるので、これを引き合いに出すと C# に申し訳ないとは思いますが、いずれにせよオブジェクト構造を意識して、様々なメソッドや関数を繋いでコーディングする必要があります。

このように、Python は1行でシンプルに記述できます。Python のシンプルさを強調したいので、驚かすために意図的に上の例を出しました。眺めて「わっ、大変そうだ」と感じて頂くだけで結構です(^_^;

Casio Python は、本来の Python (CPython) のサブセット版で、提供されている機能が大幅に制限されています。やりたいことができないもどかしさを感じますが、逆に考えると Casio Python は覚えることが少ないので、覚えやすいと言えます。

以下では、文字列を出力するシンプルな1行のスクリプトを書くため、電卓の操作方法を説明します。初めて電卓でスクリプトを書くことを前提にして、とても細かく書いてゆきます。


1.1.1 fx-CG50 の準備
このグラフ関数電卓が必要です。
ちなみに各モデルの価格動向を何年もモニターしてきていますので、参考になさってください。
 ⇒ Casio プログラム電卓の価格動向
1~2万円程度の買い物になります。

あるいは、モノクロ液晶のグラフ関数電卓 fx-975GIIIfx-9860GIII でも Casio Python が使えますが、これらは日本国内では正規品として販売されておらず、Amazon USA / Amazon France や eBay / セカイモンなどで海外から取り寄せる必要があります。


1.1.2 Casio Pythonの起動
電源を入れ、[MENU]キーを押してメニュー画面を表示して、Python を選んで [EXE]キーを押します。
menu_python
   ↑
 これを選択


Casio Python の最初の画面
このように スクリプトファイル専用フォルダの作成を推奨します。
Python_folder 

Casio Pyhton を開くと、最初にルートが表示されます。そのままスクリプトファイルを保存すると、保存先はルートになります。ところが、ルートにはアドインプログラムのファイル(拡張子が g3a のファイル)もあります。

もし C.Basic を使っていると、プログラムファイルの保存先は、デフォルトでルートになります。管理人は C.Basic プログラムファイル専用のフォルダをルートに作って、そこに保存するように設定しています。

PCとリンクして、電卓内のファイルをPC上で整理するとき、それぞれのファイルが専用フォルダに保存されていると、間違いが起きません。ルートにあるのはアドインファイルのみというのが、理想的だと思います。

これから色々と多くのスクリプトを書いてゆくので、スクリプトファイル(pyファイル)を保存する専用フォルダを作るのをお勧めします。管理人は @Python フォルダを作っています。

さて、電卓内に新たにフォルダを作るのは、電卓だけではできず、PCを利用しなければなりません。
まず、電卓をPCとリンクします。すると、エクスプローラ(ファイルマネージャー)では電卓が新たなドライブとして認識されます。電卓のドライブを開いて現れるのが電卓のルートで、そのルートに新たなフォルダを作ります。

スクリプト専用フォルダを作ったら、Casio Python のファイルリスト画面で専用フォルダにカーソルを合わせ、[EXE]キーを押すと、スクリプトファイルの一覧が現れます。初めての場合は、フォルダの中は空です。

in_the_python_folder 

このように多くのファイルができてくると、カーソルキーでファイルを探すのが面倒になります。そこでAPHAモードにしてから、探したいファイル名の頭のアルファベットを1文字押すと、それから始まるファイルにジャンプするので便利です。


1.1.3 スクリプトファイルの作成
ここで、[F3] (NEW) を押して、新しく hello というファイル名を入力します。
create_hello_file2  

そして[EXE]キーを押せば、スクリプト編集画面が表示されます。
blank_script_editor2  


1.1.4 スクリプトの作成
ここに、以下の1行を入力します。

print('Hello Casio Python')

Casio Python では、アルファベットや数字記号を1つづつ入力します。
画面下にファンクションメニューがあり、これが役立ちます。[F6] (▷) を押すことで2組のファンクションメニューが切り替えられます。なかでも SYMBOL と OPERT が役立ちます。

さて、1文字づつ入力するよりも楽な入力補助機能があります。
何も入力が無い状態で、[SHIFT][4] (CATALOG) を押すとカタログ機能が現れます。
catagog_1 

print() を探すために、[4] (P) を押すと 右上の [   ]に p と表示され、p で始まるキーワードにジャンプするので、print() にカーソルを合わせます。
catalog_2 

ここで、[F1] (INPUT) を押せば、print() が入力できます。

print_1_2  

今の目的は、print('Hello Casio Python') と入力することでした。あとは、( ) の中に
'Hello Casio Python' と追記すれば完成です。

ファンクションメニューで [F3] (SUMBOL) を押し、さらに [F6] (▷) を押すと、ファンクションメニュー[F2] ( ' ) が見つかりますので、これを2回押せば ' ' と入力できます。
print_2_2  

ファンクションメニューの SYMBOL は、使ってみると便利です。
アルファベットを入力するときは、[SHIFT][ALPHA] を押して ALPHAモードにします。その時 ALPHAモードを解除しないと入力できない記号が、SYMBOL で入力できるようになっています。

あとは、'' の間に Hello Casio Python と入力します。アルファベットの入力は慣れるしかありません。

ALPHAモード
 小文字モード

  ↓
hello_1_2 hello_2_2 

ALPHAモードになると、画面左上に赤い小さなアイコンで ALPHAモードであることを示してくれます。さらに 小文字の a が表示されていれば小文字モード、大文字の A が表示されていれば大文字モードだと分かります。

Casio Python ではデフォルトで小文字モードになります。[F5] (A⇔a) を押せば 大文字と小文字の切り替えができます。


1.1.5 スクリプトの実行
これで、スクリプトの入力が終わったので、これを実行してみます。
[F2] (RUN) を押せば、スクリプトが実行されます。

スクリプトを新たに書いたり、変更した後に [F2] (RUN) で実行しようとすると、ファイルを保存するかどうかを尋ねるポップアップが現れます。
save_popup2  

ここで、[F1] を押して保存します。すると実行画面が現れます。
hello_run2  

なんだか、ゴチャゴチャした画面になっています。
今回の hello.py を実行した結果は、4行目にあります。

1行目と2行目では、Casio PythonMicroPython ver 1.9.4 をベースに作られていることを示しています。オリジナルの著作権表示のようなものでしょう。

この画面は、シェルと呼ばれる Python の標準的な出力画面です。Windows のコマンドプロンプト画面のようなもので、コマンドを入力すれば結果を出力する対話型画面になっています。

>>> がプロンプトで、ここにコマンドを入力すると、結果が表示される仕様になっています。

矢印キーで3行目にカーソルを持って行くと、
>>>from hello import *
と出力されていることがわかります。
これは、"hello.py をインポートする" という意味で、その下の4行目に実行結果である
Hello Casio Python
が出力されていることがわかります。

[2020/06/15 追記修正]
では、シェルから hello.py を起動してみましょう。
@python フォルダにカーソルを合わせて[EXE}キーを押して、hello.py が一覧で表示されるようにします。
そして、[F4] (SHELL) を押してシェルを表示します。

ここで、プロンプト >>> のあとに
from hello import *
と入力してみます。
ファンクションメニューが使えないので [F5] (A⇔a) と [F6] (CHAR) のみを使って入力します(できます))。

そして、[EXE} を押すと 
Hello Casio Python
と出力されるので、シェルから hello.py を実行できることが分かりました。

起動したスクリプトのあるフォルダに移動してからシェルを起動すると、そのフォルダにあるスクリプトが実行できます。
=== [2020/06/15 追記修正 ここまで ===

文字列出力のスクリプトが正しく動作したことが確認できました。hello.py の完成です!


1.2 シェル画面
シェルで、プロンプトに続いて、
>>>print('Hello Casio Python')
と直接入力し、
prompt_hello_1_2 prompt_hello_2_2 

[F1] (RUN) を押すと、Hello Casio Python と出力されます。
prompt_hello_output2   

但し、シェルで入力するのは、ファンクションキーが無いのでちょっと面倒です。[SHIFT][4] (CATALOG) の入力補助機能は使えます。

このようにシェルは、1行入力し、結果を出力する対話機能を提供していることが分かります。

ところで、スクリプト一覧の画面(スクリプト リスト画面)のファンクションキーに [F4] (SHELL) があります。
in_the_python_folder 

[F4] (SHELL) を押すと、先ほどのシェル画面に切り替わります。

何も知らない状態で初めて使う時は、Casio Python の操作は、結構面倒に感じるかも知れません。そこで今回は、できる限り詳しく解説してみました。何か分からなければ、もう一度読めば思い出せると思います。

操作に慣れてくれば、Casio Python の操作自体は簡単に感じるようになると思います。

一方、スクリプトを書く時の英数記号の入力も慣れるまでは面島に感じるでしょう。PCなどのキーボードを初めて使った時も、おそらく忘れているとは思いますが、大変だったはずです。Casio Python のスクリプトを毎日少しづつでも、繰り返し入力すれば、慣れると思います。管理人自身がそうやって慣れました。


1.3 スクリプト作成と編集の2つの方法
Casio Python のスクリプトは、英数記号のアスキー文字だけで構成される仕様になってます。スクリプトが実行されるとき、アスキー文字の文字列を読み取り、字句解釈が行われCPUが理解できる内容に変換しています。これが一般的に Python の特徴です。なので同じスクリプトが PCでもMACでもLinuxマシンでも、Rasberry Pi のようなボードコンピュータでも、Python を組み込んだ機器でも動作するわけで、その流れの中で 電卓でも動作するわけです。

ちなみにCasio Basic (C.Basic 含む) では、コマンドや構文を入力するにはメニューから選んで入力しなければならず、アルファベットを1つづつ入力するとコマンドや構文として認識されません。これは Casio Python との大きな違いです。

Note: Python スクリプトファイルの正体
Casio Basic ではプログラムコードに直接Operation Codeを書き込む仕様になっているので、メニューから選んで Operation Codeを書き込む必要があります。一方、Casio Python は実行時にOperation Codeに変換するので、スクリプトファイルにはアスキーコード(テキストファイルで表示可能な英数記号) のみを書き込む仕様になっています。

Casio Python のスクリプト作成で、入力を楽にする方法が2つあります。1つはカタログ機能の利用で、もう1つはテキストエディタを利用することです。PCでテキストエディタを使う時は、キーボード入力が楽である上に、カット&ペーストが使えるので便利に感じることでしょう。

カタログ機能による入力補助
スクリプト編集画面で [SHIFT][4] (CATAGOL) と押すと、Casio Python で使うワードの一覧がアルファベット順に現れます。[F6] (CAT) を押すとカテゴリ一覧になるので、そこで入力したワードのカテゴリを選ぶと検索が楽になります。検索したいワードの頭から順に入力してゆけば、絞り込みが行われるので便利です。目的のワードにカーソルを移動してから [F1] (INPUT) を押せば、スクリプト編集画面にそのワードが入力されます。

PCでスクリプトファイルを編集する
Casio Pythonスクリプトファイルはアスキー文字しか含まないので、テキストファイルとしてPCで編集できます。Windows標準の "メモ帳" はテキストエディタですが、拡張子が txt でないとダメです。スクリプトファイルの拡張子 py を一旦 txt に変更し、スクリプト編集後保存し、最後に拡張子を txt から py に戻す手間が必要になります。拡張子が py のままで編集・保存ができるテキストエディタは豊富にあるので、そのようなものがお勧めです。

とにかくPCで編集できるのは大変便利です。管理人は ある程度まとまった Casio Python のスクリプトを新たに作るとき、PCで書き始めることが多いです。

そして、Microsoft が無償提供している Visual Studio Code をとりあえずお勧めします。Pythonで使う様々なキーワードを、種類ごとに色分けしてくれる機能を簡単に設定できるのが良いところです。他のテキストエディタでも同様の機能があれば、それが良いと思います。

余計な機能がたくさんありすぎて、Casio Pythonスクリプトの編集のためだけに使うには下記の2つの拡張機能をインストールするだけで十分です。
 Python - IntelliSense (Pylance), Linting, Debugging (multi-thread, remopte),
  Jupyter Notebooks, code formating, refactoring, uinit tests and more.
 Japanese Languare Pack for Visual Studio Code
特に InteliSense 機能は、スクリプトの色分け、入力補助、エラー表示など、便利なものが多いです。

Casio Python 独自の casioplot モジュールがあり、比較的よく使うと思います。この独自モジュールに含まれる関数は一般のPython (CPython や uPython) では使わないので Visual Studio Code の拡張機能は、casioplot モジュールをサポートしていません。そうはいっても、casioplot 以外には InteliSense 機能はとても助かります。

そもそも Visual Studio Code から casioplot モジュールを使ったスクリプトを実行することはできず、上記2つの機能以外に導入しても意味がありません。

少々オーバースペックかも知れませんが、Visual Studio でのプログラミング経験がある方には良い選択でしょう。

Note: Visual Studio Code について
  • Visual Studio Code のダウンロードはここからどうぞ。ダウンロードのページにある "Download for Windows / Stable Build" のアイコンやその右にある矢印ボタンをクリックすればダウンロードできます。引き続いてインストールできます。
  • 当然日本語化できます。詳しい方法はこちらからどうぞ。
  • 最初に起動したとき、あるいは Help - ようこそ を選ぶと ”ようこそ" 画面が現れます。ここで、カスタマイズ - ツールと言語 から Python を選んでインストールしておくと良いと思います。理由はいくつかありますが、少なくとも Python のキーワードを色分けして表示する機能は便利です。色分けは Casio Python の編集画面とは異なりますけど...また、編集後に保存する際、スクリプトファイルで推奨されるテキストファイル形式にしてくれるのも安心です。
  • 管理人は、カスタマイズ - 配色とテーマ から、配色テーマを選択して使っています (下記参照)。
  • Visual Studio Code を使っていると "このファイルの種類は、'Python' 拡張機能をお勧めします" というポップアップが頻繁に現れますが、Casio Python スクリプトに編集には必要ないと思うので毎回 × を押してポップアップを消しています。
  • Casio Pythonスクリプトの編集のためだけに使うのなら、上記2つの拡張機能だけで十分。いちいちポップアップが現れてうるさいでしょうが、それ以上は敢えて何も導入しないのが良いと思います。
  • Visual Studio Code には InteliSense 機能があり、Pythonスクリプトを書いている時に色々とアドバイスが貰えるので、これは便利だと思っています。
  • Visual Studio Code に関する詳しい説明は ここ が分かりやすいと個人的に思います。
  • 管理人は Visual Studio Code 推しですが、皆様が良いと思うテキストエディタを使えば良いでしょう。
VS_Code_example 
管理人が使っている Visual Studio Code の配色テーマ:Solarized Light 



目 次

前の記事 - 0. Casio Python のポテンシャル

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





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




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

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

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

Casio Python のポテンシャル

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - Casio Python のポテンシャル
目次


初版:2020/06/07
更新:2020/06/29
更新:2020/11/03
更新:2021/03/25
修正:2023/04/21

 次の記事 - 1. はじめに:電卓で作る初めてのスクリプト



カシオ・グラフ関数電卓にある Pythonモード - Casio Python

[2020/11/03 更新]
カシオグラフ関数電卓に Pythonモード <パイソン・モード> が搭載されるようになり、casioplot モジュールが追加されたので、それで遊んでみようと思います。Casio Basic やPCでのプログラミング経験があれば、Casio Python は意外に敷居が低いかも知れません。

管理人はネットでチョコチョコっと調べながら、結構使えています。そこで、 プログラミング経験はあるが Python 初心者の人向けに Casio Python のサンプルプログラム作成の連載をしばらくやってみようと思います。Casio Basic プログラムを Casio Python へ移植することからスタートし、Python らしいスクリプトの書き方の紹介へ進んでゆく予定です。併せて、Casio Python のリファレンス情報、特に Casio Python 特有の仕様があれば、それを公開してゆこうと思います。

本連載の全体像は 目 次 をご覧ください。

さて、Casio Python の連載は、管理人がそのポテンシャルの高さに驚いたことが全ての始まりなので、今回はそのあたりを紹介します。
==== 2020/11/03 更新ここまで ====


0. Casio Python のポテンシャル

Python の準備

Casio Python 搭載モデルの準備
Casio Python
搭載電卓を入手して、必要に応じてOSのアップデートをします。
現時点では casioplotモジュールが追加された fx-CG50 OS3.40 以降を強くお勧めします。

ちなみに、Casio Python が搭載されているのは、以下のモデルです (2020/06/07 現在);
fx-CG50, OS3.20 以降
fx-9750GIII, OS3.21 以降 (北米限定発売モデル)
fx-9860GIII, OS3.21 以降 (ヨーロッパ限定発売モデル)
GRAPH 90+E, OS3.20 以降/ GRAPH 35+EII, OS3.21 以降 (フランス専用モデル)
 それぞれが fx-CG50fx-9860GIII と同じ

[2020/10/22 追記]
Pythonモードで実用的なプログラムにするにはグラフィックモジュール casioplot が不可欠です。casioplot は OSアップデートで追加するしかありませんが、それが可能なのは下記のモデルとOSバージョンです (2020/10/15 現在)
 fx-CG50, OS3.40以降     このモデルの概要 
fx-9750GIII, OS3.40以降    このモデルの概要 
fx-9860GIII, OS3.40以降    このモデルの概要 
 GRAPH 90+E, OS3.40以降
 GRAPH 35+EII, OS3.30以降

fx-CG50 のOSは、2020/10/15 時点で OS3.50 にアップデート可能です。OSアップデートは、それぞれのモデルが発売されている地域のカシオサイトからアップデートファイル と アップデートされたマニュアルが入手できます。具体的なアップデートサイトについては上記の "このモデルの概要" ページで紹介しています。

Pythonモードでは、casioplotモジュールを使わないと、思うような出力ができる実用プログラムになりません。本連載は主に fx-CG50 OS3.40以降を前提にして進めてゆくつもりです。但し、モノクロ液晶搭載モデル fx-9750GIII や fx-9860GIII の Pythonモードに casioplot を追加するOSアップデートファイルが 2020/10/15 に公開されたので、これらをアップデートした Casio Python についても紹介する予定です (目次参照)。

 fx-CG50, OS3.40以降: 日本語マニュアルがあり国内どこでも入手できます。
 fx-9750GIII, OS3.40以降: 最安値のモデルです。国内でもAmazon USAで購入可で安価(英文マニュアル)。
fx-9860GIII, OS3.40以降: ヨーロッパ専用モデル。ほぼ同じ機能の fx-9750GIII をお勧めする。

モノクロ液晶搭載モデルのうち、現状最も安価に入週できる fx-9750GIII も無視できないとことがあります。これらモデルの Pythonモードはメモリの制限が強く、使い勝手が fx-CG50 よりも悪いのは残念です。

さて、Pythonモードのアップデートにより新機能や新モジュールが追加された場合は、随時 対応することにします。


Python スクリプト保存フォルダの作成
工場出荷状態では、ストレージメモリのルートにスクリプトファイルが保存されるようになっています。

これから多くのスクリプトファイルを作ってゆくので、ストレージメモリ直下に専用フォルダ、例えば @Python フォルダを作ると良いと思います。電卓内に新たなフォルダを作るには、PCとリンクしてからエクスプローラで電卓の内部を表示して、そこでフォルダを作ります。もし C.Basic を既にお使いの場合は、C.Basicプログラム専用フォルダを作り、そこへ移動しておくことも合わせてお勧めします。これで Python スクリプトと C.Basicプログラムが混在することを防げます。


Python スクリプトファイルの正体
スクリプトファイルは、アスキー文字で書かれたテキストファイルです。Python の構造制御に不可欠なインデントは半角スペースです。電卓上でスクリプトを書く場合、自動インデント機能によりスペース2個が付加されます。また、改行は Windows標準の CR LF (0x0d 0x0a)になっています。

PCに転送すれば、テキストエディタを用いて、スクリプトの確認や編集ができます。PCで編集する場合は、アスキーコード以外を入力しないように留意しましょう。



Casio Python とは? [2023/04/21 修正]

Casio Python は、カシオグラフ関数電卓にある Pythonモードを指します。ある程度の関数があらかじめビルトインされていますが、追加ビルトインするモジュールはカシオから提供されていません。自分で作った関数をモジュールとして使うことはできます。Casio Basic では自分で関数を作って使うことはできないので、その分 Casio Pythonは使い勝手が良いと言えます。

Pythonモードが公開された当初は、mathモジュールとrandomモジュールが追加された状態でした。その後 casioplotモジュールが追加されて、ようやくグラフィック描画が可能になりました (fx-CG50, fx-9750GIII, fx-9860GIII)。但し、ピクセル単位でドットを描画すること、ピクセルの色を得ること、テキスト文字を表示することのみができる程度で、Casio Basic のようにグラフを自在に描く機能はまだ公開されていません。今後カシオからさらに新しいモジュールが提供されることを期待しています。汎用的に使える自作関数を複数まとめて1つのモジュールにして、それを使うことも紹介してゆきます。

ところで、Casio Basic で書いたものはプログラムと言い、そのファイルをプログラムファイルと言っています。一方、Python については、取扱説明書の表現によれば、スクリプトを書いて、スクリプトファイルに保存する、と言っているので、本連載でもこの表現を使ってゆきます。

Python は機械学習やDeep Learningで多用されている言語で、"1つのことをするには1つの書き方しかない" といったポリシーで、分かりやすく使いやすいことを目指して作られた言語です。様々な専門分野に特化したライブラリ(=モジュール)が様々な人によって多く提供されるようになり、初心者でも専門家でも使いやすい言語して大きな広がりをみせています。また、Webサービスでも使われています。Pythonを使えるようになるのは、今後を考えると有意義なことだと思います。

Casio Python は組込用Pythonである Micro Python Ver 1.94 がライセンスされ、カシオがカスタマイズして電卓に組み込んだものなので、一般にPCで使われている Python (CPython) に比べて Casio Python は機能が限定されています。

実際に管理人がCasio Pythonを使い始めて感じるのは、提供されている機能が限定されているので、覚えることが少なくて、理解が容易だということです。カシオ電卓に搭載されている Python は、一般のPythonのサブセット版ですが基本仕様は損なわれていないので、Python の味見用のお試し版、学校での学習用として使えるかもしれません。

Casio Basic を使いこなして作ったプログラムを Casio Python に移植しようとすると、機能不足、関数不足のために、どうしても移植できないプログラムがあります。Casio Basic と同じ事を実現するために必要不可欠な機能が Casio Python にはまだ揃っていないのは残念なことですが、それなりに工夫すれば楽しく使えると思います。
例えば、Casio BasicGetkeyLocate に相当するものが Casio Python にはありません。
Getkey ⇒ これは、どうにもなりません。カシオさんお願い...
Locate ⇒ locate() 関数を自分で作り使用中 ⇒ ユーザー関数 locate()

ところで、Python はオブジェクト指向言語の一種で、object クラスのメンバーを呼び出す object.method といった記述が必要なケースもありますが、クラスやメソッドをあまり意識しないで、手続き型言語のように使える側面もあると思います。特に Casio Python ではほとんど手続き型言語のように使っても、とりあえずスクリプトが書けると思います。マニュアルの記述にもオブジェクトやメソッドという単語が殆ど出てこず、関数という表現が多用されています。



Casio Python の潜在能力 - fx-CG50 OS3.40以降

純正Casio Basic のプログラムから移植可能なものを 実際にCasio Python書き直してみました。すると、

Casio Basic に比べて実行速度が圧倒的に速い!

以下で紹介しますが、その爆速っぷりは、チョット驚きです!
俄然 Casio Python に興味を持ち、詳細を調べたくなりました。
先ずは、その速さを紹介します。


純正Casio BasicCasio Python の処理速度の比較 
Casio Python でグラフィックス描画、関数計算、加算計算をさせて、純正Casio Basic と比較してみます。

グラフィック描画の比較 - フラクタルでシダの葉

shida_py_s 

これは、以下の記事で取り上げたフラクタル図形の描画プログラムです。
fx-CG50 でフラクタル - シダの葉

そこで作成した 純正Casio Basic のプログラム SHIDACG.g3m を Python に移植しました。
Casio Basic プログラムファイルと Python スクリプトファイルのダウンロード

フラクタル図形描画時間の比較
純正Casio Basic40 分
Casio Python24.4 秒
アドイン版Casio Basic - C.Basic for CG Ver 1.45β43.0 秒
※ C.Basic for CG Ver 1.45βについては こちらを参照
※ C.Basic は、コードの最適化により、さらに10倍近く高速化可能です。
 比較のため下記の純正Casio Basic コードを走らせました。

Python は100倍速い!

Casio Basicオリジナルコードと Python スクリプトを以下に示します。できる限り忠実に再現していることが分かると思います。

shida_g3m_py_src3


関数計算の比較 - sin と cos の繰り返し計算

tstfinc2_g3m_py_src
TSTFUNC2.g3m と tstfunc2.py のダウンロード

N に1000 を入力した時 (1000回ループ) の関数計算の比較
純正Casio Basic6.5 秒
Casio Python0.6 秒
アドイン版Casio Basic - C.Basic for CG Ver 1.45β0.38 秒

Pythonでの関数計算が10倍速いことが分かります。


加算計算の比較 - 加算とループ

tstsum2_g3m_py_src2  
TSTSIM2.g3m と tstsum2.py のダウンロード

N に1000 を入力した時 (1000回ループ) の加算計算の比較
純正Casio Basic2.2 秒
Casio Python0.15 秒
アドイン版Casio Basic - C.Basic for CG Ver 1.45β0.02 秒

Pythonでの加算計算が15倍程度速い結果になりました。


Python が速い理由
加算計算や関数計算で10~15倍程度速いだけでなく、グラフィックス描画がさらに10倍程度速いことが分かりました。

ちなみに、シダの葉描画のPhytonスクリプトの最下行にある show_screen() を for ループの外に出すと、VRAM上で全てのデータが揃ってから一気に画面転送を行うことになり、この時は 20.8 秒とさらに速くなります。つまり、show_screen() による画面転送速度が極めて速いことが、シダの葉描画の爆速の原因と言えます。

複雑な計算やグラフィックスやグラフ表示には極めて役立つという、Casio Pythonの潜在能力が明らかになったと思います。今後のグラフィックおよびグラフ描画のためのモジュール追加が期待されます。

なお、シダの葉描画で利用した clear_screen() メソッドは、OS3.40では隠し機能でマニュアルやカタログ機能にありませんでしたが、OS3.50 で公開機能となりました。但し、マニュアルやカタログ機能で見つからない隠し関数がまだ多くあり、これらを探索する方法があります。
Casio Python とは? の "2.2 Casio Python に組み込まれているオブジェクト名の一覧" を参照してください。



Casio Python 探索

Casio Python の潜在能力が意外に高いことが分ったので、これから色々と詳細を調べながら探索を進めたいと思っています。

fx-CG50 や fx-9750GIII のマニュアルを読むと Python モードでの操作法は書かれていますが、関数やメソッドの使い方は殆ど書かれていません。幸いなことにネットで PCの Python (CPython) について簡単に調べて参考にできますが、Casio Python 独自仕様や制限があり、悩むことがあると思います。

そこで、Casio Python を探索しながら、使いこなしの記事を書こうと思います。



 目 次

次の記事 - 1. はじめに:電卓で作る初めてのスクリプト




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




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

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

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

プログラミング経験者のための Casio Python

Python Casio Python
 プログラミング経験者のための Casio Python
     目次


初版:2020/06/13
更新:2023/03/19
更新:2023/04/21

プログラミング経験者のための Casio Python


はじめに

本連載は、プログラミング経験があるが Python はあまり知らなくて、さらにCasio プログラム電卓の Python モードでプログラムを作りたい人を想定したものです。ここまでマイナーでニッチな世界は無いでしょう。

管理人自身、電卓の Pythonモードでのコーディングが Python との初めての出会いで、電卓の Python モードの学習の過程を記事にしています。マイナーでニッチな体験を皆様と共有しようというのが、この連載です。ちなみに Pythonモードで使う言語を Casio Python と呼ぶことにしています。

管理人は C# を使ってプログラムを作ったことがあるので、その経験を元にネットで Python について検索し、自分の手で Casio Python でコーディングしながら詳しく仕様を調べるのは、さほど難しくなくて、むしろ楽しい作業です。このように調べて学習しながら 特定のプログラムを完成させる過程を記事にします。

学習しながら記事を書いてるので、読者の方々から様々なアドバイスを頂きながら、修正や書き直しを行っています。アドバイスは大歓迎なので、よろしくお願い致します。

Casio Python は 通常の Python (CPython) よりも大幅に機能が制限されています。必要だけど不足している機能もあります。それなりのプログラムとして仕上げるにはチョットした工夫が必要です。Casio Python の問題点や 工夫のポイントも紹介します。

当ブログでは、これまで Casio Basic をメインテーマにしてきたので、以前作った Casio Basicプログラム を Casio Python に移植する過程を紹介する記事から始めます。その際、汎用的に使える関数を作成してユーザーモジュールを作ってゆきます。さらに、面白そうなプログラムを最初から Casio Python で作る過程を紹介する記事も追加してゆきます。

色々なプログラムを作る際に、有ったら便利だと思う汎用的な関数を複数作成して、それらを効率的に使うためのユーザーモジュール u.py も紹介します。

e-Gadgetオリジナルユーザーモジュール





0. Casio Python のポテンシャル
Casio Python のグラフィックス描画は Casio Basic より100倍以上速い


1.
はじめに: 電卓で作る初めてのスクリプト
Pythonモード (Casio Python) でのスクリプト作成/編集の概要
  1.1 Casio Python での初めてのスクリプト
   1.1.1 fx-CG50 の準備
   1.1.2 Casio Python の起動
   1.1.3 スクリプトファイルの作成
   1.1.4 スクリプトの作成
   1.1.5 スクリプトの実行
  1.2 シェル画面
  1.3 スクリプト作成と編集の2つの方法
    Note: Python スクリプトファイルの正体
    Note: Visual Studio Code について


2. Casio Python とは?:MicroPython と CPython
Casio Python は、組み込みPython - microPython をCASIOがカスタマイズしたもの
  2.1 Casio Python の素性
   2.1.1 MicroPython 1.9.4
    Note: Casio Python へのライセンス
   2.1.2 CPython 3.5.4
  2.2 Casio Python に組み込まれているオプジェクト名の一覧
    Note: CGモデルとFXモデルでの出力の違い
  2.3 Casio Python の学習方法


3. Casio Python の入出力:プログラムのデザイン
Casio Python (OS3.4/3.5) は入出力機能がとても限定的
  3.1 入力 - input()
    Note: Casio Python の制限
  3.2 出力 - print() とグラフィックス出力関数
    Note: シェル画面とグラフィックス画面の切替
  3.3 Casio Pyhton で作るプログラム


4. Casio Python への移植:モンテカルロ法 (1)
Casio Python でスクリプトを書くための最低限の知識
    Note: モンテカルロ法による円周率の計算方法
  4.1 コメントの書き方
    Python公式: Comments
    Note: PEP 8
    Python公式: Docummentation Strings (Docstrings)
  4.2 モジュールの呼び出し - import
  4.3 メニュー機能の作成
    Reference: ⇒ input( )
    Note: Pythonでの文字列 - ' ' と " "
    Note: int( )
    Note: if 文
    Note: Python のデータ型
    Note: str( )
  4.4 circle() 関数の作成
    Note: continue
    Reference: ⇒ range( )
  4.5 グラフィックス出力
    Note: Casio Python 組み込み関数を調べる
   4.5.1 自作関数 circle() で円を描画
    Note: 文の句切り文字 - ;
   4.5.2 draw_string() 関数で文字列を出力
    Note: while 文
   4.5.3 while 文により繰り返し
   4.5.4 random() 関数により正方形内の座標(x, y)を取得
   4.5.5 set_pixel() 関数で (x, y) に点を描画
   4.5.6 点の座標から円周率を計算
    Note: モンテカルロ法による円周率の計算方法 (再掲)
    Note: 累乗演算子 - **
    Note: 累算代入演算 (+=, -=, *=, /=, %=)
    Note: 四捨五入 - round( )
   4.5.7 draw_string() 関数で回数と円周率を表示
   4.5.8 draw_string() 関数でシミュレーション終了の表示


5. 関数の作成と活用:grp_color() 関数の作成
Casio Python での関数の作り方と使い方の基本
  5.1 関数の引数について
  5.2 関数内の変数の有効範囲 - 変数のスコープ
  5.3 circle() 関数の拡張
  5.4 色指定関数を追加
   5.4.1 RGBによる色指定
   5.4.2 タプル型
   5.4.3 色指定方法の拡張
   5.4.4 グラフィック画面での色指定関数 grp_color() 関数の作成
    Note: type( )
    Note: リストの定義
    Note: タプルの定義
    Note: Python の比較演算子
    Note: 帰属検査の in
  5.5 circle() 関数拡張の書き換え
  5.6 モンテカルロ法(2) - monteca2.py


6. グラフィックス出力関数の追加:line() とユーザーモジュールの作成
ユーザーモジュールの作り方と使い方
  6.1 line() 関数の作成
  6.2 グラフィックスユーザーモジュールの作成
  6.3 line() 関数の動作確認 - ckLine.py
  6.4 line() 関数の動作確認 - ckLine2.py
    Note: 除算の余りを求める - %


7. テキスト出力関数の追加:locate() をユーザーモジュールに追加
Casio Python では必須の locate( )関数の作成と使い方を紹介 - 辞書型シーケンスの活用
  7.1 locate() 関数の作成
   7.1.1 フォントピッチ dx, dy の設定
   7.1.2 column から x を、row から y を算出
   7.1.3 フォントサイズ指定の処理
   7.1.4 locate() の完成 
  7.2 locate() をユーザーモジュールに追加
  7.3 locate() の動作確認 - ckLocate.py
  7.4 モンカルロ法(3) - monteca3.py


8. シェル画面入力の工夫:高速素因数分解(1)
Casio Basic から Casio Python へロジックを変えずに移植
  8.1 高速素因数分解プログラム - FactorG のざっくりした分析
  8.2 入力と入力値のチェック
    エラーを検知し制御を取り戻す - Try / except
  8.3 変数の初期化
  8.4 素数が素因数かどうかをチェック
    Note: Python の単文と複文
  8.5 "エラストテレスの篩い" で素因数の探索
  8.6 ckpwr() 関数の作成
  8.7 disp() 関数の作成 


9. Python らしい反復処理:高速素因数分解(2)
オプジェクト指向言語 Python ならではの for の使い方
  9.1 frac() 関数をユーザーモジュール (u.py) に追加
  9.2 不要な処理を削除
  9.3 disp() 関数のスリム化
    Note: range( ) の書式
  9.4 素数が素因数かどうかをチェックする部分のスリム化
  9.5 素因数を探索する残りの部分のスリム化
  9.6 スリム化したスクリプト - FactorG2.py
    Note: Casio Python スクリプトファイルのサイズ制限


10. 大きな数の計算:高速素因数分解(3)
Casio Python では15桁の精度が得られることを利用する事例
  10.1 変更箇所の洗い出し
  10.2 増加する素因数に合わせて表示桁数を拡張する - disp() の変更
  10.3 入力桁数の制限を拡張し、それに合わせてエラー表示を変更する
  10.4 素因数探索回数の表示を追加する
  10.5 素因数が10桁を超えるときの表示の変更 - disp() の変更


11. 関数呼出オーバーヘッド:高速素因数分解(4)
Casio Python は関数呼出が比較的速い - 関数を無くしてさらに高速化
  11.1 関数呼出あり (ver 3) となし (ver 4) の実行速度の違い
  11.2 Casio Python の関数呼出オーバーヘッド


12. 要素数の多いリスト:高速素因数分解(5)
Casio Python で巨大リストを処理するスクリプト実行時に派生するスタックサイズエラー
⇒ CPythonではジェネレータで対処。本事例では処理速度優先のためジェネレータ使わず...
  12.1 増分リストを拡張する
  12.2 要素数480個の探索数増分リスト
  12.3 探索数を拡大して15桁対応高速素因数分解のスクリプト
  12.4 探索数拡大による高速化
  12.5 増分リストをさらに拡張する


13. 10進数除算の出力と精度:高速素因数分解(7)
Casio Python 内部演算精度15桁が原因で、割り切れる整数の除算が浮動小数点になる
  13.1 Casio Python での除算結果のデータ型
  13.2 Casio Python での関数計算結果のデータ型
  13.3 Casio Python での除算計算の精度
    Note: Windows版 Python のインストール
    Note: 浮動小数点演算 - その問題と制限 (Python 公式サイト) 参照
  13.4 0 および負の整数入力の処理
  13.5 入力ルーチンの修正
   13.5.1 入力委が小数点以下 0 の小数の場合に処理を追加 
   13.5.2 入力値が負の数値の場合の処理
   13.5.3 入力が 0 の時の処理
  13.6 完成した FactorG7.py の動作確認


14. CGモデルとFXモデルのPythonモードの違い
CGモデルとFXモデルを判定する関数の作成と使い方
  14.1 CGモデルからFXモデルへのスクリプトの移植
   14.1.1 CGモデルからFXモデルへのスクリプト移植のポイント
   14.1.2 CGモデルとFXモデルの判定方法
  14.2 FXモデルのPythonモードの制限 - バッファサイズ
   14.2.1 編集できるスクリプトファイルの行数制限
   14.2.2 print() 出力のスタック・バッファサイズ
   14.2.3 Shell 画面出力のスタック・バッファサイズ
  14.3 Casio Python自体の機能の違い
   14.3.1 CGモデル OS3.40 と OS3.50 の違い
   14.3.2 CGモデル OS3.50 と FXモデル OS3.40 の違い


15. RGB値による色設定
fx-CG50 のカラー液晶は16bitカラーであることを理解した上で、RGB値で色指定
⇒ ピクセルの色指定と色読取りの実験を CGモデルとFXモデルで実施
  15.1 RGB値の色を確認するプログラム
  15.2 fx-CG50 の高精細カラー液晶 - 実は 16bit カラー
  15.3 モノクロ液晶モデルでのRGB値による色設定
  15.4 RGB値でのピクセル色設定と読取りの実験 - CGモデルとFXモデル


16. circle() 関数のFXモデルへの拡張
画面の画素数が異なる CGモデルとFXモデルの両方に対応したスクリプト
  16.1 CGモデルとFXモデルの場合分け
  16.2 circle() 関数を使ってみる



17. shell 画面とグラフィック画面の活用:コラッツ問題
出力先としてグラフィックス画面とシェル画面の両方を活用する
  17.1 コラッツ問題 (Collatz Problem) とは?
  17.2 コラッツ数列の計算
  17.3 出力の工夫ポイント
   17.3.1 input() での入力
   17.3.2 フォントサイズを変えて添え字の描画
   17.3.3 リアルタイムに変わる数値の表示
   17.3.4 グラフの描画
   17.3.5 数列の最大値を求めて表示
   17.3.6 shell 画面でのスクロール出力
  17.4 コラッツ問題で遊んでみる

xx. Casio Pyhton - turtle / matplotl モジュール 
Casio Pyhton用 turtle / matplot モジュールの入手
[準備中]





e-Gadgetで作成したユーザーモジュール
最新バージョン: ver 1.5 <ダウンロード>
サポートモデル / OS:
  ・CGモデル - fx-CG50 / OS3.40以降
  ・FXモデル - fx-9750GIII
/ OS3.40以降
  ・FXモデル - fx-9860GIII
/ OS3.40以降

ファイル名: u.py / ufx.py
  全サポートモデルに対応 - CGモデル/FXモデルの自動判定機能あり
  ・ufx.py は FXモデルで開くために、u.py から一部コメントを削除して150行以下にしたもの
実装オブジェクト
  isCG(): CGモデルかFXモデルかを判定
  grp_color(): グラフィック描画関数の様々な色設定をタプル型に変換
  circle(): グラフィックス画面に円を描画
  line(): グラフィック画面に線分を描画
  locate(): グラフィック画面にテキストを出力
  frac(): 浮動小数点型数値の小数部を取得




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




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

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

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

Casio Python - ユーザー関数 locate()

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

ユーザーモジュール u.py に含まれる関数 u.py ver 1.5 ダウンロード

初版:2020/12/09
修正:2023/04/21

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

文字(列)  や 数値を、桁と行で位置を指定してグラフィック画面に描画します。
併せて、描画の色とフォントサイズを指定することもできます。
さらに、画面に転送するか、VRAMのみに転送するかの選択も可能です。

書 式locate(column, row, obj, color=1, size='m', show=1)

引 数
- 第1引数 - column: 描画する文字(列) / 数値 の座標 (桁, 行) の 桁座標、0 以上の整数
- 第2引数 - row: 描画する文字(列) / 数値の座標 (桁, 行) の 行座標、0 以上の整数
- 第3引数 - obj: 描画する文字(列) / 数値
- 第4引数 - color: 色を指定するパラメータ引数で、省略可能でデフォルトは 1 です。
       この引数は、内部で使っているユーザー関数 grp_color() に渡されます。
       引数の具体的な設定については grp_color() のリファレンスを参照。
- 第5引数 - size: フォントサイズを指定するパラメータ引数で、'l', 'm', 's' のいずれか。
       これは省略可能で、省略時は 'm' になります。
       'l' - 大フォント、'm' - 中フォント、's' - 小フォント
- 第6引数 - show: 1 のときは液晶に出力し、0 のときはVRAMへ転送するだけです。
       これは
パラメータ引数で、省略時は 1 になります。

引数を5つ、値だけを指定するとエラーになります ⇒ 関数の引数は こちら を参照。
引数を5つだけ設定する場合は、パラメータと共に設定します。
  例) locate(5, 10, 'Wao', 3, color=4) / line(5, 15, 'Wao' 2, show=0)
フォントサイズの詳細 (CGモデル)
   ・'l' (大): 桁は 0~21、行は 0~7  | フォントピッチは 横16 dot、縦24 dot
   ・'m' (中): 桁は 0~31、行は 0~11 | フォントピッチは 横12 dot、縦16 dot
   ・'s' (小): 桁は 0~47、行は 0~17 | フォントピッチは 横 8 dot、縦12 dot
 フォントサイズの詳細 (FXモデル)
   ・'l' (大): 桁は 0~20、行は 0~7 | フォントピッチは 横 6 dot、縦 8 dot
   ・'m' (中): 桁は 0~31、行は 0~9 | フォントピッチは 横 4 dot、縦 6 dot
   ・'s' (小): 'm' と同じ (↑)


関数定義:

from casioplot import *

def locate(column, row, obj, color=1, size='m', show=1):
 #set fontsize & pitch
 if isCG(): #CG model
  dx={'s':8, 'm':12, 'l':16}
  dy={'s':12, 'm':16, 'l':24}
 else: #FX model
  dx={'s':4'm':4, 'l':6}
  dy={'s':6, 'm':6, 'l':8}
 #from 5th argument(size)
 sz={'s':'small', 'm':'medium', 'l':'large'}
 #data transfer to VRAM
 draw_string(column*dx[size], row*dy[size], str(obj), grp_color(color), sz[size])

 if show: #data transfer to screen
  show_screen
()



スクリプトの解説:
 実行しているモデル(FXモデルかCGモデルか)の判定は自動で行います - ユーザー関数 isCG() 利用 
  テキスト出力関数の追加:locate() をユーザーモジュールに追加 ⇒ こちら
  isCG() ユーザー関数 [CGモデルとFXモデルの判定方法] ⇒ こちら
  grp_color() ユーザー関数 ⇒ こちら



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




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

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

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

Casio Pyhton - 目次

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     
- 目 次


初版:2020/06/13
更新:2022/02/21
更新:2023/03/19


当ブログでは、Casio Python を楽しむための情報提供も始めています。

実のところは、管理人自身が遊んで楽しんだ内容や、調べた内容をそのまま公開することです。これは ”プログラミング経験者のための Casio Python" という連載になります。

次に、"Casio Python 入門" という初心者向けの講座を無謀にも始めます。

なおカシオのグラフ関数電卓の Python モードを当ブログでは Casio Python と言うことにしています。Casio Python は、MicroPython Ver 1.94 のライセンス下で実装されていて、MicroPython に特徴的な仕様やカシオの独自仕様になっている部分もあります。そこで、パソコンで動作する Python (CPython) と異なっている部分についても、分かる範囲でピックアップするつもりです。

Casio Python の動作環境:
Casio fx-CG50 OS3.40 以降 (日本国内サポートあり)  ⇒ fx-CG50 の概要
Casio fx-9750GIII OS3.40 以降 (日本国内では非売品)  ⇒ fx-9750GIII の概要
Casio fx-9860GIII OS3.40 以降 (日本国内では非売品)  ⇒ fx-9860GIII の概要
連載ではfx-CG50 で動くコードを中心にし、これ以外のモデルでの動作も意識します。



目 次

 1 プログラミング経験者のための Casio Python 

 2 Casio Python 入門 [準備中]

 3 Casio Python のリファレンス 

 4 Casio Python のトピックス

 5
Python の無料入門書




Casio Python のファレンス
連載記事とサンプルプログラムを作成しながら分かったことをまとめたものです。Casio Python 特有の仕様も記載しています。

Casio Python - オプジェクト一覧 
Casio Python に実装されているものを網羅しています。
  • オブジェクト一覧には、個別に作成したリファレンスへのリンクがあります。
  • 個別のリファレンスには、Python 公式サイトでの解説へのリンクを掲載しています。
  • 個別のリファレンスには、Casio Python 独自の項目を優先して記述します。
  • 一旦作成したものは、随時追記。修正します。


e-Gadgetで作成したユーザーモジュール - オブジェクト一覧
e-Gadget で作成したユーザーモジュールに含まれているもの

最新バージョン: ver 1.5 <ダウンロード>
サポートモデル / OS:
  ・CGモデル - fx-CG50 / OS3.40以降
  ・FXモデル - fx-9750GIII
/ OS3.40以降
  ・FXモデル - fx-9860GIII
/ OS3.40以降

ファイル名: u.py / ufx.py
  全サポートモデルに対応 - CGモデル/FXモデルの自動判定機能あり
  ・ufx.py は FXモデルで開くために、u.py から一部コメントを削除して150行以下にしたもの
実装オブジェクト
  isCG(): CGモデルかFXモデルかを判定
  grp_color(): グラフィック描画関数の様々な色設定をタプル型に変換
  circle(): グラフィックス画面に円を描画
  line(): グラフィック画面に線分を描画
  locate(): グラフィック画面にテキストを出力
  frac(): 浮動小数点型数値の小数部を取得





Casio Python のトピックス

Casio Python に関するトピックスを紹介します。

 Casio Python - Casio Education で e-Gadgetのモンテカルロ法が紹介







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




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

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

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

Casio Python 入門

Python Casio Python
 Casio Python 入門
     目次


初版:2020/06/13
更新:2023/03/19

Casio Python 入門


はじめに

当ブログでは、Casio Python を楽しむために 2つのアプローチを提供します。

本連載は、プログラミング初心者を念頭において、Python の基本から始めて Casio Python でのプログラミングについて解説してゆきます。

なお、当ブログでは、カシオのグラフ関数電卓のPython モードを Casio Python 言うことにしています。

Casio Python は、MicroPython Ver 1.94 のライセンス下で実装されていて、MicroPython に特徴的な仕様やカシオの独自仕様になっている部分もあります。そこで、パソコンで動作する Python (CPython) と異なっている部分について、分かる範囲で解説する予定です。

Casio Python の動作環境:
Casio fx-CG50 OS3.40 以降 (日本国内サポートあり)  ⇒ fx-CG50 の概要
Casio fx-9750GIII OS3.40 以降 (日本国内では非売品)  ⇒ fx-9750GIII の概要
Casio fx-9860GIII OS3.40 以降 (日本国内では非売品)  ⇒ fx-9860GIII の概要
本連載ではfx-CG50 で動くコードを中心にし、これ以外のモデルでの動作も意識します。



(準備中)

00. はじめに

01. Casio Python に触れる(1)

02. Casio Python に触れる(2)

03. 変数・代入とオブジェクト

04. Python の基本

05. 条件分岐と繰り返し

06. 組込型とオブジェクト

07. ユーザ定義関数
  
08. クラスの基本











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




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

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

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

Casio Pythonへの移植:モンテカルロ法(1)

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - Casio Python への移植:モンテカルロ法(1) 
目次


初版:2020/06/24
表現の修正:2020/06/27
追記:2020/10/20
追記・修正:2020/11/03
修正:2022/08/17
修正:2022/10/28

前の記事 - 3. Casio Python の入出力 |  次の記事 - 5. 関数の作成と活用


4. Casio Python への移植:モンテカルロ法(1)<fx-CG50 OS3.40以降>

Casio Basic プログラムを Casio Python へ移植しながら、ざっくりと Python の理解を進めてゆきます。

Casio Python では、入力がシェル画面でしか行えません。そこで、入力はシェル画面で行い、出力はグラフィックス画面で行う方針でスクリプト全体の構造を考え、あとは細かく作ってゆきます。

以下の動作をするスクリプトを作ってゆきます。


このスクリプトは、モンテカルロ法により円周率を求めるシミュレーションです。最初にシミュレーション回数を入力させ、シミュレーション実施の状況をグラフィカルに表示しながら、回数と円周率(pi)の値の変化をリアルタイム表示するものです。


スクリプトの構造

円を描画する関数を定義
 circle() 関数を自作

初期化処理

シェル画面でメニューを表示して、試行回数を入力させる
 print() でメニュー表示
 input() で回数を入力させ整数を取得
 ifによる条件分岐
   テンキー以外を押した時に異常終了しない処理

グラフィックス画面に出力する
 自作関数 circle() で円を描画
 draw_string() 関数で文字列を出力
 whileによる繰り返し(入力した回数分だけ繰り返し)
   random() 関数により正方形内の座標(x, y)を取得
   set_pixel() 関数で正方形内にに点を描画
   点の座標から円周率を計算 (Note 参照)
   draw_string() 関数で回数と円数率を表示
   (ここまでを繰り返す)
 draw_string() 関数でシミュレーション終了の表示


スクリプトの上から下へ制御が流れて行き、if 文while 文 で流れが変化する構造です。

Note:モンテカルロ法による円周率の計算方法
  1. 半径1の円と一辺2の外接正方形を考えます。
  2. x=1-2×[0~1の乱数]、y=1-2×[0~1の乱数] を計算して、-1<x<1-1<y<1 の (x, y)を得ます。
    つまり、(x, y) は一辺2の正方形内のランダムな点の座標となります。
  3. 正方形内にランダムに円を打って行き、全ての点の数を outs とし、そのうち x2+y2<1 になる(円内になる)回数を ins とします。(オリジナルのCasio Basic プログラムでこういう感じなので、単純に移植するために追従します)
  4. [正方形の面積]:[円の面積]outs:ins=4:π なので、π=4×ins/outs となります。

円描画関数の作成
Casio Python には、円を描画する組み込み関数が無いので、自分で作る必要があります。
ここでは、円の中心位置を決める x 座標と y 座標、そして円の半径 r をパラメータに指定して円を描画する関数を作ります。
Python の書式に従って、
 def circle(x, y, r):
  必要な処理

と記述します。詳細は 4.4 circle() 関数の作成 で説明します。

初期化処理
各変数の初期値を設定します。個別の処理と一緒に説明します。

シェル画面でメニュー表示と入力
主に、print() 関数と input() 関数の使いこなしがポイントです。if 文も使います、詳しくは 4.3 メニュー機能の作成 で説明します。

グラフィックス画面に出力
set_pixel() 関数と draw_string() 関数、そして clear_screen() 関数と show_screen() 関数の使いこなしがポイントです。 while 文も使います。詳しくは 4.5 グラフィックス出力 で説明します。 



今回作るスクリプトは、"これだけ知っていれば、簡単なスクリプトは作れる最低限の Casio Python の知識" で作りました。今回のメインテーマは、そのレベルの知識を紹介することです。

今回紹介する内容について、ネットで詳しく調べたり、より Python らしいコードを習得すれば、学習が深まると思います。


4.1 コメントの書き方 <fx-CG50, fx-9750GIII, fx-9860GIII OS3.40以降>

Pythonスクリプトでコメントを書くには、# を使うか トリプルクォート を使います。

Python公式:Comments
PEP 8 - Style Guide ofr Python の Comments の項 に推奨するコメントのスタイルが書かれています。ここでは、# を使ったブロックコメントとシングルラインコメントの推奨スタイル、そして3重ダブルクォーテーションを使った docstrings の推奨スタイルについて書いてあります。

Note:PEP 8
Python 公式文書 では、開発者のためのガイドラインや開発した機能が Python Enhancment Proposals (PEPs) にまとめられています。そして、全ての PEP はインデックス番号で文書管理されていて、コメントに関する推奨スタイルは PEP 8 にまとめられています。

#
# から行末までが、コメントとして扱われ、実行されません。公式推奨スタイルでは、# のあとにスペース1個を置いてからコメントを書くことになっています。また、説明を入れる記述と同じインデントレベルで書くことを推奨しています。
Casio Python は画面が狭いので、管理人は #  の後のスペースを入れないことが多いです。

Key Press:#
エディタ画面(スクリプト編集画面) で、[F3] (SYMBOL) - [F6] (▷) と押すと、[F1] (#) で # を入力できます。


''' (トリプルクォート - 3重シングルクォーテーション)
'''''' の間がコメントとして扱われます。複数行をまとめてコメントにすることができます。

Key Press:'
エディタ画面で、[F3] (SYMBOL) - [F6] (▷) と押すと、[F2] (') で ' を入力できます。


""" (トリプルクォート - 3重ダブルクォーテーション)
"""""" の間がコメントとして扱われます。複数行をまとめてコメントにすることができます。
Python のスタイルガイドでは、公開する関数やメソッドに関する説明は、3重ダブルクォーテーションを使った Documentation Strings を推奨しています。

Keypress:"
エディタ画面で、[F3] (SYMBOL) - [F6] (▷) と押すと、[F3] (") で " を入力できます。

Python公式:Domumentation Strings (Docstrings)
PEP 8 - Style Guide for Python の Documentation Strings の項 に詳しく書かれています。
・def 文の行の下の行を """ で始め、これに続いてその関数の説明をできるだけ簡潔に1行以内で書きます。
・そして、空行を入れます。
・空行の下から、パラメータや戻り値の説明を入れます。

Casio Python では、"""""" の間はピンク色になって分かりやすくなります。度 (degree) で表した角度をラジアン (radian) に変換する関数での Docstrings の一例です(たった2行のスクリプトなので、コメントばかりで大げさになっています);

 def rad(x):
 
"""Returns angle in radian

 Parameters:

 ーーーーーーーーーーーーー
 x: float
  angle in degree

 Returns:

 ーーーーーーーーー
 float
  angle in radian
 """

  return pix/180


4.2 モジュールの呼び出し - import <fx-CG50, fx-9750GIII, fx-9860GIII OS3.40以降>

Python は、最初から組み込まれている builtins モジュールに加えて、後からモジュールを追加して機能を増やせるようになっています。Casio Python は、math モジュールと random モジュールが追加された状態で最初にリリースされ、その後 casioplot モジュールが追加されました。今回は、これら全てを使いますので、モジュールの呼び出しをスクリプトの冒頭に書く必要があります。

例えば、set_pixel() 関数を使いたい場合は、それが含まれている casioplot モジュールを呼び出します。関数を使う前に、モジュールの呼び出しを記述しなければなりません。呼び出し方法は2通りあり、それによって関数の使い方が変わります。


import モジュール名

書 式
import casioplot
casioplot.set_pixel(x, y)

モジュールに含まれる関数を使う際は、関数の前に モジュール名. を追加しなければなりません。
casioplot オブジェクトに帰属する関数は、. で繋いで明示的に帰属関係を示す必要があります。これはオブジェクト指向言語に共通する書式と言えます。


from モジュール名 import *

書 式
from casioplot import
set_pixel(x, y)

はワイルドカードで、casioplot から全ての関数を呼び出すという意味で、帰属関数の関数名だけを書いて使えるようになります。

 これまでをまとめたスクリプト:
"""Sample script

Exercise;
porting from Casio Basic
"Monte Carlo Method"

by Krtyski/e-Gadget
"""

from casioplot import *
from random import *
from math import *



4.3 メニュー機能の作成 <fx-CG50, fx-9750GIII, fx-9860GIII OS3.40以降>

シミュレーション試行回数を変数 temp_try に入れることにします。試行回数 (try数) の仮変数という意味で temp を使って、temp_try という変数名にしました。

そこで、入力処理で最低限必要な記述は、

temp_try = input()

となります。

これを実行するとシェル画面で入力待ちになりますが、何も表示されず入力を待っています。そしてテンキーで数値を入力してから[EXE]キーを押すと、変数 temp_try に数値が格納されます。但し、input() の戻り値は、数値ではなくて文字列になるのが仕様で、これに留意します。

さて、次のようにすれば、入力の際に分かりやすくなります;
temp_try = input('Input number:')


Reference:⇒ input()

Note:Python での文字列 - ' ' と " "
string = '12345abcd'
あるいは
string = "12345abcd"
と書けば 変数 string は文字列型の変数として自動的に定義され、srting に文字列データ格納されますす。
Python では、シングルクォーテーションでもダブルクォーテーションでも、どちらでも使えます。
例えば、文字列の一部に " が入っている時、文字列の定義で ' を使えば " が文字列の一部として使える、といったメリットがあります。
string = 'He said "Wow"'
print(string)
を実行すると、
He said "Wow"
と出力されます。

Python で文字列は、シングルクォーテーション ' あるいは ダブルクォーテーション " で挟みます。Python 公式文書ではシングルクォーテションを使う事例が普通に使われているので、ここでは ' を使うことにします。そこで、文字列をパラメータに指定して input('Input number') と書きます。

これを実行すると、シェル画面では以下のようになります;

Input number:

そして、Input number: の直後でカーソルが点滅しているので、入力が分かりやすくなります。

monteca_input_1 

これで十分ですが、管理人は余計な表示を消したくなります。それだけでなく、このプログラムの説明も表示したくなります。

シェル画面では、[EXE}キーを押して改行すると、表示が上へスクロールされます。シェル画面の表示をクリアする関数が用意されていないので、余計な表示は改行でスクロールするしかありません。

そこで、print() 関数を使って表示を追加してみます。

以下のような表示を目標にします。
monteca_first_screen 

プログラム開始時は、試行回数500回をデフォルトにしておき、[EXE]キーでスグにシミュレーション開始。回数を変えたい場合は入力してから[EXE]キーを押してシミュレーション開始、となる仕様にします。これは、print() 関数と input() 関数だけで実現できます。

print(文字列) とするとシェル画面に文字列が表示され、改行されるのが、デフォルトの仕様です。
文字列なしで、単に print() とすると、文字列はシェル画面に表示されずに、改行だけが行われます。

すると、上の表示を行ってから最後に入力待ちにするには、以下のようにします。
・改行のみ
・Monte Carlo: calc Pi と表示して改行
・改行のみ
・# of try:500 と表示して改行
・[EXE] to start. と表示して改行
・改行のみ
・input() で Change the #? と表示して入力待ちして、変数 n に格納

これをスクリプトで書くと、文字列は ' ' の間に書くので、以下のようになります。
print()
print('Monte Carlo: calc Pi')
print()
print('# of try:500')
print('[EXE] to start.')
print()
temp_try = input('Change the #?')


ところで、エスケープシーケンスの1つである '\n' を文字列に使って print('\n') を実行しても改行されます。\ はバックスラッシュといい、/ (スラッシュ) とは傾きが違っていることに注意してください。

Key Press:\ (バックスラッシュ)
エディタ画面で、[F4] (CHAR) を押して、キャラクタ一覧から \ を選びます

そこで、上のスクリプトを書き換えてみます。

print('\nMonte Carlo: calc Pi')
print('\n# of try:500')
print('[EXE] to start.')
temp_try = input('\nChange the #?')


さて、ここで変数 temp_try に代入されるのは文字列です(input() の仕様)。例えば 1000 とキー入力すると temp_try には 文字列 '1000' が格納されます。ここでは、シミュレーション回数の変数 n_try に数値として 1000 を代入したいところです。
そこで、関数 int() を使います。

Note:int()
int(x) は、浮動小数点あるいは文字列の x を整数に変換します。浮動小数点については、小数点以下を切り捨てて整数にします。文字列については、数字だけの文字列なら整数に変換し、数字以外の文字列が含まれるときはエラーになります。

n_try = int(temp_try) とすると、n_try に整数が格納されます。

temp_try が数字だけの文字列かどうかを判定するには、isdigital() 関数が使えます。これは文字列オブジェクトの帰属関数なので、文字列型オプジェクト名に . を使って繋げて記述します。ここでは、文字列型のオブジェクトである temp_try の帰属関数として使うので、temp_try.isdigit() と書きます。

n_try = 500
if temp_try.isdigit():
 n_try = int(temp_try)


こうすると、デフォルトの試行回数が500回で、正しく数値が入力されたときは、その整数値を n_try に代入し、数値以外の文字が含まれた時は、n_try にはデフォルトの500回が適用された状態で、次の処理に進みます。

Note:if 文
if 文の書式
 if
条件1:
  処理1
  ・・・
 elif 条件2:
  処理2
  ・・・
 else:
  処理3
  ・・・
条件1が True (真)のとき(成り立つ時)あるいは 0 でない時、処理1を実行、
条件2が True (真)のとき(成り立つ時)あるいは 0 でない時、処理2を実行
それ以外のとき、処理3を実行
ifelifelse の行末にはコロン : が必要です。
コロン : の次の行には、インデントを1段深くします。深くなったインデントレベルが同じ行が if の範囲を示します。
elif でインデントレベルが1段戻り、if と同じインデントレベルにします。これにより ifelif が同列だと示します。
elif の行末にもコロン : が必要で、その下の行のインデントレベルで elif の範囲を示します。
else: の範囲も同様です。
このように、インデントレベルはスクリプトの正しい実行のために、極めて重要です。


Note:Python のデータ型
Casio Python で使う頻度の高いデータ型は、ざっくりと 数値型とシーケンス型に分けられます。そして数値型とシーケンス型は、いくつかのデータ型にさらに分けられます。
数値型: 整数型浮動小数点型に分けられます。
シーケンス型文字列型リスト型タプル型辞書型集合型に分けられます。
 シーケンス型は、複数要素を , で区切って並べたデータ型です。
データの種類に応じて、以下のデータ型があります。定義方法も異なります。

数値型変数の定義:   val = 123
浮動小数点型変数の定義:val = 12.34

文字列型
変数の定義:val = '12.34'
リスト型変数の定義:val = [12, 16, 24, 48]  val=['I', 'have', 'a', 'pen', '.']
タプル型変数の定義:val = (255, 255, 0)
辞書型変数の定義: val = {'ketchup':'red', 'mustard':'yellow', 'coffee':'black'}
集合型変数の定義: val = {'sun', 'mercury', 'venus', 'earth', 'mars', 'jupiter'}
   要素を囲む記号とコロン : の有無で、シーケンス型に属する細かいデータ型が決まります。
    Casio Python のオブジェクト一覧 を参照

今回は、整数型、浮動小数点型、文字列型の3つのデータ型を使います。


 これまでをまとめたスクリプト:
"""Sample script

Exercise;
porting from Casio Basic
"Monte Carlo Method"

by Krtyski/e-Gadget
"""

from casioplot import *
from random import *
from math import *

#initializing
n_try 500

#display menu to select try#
print('\nMonte Carlo: calc Pi')
print('\n# of try:'+str(n_try))  #ココの説明がまだでした!
print('[EXE] to start.')
temp_try input('\nChange the #?:')
if temp_try.isdigit():
 n_try int(temp_try)

まだ説明していなかった点を補足します。

上の作りかけのスクリプトでは
 print('\n# of try:') 

 print('\n# of try:'+str(n_try))
に変更しています。

数値変数 n_try を文字列に変換したものを + (文字列結合)を使って、文字列 '\n# of try:' に結合しています。
数値を文字列に変換するために、str() 関数を使っています。

Note:str()
str(x) は、オブジェクト x を文字列に変換して返します。x に整数型や浮動小数点型を指定すれば、文字列型で返します。


これで、以下の表示と動作の目標を達成しました。
monteca_10000_start 


4.4 circle() 関数の作成

これから、円を描画する circle() 関数を作ります。

この関数の書式を以下のようにします。
 circle(x, y, r)
 x: 整数型 (int型)、円中心の x 座標
 y: 整数型 (int型)、円中心の y 座標
 r: 整数型 (int型)、円の半径


関数を定義するには、def 文を使います。

 def circle(x,y,r):
  処理1
  処理2
   :
   :


def 文の行末には、コロン : が必要です。
コロン : の下の行は、インデントレベルを1段深くし、このインデントレベル以下の行が、def の範囲を決めます。

circle() 関数を使う場合は、例えば、circle(100,100,50)circle(px, py, r) のように書きます。3つのパラメータは、第1引数は x 座標値、第2引数は y 座標値、第3引数は 半径、といったように引数の順序、つまりその位置で意味が決まります。これを位置引数 (Positional Argument) と言います。

circle() 関数の定義は、circle() を使う前に記述する必要があります。スクリプトは上から下へ実行されるからです。今回は、スクリプトの冒頭、モジュール呼び出しの下に記述することにします。

 circle_desc 
グラフィックス画面 (描画画面) では、左上の座標が (0, 0) 、右方向へ正の x 軸、下方向へ正の y 軸になります。circle() 関数で、中心座標が (x, y)、半径 r の円を描画するようにします。

円を p 個の点で描画する時、描画する点(上で赤い点)を i を 0 から p-1 まで1づつ変化させながら、角度 i*a (=θ)で描画します(上の図を参照)。ここで、円を描く際の角度の1刻みが 角度 a になります。

以下のような方法で円を描画することにします;

def circle(x, y, r):
 p = (式)
 a = (式)
 for i in range(p):
  px = x + r*cos(i*a)
  py = y + r*sin(i*a)  
  draw_pixel(int(px), int(py))
  show_screen()


==========

この方針に従ってスクリプトを仕上げます。ap をどうやって決める(計算する) のかがポイントです。

Casio Python での三角関数は、角度がラジアンに限定されていますので、スクリプトはラジアンを使って角度を記述する必要があります。そこで、1周360° が 2π ラジアンなので、p 個の点で円を描画するときの角度の1刻み a は、2πp で割った角度になります。
 a = 2*pi/p
これで、a を算出できます。

さて、math モジュールには 円周率を返す関数として pi があります。そこで、math モジュールを呼び出した上で、上のように pi を使います。

すると、上の図から分かるように、i 番目の点の座標 (px, py) は次のように計算できます。
 px = x + r*cos(i*a)
 py = y + r*sin(i*a)

 
座標 (px, py) に点を描画するには、
 set_pixel(px, py)
を使いますが、px と py は整数でないとダメです。液晶パネルのドットは整数の座標で決まります。
しかし、上で計算した px と py は浮動小数点になっています。そこで、int() 関数を使って、浮動小数点の小数を切り捨てて、整数に変換します。

 set_pixel(int(px), int(py))

とすればOK。

そして、set_pixel() 関数でVRAMにデータ転送したものを、show_screen() 関数で画面に転送すれば、点が表示されます。

==========

この点の描画を、i を 0 から p-1 (整数) まで1づつ変化させながら繰り返すには、for 文を使います。

for i in range(p):
 px = x+r*cos(i*a)
 py = y+r*sin(i*a)
 set_pixel(int(px), int(py))

 show_screen()

set_pixel() 関数は、VRAMにデータを書き込むだけで、画面への転送を行いません。そこで、show_screen() 関数で画面にデータ転送を行うことで、描画が完了します。

Note:for 文
for i in range(p):
 処理

は、ip-1 になるまで1つづつ増やしながら、処理を繰り返します。
for 文の行末にはコロン : が必要です。コロン : の下の行はインデントレベルを1段深くします。このインデントレベルが同じ行がfor の範囲、つまり繰り返し処理の対象になります。ここでも、コロン : とインデントレベルは、正常動作のために極めて重要です。

==========

最後に、円を描画するために使う点の数 p の値を決めます。

[2020/11/03 追記修正]
先ず、CGモデル (fx-CG50) 向けに検討し、最後に FXモデルへの対応を検討します。

円の描画は、できる限りきれいで滑らかにしたいので、p は十分に大きくすれば良いのでしょうが、一方、できる限り短い時間で効率よく描画するには、p の値は必要最小限にしたいところです。必要最小限の点の数 p をどうやって決めるのかを考えてみます。適当で良いのかも知れませんが、チョットこだわってみます。

円を描画するとき、点と次の点の間隔が一番大きくなるのは、画面横幅分の 387 ドットの半径の円がx軸と垂直に交わる時です(必要条件)。その時に点と点の間隔の y座標の変化が1ピクセルになるときの点の数を Pmax とします。Pmax は、半径が 383 (画面横幅)の円を描画する時の点の数です。383 よりも小さな半径 r の円を描くための点の数 p は、Pmax よりは少なく

p = Pmax × (r/383)   (式1)

で十分だと分かります (Pmax を半径 383r で比例配分したもの)。

半径 383 の円で y座標値が一番急激に変化するのは、角度 0 の時なので、y座標値が 1 (pixel) だけ変化するときの角度変化を θ とすると、この θ は、滑らかに円を描画するために無駄のない最大の角度刻みとなります。これ以下の角度刻みは無駄だし、これ以上だと歯抜けの円となります。

この角度刻み θ は、383×sin(θ) = 1 となるときの θ です。この式を変形すれば、θ は以下のように計算できます。

θ = sin-1(1/383)

半径 383 で、さらに角度刻み θ で点を描画して円にするとき、1週するのに必要な点の数、つまり Pmax は以下になります。

Pmax = 2π/θ = 2π/sin-1(1/383)  (式2)

(式1) と (式2) から、以下の式で p が決まります。この p は、半径 r の円を描画するときに、滑らかでかつ無駄のない最小の描画点数です。

p = r * 2π/sin-1(1/383) / 383 = r*6.283178168  (CGモデル用)

この式を FXモデル用に適用するためには、383127 に置き換えれば良いことになります。383 はCGモデルでの画面の横幅で、127 はFXモデルでの画面の横幅です。

p = r * 2π/sin-1(1/127) / 127 = r*6.28312038  (FXモデル用)

CGモデル用とFXモデル用を見比べると、r の係数が小数点以下4桁まで同じだと気がつきます。そこで有効数字を考慮して r の係数を 6.283 とすれば、CGモデルとFXモデルの両方で共通して使えると思います。

p = r*6.283  (CGモデルとFXモデル共用)

ようやく p が決まったので、これから a が求められ、あとは上のロジックでスクリプトを書けば、circle() 関数が完成します。

==========
求めた p の妥当性
p を決める計算に登場する r の係数 (= 6.283) は、ほぼ 2π (π = 3.1415926...) になっています。円周の長さ (2πr) の値を に採用しても小数点以下3桁まで同じ計算結果になります。離散的なピクセルの間隔から必要最小限の p の数を求めた結果、FXモデルのように解像度の低い液晶画面でも、連続的な円周の長さの公式  p=2πr を採用しても大きな支障がないことが確認できました。 
==========

以上まとめると、中心座標が (x, y)、半径が r の円を描画する関数は、以下になります。

def circle(x, y, r):
 p = r*6.283
 a = 2*pi/p
 for i in range(p):
  px = x+r*cos(i*a)
  py = y+r*sin(i*a)
  set_pixel(int(px), int(py))
  show_screen()


さて、描画しようとする点 (pxpy) がグラフィックス画面の外側の時は、描画しないて次へ進んだ方が、さらに処理時間が節約できて、より効率化できます。

そこで、px を求める計算の直後で、px<0 または px>383 の時は、set_pixel() をスキップして、次の繰り返しを実行するようにします。それには、以下の赤の2行を追加します。

  px = x+r*cos(i*a)
  if px<0 or px>383:
   continue


同様にして、py を求める計算の直後に、py<0 または py>191 の時は、set_pixel() をスキップして、次の繰り返しを実行するように、以下の赤の2行も追加します。

  py = y+r*sin(i*a)
  if py<0 or py>191:
   continue



Note:continue
繰り返し処理(ループ)を行う for 文 と while 文 で、繰り返し処理の中で continue を使うと、それ以降の処理を行わずに forwhile にジャンプできます。

ここで、CPython に慣れた方は、上の range(p) に違和感を覚えるかも知れません。range() 関数の引数は整数でないとエラーになる筈なのに、Casio Python ではエラーになりません。これは独自仕様と言えそうです。

Reference:⇒ range()


以上で circle() 関数ができました。


 これまでをまとめたスクリプト:
"""Sample script

Exercise;
porting from Casio Basic
"Monte Carlo Method"

by Krtyski/e-Gadget
"""

from casioplot import *
from random import *
from math import *

#draw circle
def circle(xyr):
 r*6.283
 2*pi/p
 for i in range(p):
  px r*cos(i*a)
  if px<0 or px>383:
   continue
  py r*
sin(i*a)
  if py<0 or py>191:
   continue 
  set_pixel(int(px)int(py))
  show_screen()

#initializing
n_try=500

#display menu to select try#
print('\nMonte Carlo: calc Pi')
print('\n# of try:'+str(n_try))
print('[EXE] to start.')
temp_try input('\nChange the #?:')
if temp_try.isdigit():
 n_try int(temp_try)

#display graphics
#これ以降を書いて、プログラムを完成させます


4.5 グラフィックス出力 <fx-CG50 OS3.40以降専用>

Casio Python でグラフィックス画面 (描画画面) へ出力する関数は、点を描画する関数 set_pixel() と 文字列を描画する draw_string() の2つしかないので、これらを使いこなしたいと思います。set_pixel() については既に説明したので、ここでは、draw_string() に焦点を当てます。

これらのグラフィックス出力関数は、VRAMへのデータ転送を行い、画面への出力までは実行しません。従ってフラフィックス画面への出力は、show_screen() 関数を実行する必要があります。

グラフィックス画面を消去する clear_screen() 関数も使います。これは OS3.4 では隠し関数でしたが、OS3.5以降は公式関数となっています。

Note:Casio Python 組み込み関数を調べる
既に紹介しているように、隠し関数を調べるために ObjName.py が使えます。
これで見つかるのはオブジェクト名なので、ネットで詳細を調べる必要があります。


モンテカルロ法シミュレーションプログラムのグラフィックス画面への出力ブロックは、冒頭で書いたように、以下の手順でスクリプトを書いてゆきます。

 =============================================
 4.5.1 自作関数 circle() で円を描画
 4.5.2 draw_string()
関数で文字列を出力
 4.5.3 while
文による繰り返し(入力した回数分だけ繰り返し)
 4.5.4  random()
関数により正方形内の座標(x, y)を取得
 4.5.5  set_pixel()
関数で正方形内に点を描画
 4.5.6  
点の座標から円周率を計算
 4.5.7  draw_string()
関数で回数と円数率を表示
      
(ここまでを繰り返す)
 4.5.8 draw_string()
関数でシミュレーション終了の表示
 =============================================

4.5.1 自作関数 circle() で円を描画

円の中心座標を (290, 96) とし、半径を 90 とするので、以下を記述すればOKです。
そこで、それぞれを以下の変数に代入したものを使います。(数値を直接使っても問題ありませんが、あとで変更する可能性を考えて、初期化処理のブロックで変数宣言して、それを使うことにします。

以下を 初期化処理のブロックに追加します。
 r = 90 #radius
 dx = 290dy = 96 #center


Note:文の句切り文字 - ;
Python では、文の句切りとして改行が使われます。1行に複数の文を記述したいときは、文の句切り文字としてセミコロン ; も使えます。

円を描画するために、コメント #display graphics の下に
 circle(dx, dy, r)
を追記します。


4.5.2 draw_string() 関数で文字列を出力

以下のような出力になるようにスクリプトを書きます。
monteca_graphics_2 

 #initializing
 n_try 500
 r 90 #radius
 dx 290dy 96
#center


 #display graphics
 clear_screen()
 circle(dx,dy,r)
 draw_string(12,0'C=')
 draw_string(0,16'pi=')
 draw_string(0,160'# of try:'+str(n_try))
 draw_string(0,176'AC:Quit')
 show_screen()

今回既に説明した内容で書けると思います。


4.5.3 while 文による繰り返し

Python
には、繰り返し処理 (ループ) を行うために for 文と while 文の2つしかありません。for 文は既に使ってみました。ここでは While 文を使います。

Note:while 文
while 条件:
 処理1
 処理2

これが、while文の書式で、while の行末にはコロン : が必要で、コロンの行の下のインデントレベルを1段深くします。同じインデントレベルの行が、while による繰り返し処理の対象になります。

今回の繰り返し条件については、あとで説明します。


4.5.4 random() 関数により正方形内の座標(x, y)を取得

乱数発生関数 random() を使います。random() は、0 以上 1 未満のランダムの数値を返します。
ここでは、x が -1 ~ +1、y が -1 ~ 1 の間の乱数を取得します。

 x=1-2*random()
 y=1-2*random()



4.5.5 set_pixel() 関数で (x, y) に点を描画

点を描画するのは、円の中心 (dx, dy) と同じ座標を中心として1辺が2の正方形の範囲内です。そこで、点を描画する座標は、
 (dx+r*x, dy+r*y) 
となります。但し、set_pixel() のパラメータは、整数でないとエラーになるので、それぞれ int() で小数点以下を切り捨てて整数にします。

さらに、点を描画するには、set_pixel() を実行後に show_screen() を実行します。

 set_pixel(int(dx+r*x), int(dy+r*y))
 show_screen()



4.5.6 点の座標から円周率を計算

Note:モンテカルロ法による円周率の計算方法 (再掲)
  1. 半径1の円と一辺2の外接正方形を考えます。
  2. x=1-2×[0~1の乱数]、y=1-2×[0~1の乱数] を計算して、-1<x<1-1<y<1 の (x, y)を得ます。
    つまり、(x, y) は一辺2の正方形内のランダムな点の座標となります。
  3. 正方形内にランダムに円を打って行き、全ての点の数を outs とし、そのうち x2+y2<1 になる(円内になる)回数を ins とします。(オリジナルのCasio Basic プログラムでこういう感じなので、単純に移植するために追従します)
  4. [正方形の面積]:[円の面積]outs:ins=4:π なのて、π=4×ins/outs となります。
これをスクリプトで表現します。

 if x**2+y**2<1:
  ins+=1
 outs+=1
 pai = round(4*ins/outs, 11)


さて、While の条件を保留にしていましたが、ここで決めます。点を1つ描画するために 変数 outs が1づつ増えます。そこで、outs が試行回数 n_try よりも小さいこと、つまり outs<n_try を繰り返しの条件とします。

Note:累乗演算子 - **
x2Python では、x**2 と書きます。

Note:累算代入演算 (+=, -=, +=, /=, %=)
ここで、+= という演算があります。C言語系の経験があれば、おなじみだと思いますが、累算代入演算と言います。
ins+=1 は、ins=ins+1 と同じで、これを省略して記述するための演算子です。
a = a+b は、a+=b
a = a-b は、a-=b
a = a*b は、a*=b
a = a/b は、a/=b
a = a%b は、a%=b
と書けます。
一方、C言語系でおなじみに ++ 演算子(インクリメント、1増やす) を使って ins++ とすると、Pythonではエラーになります。

Note:四捨五入 - round()
Casio Python の浮動小数点は、小数点以下の有効桁数は15です。
シェル画面で、
 from math import *
 pi
を実行すると円周率が表示されますが、小数点以下15桁になっています。
今回のプログラムでは、計算結果の円周率は、何もしないと小数点以下15桁で表示されます。この桁数だと点描画の領域にテキストが上書きされます。これを避けるために、round() 関数を使って、
 pai = round(4*ins/outs, 11)
により、小数点以下11桁を指定して四捨五入しています。


4.5.7 draw_string() 関数で回数と円周率を表示

draw_string(36, 0, outs)
draw_string(36, 16, pai)


とすれば良いはずです。


ここまでをまとめます。

 これまでをまとめたスクリプト:
"""Sample script

Exercise;
porting from Casio Basic
"Monte Carlo Method"

by Krtyski/e-Gadget
"""

from casioplot import *
from random import *
from math import *

#draw circle
def circle(x,y,r):
 r*6.283
 2*pi/p
 for i in range(p):
  px x+r*cos(i*a)
  if px<0 or px>383:
   continue
  py y+r*sin(i*a)
  if py<0 or py>191:
   continue
  set_pixel(int(px)int(py))
  show_screen()

#initializing
n_try 500
ins = 0; outs = 0
90 #radius
dx 290dy 96 #center

#display menu to select try#
print('\nMonte Carlo: calc Pi')
print('\n# of try:'+str(n_try))
print('[EXE] to start.')
temp_try input('\nChange the #?:')
if temp_try.isdigit():
 n_try int(temp_try)

#display graphics
clear_screen()
circle(dx, dy, r)
draw_string(12,0'C=')
draw_string(0,16'pi=')
draw_string(0,160'# of try:'+str(n_try))
draw_string(0,176'AC:Quit')
show_screen()

while outs<n_try:
 x 1-2*random()
 y 1-2*random()
 set_pixel(int(dx+r*x), int(dy+r*y))
 if x**2+y**2<1:
  ins+=1
 outs+=1
 pai round(4*ins/outs,11)
 draw_string(36,0str(outs))
 draw_string(36,16, str(pai))
 show_screen()


さて一番下から3行の部分は、この通りに動作するとテキスト表示が次々と上書きされ、結果として真っ黒になってしまいます。
そこで、数字をカウントアップして、次々と変化が見えるようなスクリプトを検討します。


カウントアップのスクリプト

先ず、以下のスクリプトを作って検討します;

from casioplot import *
c = 0
clear_screen()
while c<=1000:
 draw_string(0, 0, str(c
))

 show_screen()
 c+=
1


変数 c を while ループを回るたびに 1 づつカウントアップし、それをグラフィックス画面に表示しています。
下から3行目 は、次々と上書きするので、以下のようになります。
countup_1 

そこで、同じところに空白文字で上書きすることで消去したのち、c の値を出力すれば良いというのは、いつも行うことです。
 draw_string(0, 0, '   ')
 draw_string(0, 0, s)


これでは、解決しません。スペースは空白文字ではないことが分かります。
では、明示的にスペースのエスケープシーケンス \x20 (16進数) あるいは \32 (10進数) を使ってみます。
 draw_string(0, 0, '\x20\x20\x20\x20')
 draw_srting(0, 0, s)


これでもダメです。
ちなみに、スクリプト編集画面で、[F4] (CHAR) を押してキャラクタセットを見てみると、そこには空白文字が見当たりません。スペースあるいは空白文字で上書きする方法は、Python では有効ではなさそうです。ネットで調べてみても、それらしい解決方法が簡単には見つかりません。

draw_string() 関数の第3パラメータ(引数) で、文字色を設定できます。そこで、同じ文字列を背景色の白で描画すれば、消去できるはずです。ループで前回描画したときのカウント cprev_c 変数に代入しておき、次に prev_c を白で描画すれば、目的の動作が可能になりそうです。そこで、次のようにスクリプトを変更してみます。

from casioplot import *
c = 0
clear_screen()
while c<=1000:
 draw_string(0, 0, str(prev_c), (255,255,255)) #追加
 draw_string(0, 0, str(c
))

 show_screen()
 prev_c = c #追加
 c+=
1


文字色の指定は、RGB指定なので、(255,255,255) で白を指定します。
これで目的が達成できました!!

ところで、追加した draw_string(0, 0, prev_s, (255,255,255)) の次に show_screen() も追加してみると、数値表示がチカチカして見づらくなります。show_screen() で画面への転送を行うと、消去した文字列が一旦表示されるのが原因です。そこで、VRAM上で、文字列消去と次の文字列データの書き込みを行ったのち、一気に画面への転送を行うのが良いわけです。


これと同じ方法を、モンテカルロ法のスクリプトに適用します。outs と pai の値を prev_outs と prev_pai の2つの変数に一旦格納し、次のループでの文字列表示の前に、前回の文字列を白色で出力します。

 これまでをまとめたスクリプト:
"""Sample script

Exercise;
porting from Casio Basic
"Monte Carlo Method"

by Krtyski/e-Gadget
"""

from casioplot import *
from random import *
from math import *

#draw circle
def circle(x,y,r):
 r*6.283
 2*pi/p
 for i in range(p):
  px x+r*cos(i*a)
  if px<0 or px>383:
   continue
  py y+r*sin(i*a)
  if py<0 or py>191:
   continue
  set_pixel(int(px)int(py))
  show_screen()

#initializing
n_try 500
ins = 0; outs = 0
prev_outs = 0
prev_pai = 0
90 #radius
dx 290dy 96 #center

#display menu to select try#
print('\nMonte Carlo: calc Pi')
print('\n# of try:'+str(n_try))
print('[EXE] to start.')
temp_try input('\nChange the #?:')
if temp_try.isdigit():
 n_try int(temp_try)

#display graphics
clear_screen()
circle(dx, dy, r)
draw_string(12,0'C=')
draw_string(0,16'pi=')
draw_string(0,160'# of try:'+str(n_try))
draw_string(0,176'AC:Quit')
show_screen()

while outs<n_try:
 x 1-2*random()
 y 1-2*random()
 set_pixel(int(dx+r*x), int(dy+r*y))
 if x**2+y**2<1:
  ins+=1
 outs+=1
 pai round(4*ins/outs,11)
 draw_string(36, 0, str(prev_outs), (255,255,255))
 draw_string(36, 16, str(prev_pai), (255,255,255))
 draw_string(36,0str(outs))
 draw_string(36,16, str(pai))
 show_screen()
 prev_outs = outs
 prev_pai =
pai


4.5.8 draw_string() 関数でシミュレーション終了の表示

シミュレーションが終了したときは、以下のように、左下の表示を Finish=>[EXIT] に変更しようと思います。
monteca_500 

シミュレーション実行中は、左下に AC:Quit と表示されています。そこで、これを白色で出力したのち、Finish=>[EXIT] を黒で出力すれば良いことは既に分かっています。

draw_string(0, 176, 'AC:Quit', (255,255,255))
draw_string(0, 176, 'Finish->[EXIT]')
show_screen()



このスクリプトは、while ループの外で実行するので、インデントレベルは while の中の処理よりも1段浅くしなければなりません。

 完成したスクリプト: monteca1.py のダウンロード
"""Sample script

Exercise;
porting from Casio Basic
"Monte Carlo Method"

by Krtyski/e-Gadget
"""

from casioplot import *
from random import *
from math import *

#draw circle
def circle(x,y,r):
 r*6.283
 2*pi/p
 for i in range(p):
  px x+r*cos(i*a)
  if px<0 or px>383:
   continue
  py y+r*sin(i*a)
  if py<0 or py>191:
   continue
  set_pixel(int(px)int(py))
  show_screen()

#initializing
n_try 500
ins = 0; outs = 0
prev_outs = 0
prev_pai = 0
90 #radius
dx 290dy 96 #center

#display menu to select try#
print('\nMonte Carlo: calc Pi')
print('\n# of try:'+str(n_try))
print('[EXE] to start.')
temp_try input('\nChange the #?:')
if temp_try.isdigit():
 n_try int(temp_try)

#display graphics
clear_screen()
circle(dx, dy, r)
draw_string(12,0'C=')
draw_string(0,16'pi=')
draw_string(0,160'# of try:'+str(n_try))
draw_string(0,176'AC:Quit')
show_screen()

while outs<n_try:
 x 1-2*random()
 y 1-2*random()
 set_pixel(int(dx+r*x), int(dy+r*y))
 if x**2+y**2<1:
  ins+=1
 outs+=1
 pai round(4*ins/outs,11)
 draw_string(36, 0, str(prev_outs), (255,255,255))
 draw_string(36, 16, str(prev_pai), (255,255,255))
 draw_string(36,0str(outs))
 draw_string(36,16, str(pai))
 show_screen()
 prev_outs = outs
 prev_pai =
pai

draw_string(0, 176, 'AC:Quit', (255,255,255))
draw_string(0, 176, 'Finish->[EXIT]')
show_screen
()


4.6 まとめ

Casio Python でスクリプトを書くための最低限の知識をざっくりと説明しました。
入出力に必要な関数、構造制御構文である 条件分岐 (if)、繰り返し処理(for, while) について、今回のスクリプトでおおよその使い方が分かったのではないかと思います。

各関数やメソッドについて詳しく知りたい場合は、ネットで確認してください。なお、Casio Python特有の仕様と思われるものは、別途 Reference として取り上げました。



目 次

前の記事 - 3. Casio Python の入出力

次の記事 - 5. 関数の作成と活用





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




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

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



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

Casio Python - Casio Education で e-Gadgetのモンテカルロ法が紹介

Python Casio Python - コラム
 Casioグラフ関数電卓の Python を使ってみる
     - Casio Education US で 当ブログオリジナルの montec31.py と u.py が紹介された
目次

初版:2022/01/03


Casio Education US は、カシオアメリカで作成してい電卓使いこなしのウェブセミナー (Webinar) で カシオ電卓の使いこなし動画が多くアップロードされています。これらの中で、当ブログ管理人が作成したプログラムが紹介されていました。

以下の Webinar を眺めていました;

Casio Ecuation Webinar: Python Live!




この動画を見ていたら、管理人が作成したスクリプトファイル名と同じ名前がでてきました。

Montecarlo_webinar_1

ファイルリストに montec31.py (モンテカルロ法で円周率を求めるもの) と e-Gadget製ユーザーモジュール u.py が有りました。これをみた時、「アメリカ人も同じファイル名をつける人がいるものだ...」と思いました。

この動画では、最初はコラッツ問題を Casio Python でリアルタイムコーディングして動作させています。
そういえば、当ブログでもコラッツ問題のPythonスクリプトを紹介しています。Casio Python の題材の取り上げ方、目の付け所まで同じなアメリカ人がいるものだなぁ、と思いながら引き続き見ていました。

そしていよいよ montec31.py の説明に進んできました;

Montecarlo_webinar_2

このプレゼンター (メインで話をしている人) が「これは自分で作ったものではなくて、YouTubeから拝借してきた great program です。」と言ってスクリプト画面を開きました;

Montecarlo_webinar_3

ナント、by Krtyski / e-Gadget と表示されているのを見て、驚きました!
管理人が作ったプログラムコードではありませんか!

ここで、思い出しました!
そういえば、動作画面の動画をYoutubeにアップロードしていて、ソースコードに興味があるから入手できないか?とコメントがあったのです。その時の人の名前が、この動画のプレゼンターの名前と同じだったことも確認できました。
そうか、あのときの人が今しゃべっているんだ...と。

その時は、ダウンロード用の html は日本語表記だけどGoogle翻訳すれば意味はわかるし、ソースは全部英語表記なので問題ないと思うと書き添えて、以下のリンクを連絡しました。

モンテカルロ法 Ver 3.1 スクリプトのダウンロード
fx-CG50 (高精細カラー液晶モデル) か fx-9750GIII / fx-9860GIII (低解像度モノクロ液晶モデル) かを自動判定するので、どのモデルでも正常動作します。

管理人が作成したモンテカルロ法の スクリプトを使って、ユーザーモジュール u.py の紹介、CGモデルとFXモデルを判定する関数、カラー設定する関数、円を描く関数の紹介、そしてやユーザーモジュール u.py の簡単な説明と、その使い方、YouTubeなどで入手したスクリプトの導入方法の説明をしています。



ところで、このYouTube動画では fx-CG50 のエミュレータの画面がメインで使われていますが、グラフィック画面の更新が全画面正しく行われないようです。実際の動作は全画面更新されますので、エミュレータの不具合かも知れません。動画内でも言っていました。
実際には、上記からダウンロードして実際に Python モードで動かしてみてください。



最後に、この動画では、e-Gadget という名前のグループ (英語では company、会社じゃなくて仲間という意味合い) の人達が作ったプログラムだと言っていますが、実際は管理人が1人で作ったのですけどね~


登録者数 6450人のうち せいぜい 1140回程度の視聴回数ですが、チョット嬉しいです!




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




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

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

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

Casio Pyhton - turtle / matplotl モジュール

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - Casio Python 用 turtle / matplot モジュールの入手
目次

初版:2022/01/03


Casio Python 用に turtle モジュールと matplotl モジュールが CASIO USA から公開されました。これらモジュールを使ってみたいと思いますが、先ずは入手方法を紹介します。


CasioEducation US の YouTube
CasioEducation US の YouTube にアクセス

Casio_Turtle

この画面の下にある CasioEducation US のコメントで "もっと見る"  をクリック。

Casio_Turtle_2

MatPlot libraryTurtle のURLをクリックすると、それぞれで Dropbox が開くので、そこから matplotl.pyturtle.py をそれぞれダウンロードする。


Matplotl モジュール

matplot


Turtle モジュール

turtle


ダウンロードしたモジュールのインストール

Pythonモードが搭載されている電卓 (fx-CG50) をPCと接続し、py ファイルが格納されているフォルダにダウンロードした matplot.pyturtle.py をコピーします。

これで、MatPlot モジュールturtle モジュールが使えるようになります。





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




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

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

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

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

やす (Krtyski)

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


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

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

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


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR