プログラミング機能

 コンピュータがあって数学ソフトを使うなら、BASICみたいに関数を使って繰り返しや分岐を使った演算が出来るといいですね。

 「カルキング」には、スクリプトを使ってプログラミングする機能が準備されています。 メニューバーから、 入力 スクリプト と追っていくと、Function, For, Case, Block, 及び、制御文 に分類された各種のスクリプトが入力できます。

Function
 関数定義です。
 関数名と、引数を定
義します。
For
 繰り返し演算で、
While の代用として
も使います。
Case
 分岐文です。
 1つにすれば、If文
です。
Block
 Case文の分岐先の
ように、数行まとめて
単一動作として実行
をさせるとき使います。
制御文
 Break文、Continue
文等、多くの場合、条
件付で使います。

 先ず簡単なところで、繰り返し演算のみのプログラムで、九九の掛け算表を作ってみます。 最初に、データ入力先として、表の空枠を準備します。 この表は、メニューバーの 入力 表/行列 表の作成 で行数と列数(9*9)を指定し、列の幅は3文字にしました。 左上に1*1=1 で右下に 9*9=81 が入るような表にします。

 最初が関数名と引数を指定する作業で、長方形のカーソルを準備して、 入力 スクリプト Function です。 入力パネルの指定に従って関数ブロックの名前は「mult」、引数名は、パラメータリストの欄に「x」と記入しました。「OK」ボタンを押すと、準備したカーソルの場所に関数定義の枠組みが作られ、? のところにカーソルを置いて入力待ちになります(a)。


a)

b)
 ? の位置にカーソルを置いたまま For文を入力します。
 入力 スクリプト For です。 制御変数名は、繰り返し演算用
の変数で「k」にしました。ループの範囲は、1〜x にしました。
 xのように変数を設定することもできます(b)。
 二重ループにするために、新しい ? の位置にカーソルを置いた
まま、再度 For文を入力、ここでは、制御変数名を「h」にした他は
同じにしました(c)。
 スクリプト専用のfor,to,step,return等は、パネル入力のみが
有効で、手入力では意味を持ちません。

c)

d)

e)

 ところで、表の中のセル・アドレスですが、「Sheet1k,h」のように、表の名前にサフィックスを付けます。サフィックス入力はF2(添え字)を使い、列(k)と行(h)をコンマで区切ります。 このセル・アドレスに対して「=k*h」は、計算結果を表の該当するセルの中へ代入(データを挿入)する意味です(d)。

 return に、x*xと置いたのは、この関数を実行した場合の演算結果を 9*9=81 となるようにしただけです(e)。 ここでは表の最後の値を与えるようにしましたが蛇足みたいです。 但し、この行自体を削除すると目的の表は得られるものの、エラー扱いになります。 「カルキング」で関数は、演算結果を与えることになっているからです。

 この戻り値ですが、計算結果だけでなく表示させたい文字列にすることもできるそうです。 その場合、return "文字列"のようにダブルクォーテイションで括ります。

 関数全体を選択して、 実行 関数定義 を指示すると、定義完了です。 改めて長方形のカーソルに対して「mult(9)=」と入力の後 entet すれば、答えの81が出力されますが、肝心の表入力の方は、下表の左のようになります。

 この手のプログラミングに慣れない人のために解説すると、 1. 外側のFor文は、変数k(列位置)が1〜9の変化をする間に、1列ごとに 2. 内側のFor文で、変数h(行位置)が1〜9と変化しつつ、指定アドレスに計算値k*hを入力した という流れになります。

 表(Sheet1)が空っぽの状態で、「mult(5)=」とすれば、右のようになります。 上記の作業では縦横の数を同じに作りましたが、別個の数値を入力するようにもできます。最初からパラメータリストの入力で、引数を「x y」のようの2つの変数をスペース(又は、コンマ)で区切って入力すれば、下のサンプルのようになります。 内側のFor文も、少しだけ変えてみました。

内側のh(行)は、偶数のみ計算。
列数が7、行数は8で実行

 ここまでは、プログラム作成作業の中で、行挿入や行削除の作業は不要でしたが、通常のプログラミングでは当然必要です。
 ctrl+enter 入力すると、現在キャレット(カーソル)の置かれた行の後に ? 付で新しい行を追加することができます。 又、メニューバーの「行/列」で、「行の挿入」を使えば、行の前へ1行挿入できます。 「行の削除」の対象は、キャレットのある行です。

 作ったプログラムで、関数の計算を「実行」させた場合に、いつまでも終わらないことがあります。ループ文から脱出できない場合です。 困った時は、「Escキーを入力すれば止まってくれます。 再実行しても同じことになります。その前に、ループ文の中で「同じところをグルグル回っている部分」を見つけ、修正しましょう。


 ここで、制御文を使った作業を見ておきましょう。 良く使う Break文は、ループから脱出するためのものです。 今回のプログラムで使う Continue文は、ループの中で後続の作業を打ち切って同じループの次のサイクルへ移動するものです。

 どちらの文も多くの場合 If文を伴うものですが、カルキングでは、独立した If文はありません。 挿入 スクリプト 制御文 を使って入力する際に、ラジオボタンでBreak文等を指定するとき、「条件パート付」にチェックを入れます。

 では、実例を見てみましょう。 エラトステネスの篩です。素数を極めて短い時間で求めてくれます。

 配列aを準備します。 要素の数は1000にし、全要素を1(素数扱い)にしました。 関数名は「Sieve」、引数は作業対象の最大値で、nにしました。

 メインのプログラムです。 ループへ入る前のxは、外側のループの最大処理値を決めています。nの平方根迄で十分で、1000まで求めるなら、31までの素数で篩(sieve)にかければ間に合います。 a1=0は、「1は素数ではない」という定義どおりの作業。

 外側のループで、k=1から始めて、同じ番号の配列aの中身が0(非素数)なら、何もせずにkを1番進めます。 k=1ならa1=0の定義に従って、何もせずにk=2へ進みます。 中身が1(素数)の場合は、内側のループの作業をします。

 素数の場合に、「その素数の自乗」番目のアドレスのデータを、0(非素数)にし、アドレスがk進むたびに0を入れていきます。k=2は素数なので、2*2=4番地に0を置いた後、6,8,10 ・・・番地へ0を入れていき、hがn以下であれば繰り返します。

 h=3なら、3*3=9番地から、12,15,18 ・・・番地を0にします。 h=4は、非素数なので(2で処理済)何もせず、次のn=5の作業です。 6は2の倍数でスキップ。 前の行程で非素数に変わらなかった数は素数として残り、素数であると確認済みの数のみで先の作業を続行します。

 nの平方根xまでの作業で終わらせる理由は、次の作業では、h=k*k が n より大きくなり目的の作業領域の外側へ出てしまうからです。

 関数が出来上がったので、実行してみます。 戻り値は、ここでは、平方根nです。

 a= に続けて enter です。 文字が小さくて見え難いかもしれませんが、2,3,5,7,11,13・・・番目が、1(素数)になっています。

 これで、素数と非素数を分ける作業は済みました。 でも、順番に数えていかないと、どれが素数か分りません。


 ここでは、配列aを取り出し、中身が1(素数)であれば、別に作る配列bに、配列aのアドレスを置く作業をやってみます。 最初に、配列bを準備し、中身を全部0にしておきます。

 j=0 これは、配列bのアドレスを0番地(実際は無い)として準備します。 ループでは、データの中身が0の場合は、何もせずに、kを1番地進めます。最初の1番地の作業です。 中身が1(素数)の場合は、j をインクリメント(1加える)します。 ついでに、bにaのあったアドレスkを入れます。

 素数2の場合に、b1番地に、aが1であった証拠として、アドレスの「2」を入れます。

 戻り値は、j 即ち作業終了時の「プログラムの配列b」の入力アドレスです。 bに入力したデータの個数です。 関数名「get_prime」、引数「1000」で、計算させると、次の瞬間に、個数を表示してくれます。

 ここで、b= enter です。 どうやら、1000までの素数が全部で168個、リストアップできたようです。

 もっと大きな数まで求める場合は、配列の大きさを大きくすればいいことになります。1万までを対象にするなら、それに見合った配列にします。 Sheet2 を参考にして、配列定義を次のようにしました。

 プログラムの方は、2つに分かれていると面倒くさいので、単純に繋ぎ合わせたものを作り直しました。

 作業の方も、1と0ばかりの配列aは見る必要もありません。 b= に続けて enter により、1229個目が9973で、次は1万を越すことが確認できました(10007になります)。 下のデータは、出力された配列全体を大きな画像にしてから、その配列の末尾が残るようにトリミングしました。

 配列aから、偶数部分を取り除けば、処理量も時間も半分になります。でも、解説が込み入ってくるので、ここでは割愛しておきます。 最大幾つまでの作業ができるかは未検討です。興味のある方は試してみてください。

 上記のプログラムは、e-book「関数グラフ入門」の付録「math」フォルダに「script3.clk」として収録してあります。

 次のページ へ進む

 トップページ へ戻る

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送