McCalは、数式の自然表示機能を備えたプログラム関数電卓アプリです。 日本メーカーの関数電卓上位機種ユーザが違和感なく使える事はもちろん、Androidならではの機能を目標にしています。その特長は:
よくある質問(FAQ)ページを用意しました。内容は:
Version 5: 配列などの計算結果を簡単に閲覧できるインスペクタを装備しました。インスペクタを起動するために、電卓キー画面に新しく
ボタンを新設しました。 の隣(大画面用レイアウト)、あるいはシフトポジション(小画面用レイアウト)にあります。
行列演算子:行列計算や要素ごとの計算のための新しい演算子が利用可能になりました。左除算演算子や要素ごとの乗算演算子 (.*)、コロン演算子などです。MATLAB風の演算子の形に合わせてあります。複素数を要素に含む行列から逆行列を求めることが可能になりました。
行列演算用のヘルプドキュメントを参照してください。
方程式の解:複素数を係数にふくむ高次方程式の解を求めることもできます。多項式の値の計算や、積・和などのサポートを行う関数群を用意しました。
多項式の計算・方程式の解ドキュメントを参照してください。
McCalを立ち上げると、関数電卓らしい画面が現れます。画面上部に表示ウィンドウが、残りの大部分にボタンが格子状に配置されます。
McCalは、数式をできるだけ自然な順に入力し、直感的に理解できるように数学的に自然な形で表示することを主眼に開発されました。 いままでの関数電卓ユーザにも、違和感のない操作方法で次のような数式をリアルタイムに描画します。
このドキュメントでは、キーストロークを
の様にラベル付きの四角で表します。つまり、この例では1,8,0のボタンをこの順番で押したという事です。数字のみの場合 と省略することもあります。青色または赤色は、McCalのボタンの色に合わせてあります。ラベル(文字)が黄色のボタンは、キーボード左上の を押してから該当するボタンを選択した事を示します。
表示ウインドウの上には、アクションバーを装備しました
タブレットなどの大画面や横方向に対応しました。まず手持ちのAndroid機にあったキーレイアウトを選ぶために、最初にアクションバー内の一番右上のオプションメニューボタンを押して「画面レイアウトを選択」を選んでください。
アクションバーは非表示にすることも可能です。
ボタンを選択すると、アクションバーは非表示になり、もう一度同じボタンを押すか、画面方向を変えると表示されます。アクションバーに表示されるアイコンには、特有の機能が割り振ってあります。また、アクションバーが非表示の時も各種機能を呼び出せるように、対応するボタンを新設しました。ラベルを不等号記号で囲ってあるボタン
と、対応するアクションバーアイコンの機能リストを以下に示します。アイコン | ボタン | 説明 |
アクションバーの表示・消去 | ||
電卓キーパッドを切り替え | ||
McCal Viewerを起動する | ||
Function Viewerを起動する | ||
ソフトウェアキーボードの表示・非表示。エディタウィンドウをタッチすることでもキーボードを呼び出せます。 |
括弧で括られたラベルを持つボタンーーたとえば、
や ーーは、設定のためのダイアログ、あるいは関連した関数グループへのショートカットのためのダイアログを開きます。
それでは実際にやってみましょう。
180 ÷ 6 (答)30
を計算するには、
と、入力式と答が表示されます。また表示ウインドウ内右下には清書した評価式が白抜き文字で現れます。分数表示されていることに注目してください。
McCalは、ユーザのキーストロークを文字列に置き換えて記録する機能があり、これによって、 履歴を管理したり修正・再計算ができる仕組みになっています。従来の関数電卓と似たキーストロークから、McCal専用に開発されたスクリプト言語のソースコードを作成します。プログラミングの経験のない人には一見すると判りにくいかもしれませんが、そのかわり数式として自然にリアルタイムに描画・清書する機能を持ちますので、直感的に理解し間違いを防ぐことができます。
表示ウィンドウのテキスト表示部分には'÷'のかわりに'/'が表示されています。これは式に使う文字コードは出来るだけアスキーコードとして定義されている文字を使う方針にしてあるためです。C, Java言語風にしてあるといえましょう。
実際、操作は、すべてソフトウェアキーボードから文字列として入力できます。(ただし、評価ボタン(eval)などの特殊ボタンと後置代入演算子を除く。)場合によっては、ソフトウェアキーボードからの入力の方が簡単な場合もありますし、ソフトウェアキーボードを多用する機会が多いと思われます。
すぐ前の計算結果(ラストアンサー)を再利用できます。2.76×10-7に先ほどの結果をかけてみます。
2.76E-7*#ans() ▶ 8.01E-6
#ans()は直前の計算結果を呼び出す関数です。電卓らしく
ボタンを続けることでも計算できます。
*2.76E-7 ▶ 8.01E-6
(メモ)10の指数(2.76×10-7)を入力するには、
ボタンを使います。テキスト表示は、'E'が用いられることに注意してください。過去の計算式を呼び出すこともできます。sin(180÷6)も計算したかったとしましょう。
ボタンは、現在のカーソルの位置に過去に入力した式(この場合180÷6)を貼り付けます。 により呼び出された履歴は、エディタの領域として選択されます(ここでは緑色)。 従って、 ボタンをさらに押すと、過去へ遡って置換されていきます。上の例では、 を二回押していますので、二回前の入力 '180/6'が呼び戻されています。
エディタの領域を解除するには、カーソル移動ボタン(キーパッド最上段の矢印キー)のどれかを押します。Sin関数の角度モードは、最初は度(Degree)に設定してあります。(sin30°=0.5)。
カーソル・選択領域・改行・バックスペース(
)の扱いは、テキストエディタ(あるいはワードプロセッサ)に似せてあります。キーパッド最上段にはカーソル移動ボタン( )があり、これらのボタンと履歴機能を使えば、過去に入力した式を自由に呼び出し、修正し、再評価を行えます。それでは、#sin(180/2)に変更してみましょう。
, を何度か押し、 カーソルを'6'の後ろに移動し、 を押してみてください。'6'が消えるはずです。そして を押せば比較を出来るように、前回の結果'0.5'は残して、新しい結果('1', sin90°= 1)を付け加えています。もし出力行が画面からはみ出した場合は、エディタウインドウを上下にスワイプして下さい。
以上をまとめると、McCalはユーザのキーストロークをテキストに変換できること、履歴機能を使って、そのテキストを呼び出して利用したり変更できます。
McCalは、
ボタン以外にも、操作履歴を簡単に見る事ができるビューワ(McCal Viewer)を備えています。McCal Viewerを起動するには、Android アクションバーにあるビューワアイコン を押すか、
( をおして )ボタンを選択します。続いて「履歴」タブを選択すると、履歴のリストが現れます。McCalは50個、McCal-liteは5個まで記憶できます。数式は、数学形式に清書されていることに注意してください。
このリストビューの各項目をタップすることにより、下図のようなダイアログが現れますので、数式あるいは計算結果を電卓画面に呼び出すことができます。
McCalViewerについては、McViewerのヘルプドキュメントが用意されています。
以上まとめると、McCalは、ユーザのキーストロークを減らし、再利用・修正できるようにデザインされています。
関数電卓として使うためのいろいろな関数が定義されています。円周率(π)、ネイピア数(e)、ラストアンサー(直前の計算結果)でさえも、それぞれの定数・値を返す関数として呼び出します。
例として、
ボタンを押してみましょう。表示ウィンドウのテキスト部分には '#pi() '、清書部分には'π'が表示されます。McCalは、式の中に'#'が現れると、引数を表す括弧が現れるまでの間の英数字を、関数名であると見なします。もっとも、関数ボタンを押すと自動的に#が付加された関数名が現れるので、ユーザは入力する必要はありません。次の三個の式
, ,2#pi() #pi() 2 2×#pi()
は同じ値 6.283185... を返します。McCalでは、乗算記号(×)を省略することができます。
関数に与える引数が必要な場合は、括弧とコンマを用います。
#max(3.2, 3.3) > 3.3
この括弧とコンマをボタンで入力するのは面倒ですので、'入力ボックス'という機能があります。引数を必要とする関数のボタンを押すと、表示ウインドウのテキスト部分に関数名と括弧と共に、必要な引数の数に対応した'入力ボックス'が表示されるので、括弧やコンマを入力したり、引数の数を憶えておく必要はありません。また清書表示部分には入力が済んでいない引数は四角形の箱で表示されます。
平方根関数(#sqrt)と分数関数(Fraction, #frac)を例にやってみましょう。
を計算したいとします。まず平方根関数ボタン(square root, #sqrt(),
)を押すと、表示ウィンドウには
と表示されます。次に分数を入力したいので、直ちに
ボタンをおすと平方根の中の、領域選択された入力ボックスは、新しい二個の入力ボックスをもつ分数関数に置き換わり、
と表示されます。分数関数(#frac())は、引数を二個取る関数で、それぞれ分子、分母の順にならびます。ここで、分子用の入力ボックスが自動的に選択ハイライトされています。
次に と押せば分数の分子部分がおきかわり、
ここで分母部分の入力に移りたいので、キーボード右上の'入力ボックス移動ボタン'(
)を押すと、McCalは、次の入力ボックスを探し出し、領域選択します。
最後に分母部分を入力して
で計算が行われます。
入力途中でも清書表示が行われ、数式の入力順にできるだけ沿った上で、入力が最小のキーストロークで行われるように、この方法が採用されました。以上の手順を一度に書くと、
計10手となります。分数関数については、
#sqrt( (4+8) / (1+2) )
の様に、括弧と割り算で 置き換えても同じ結果になります。どちらでも好みでかまいませんが、一般的には#frac()の方がキー入力回数は少ないようです。
McCalではこの入力ボックスを採用しているため、関数の括弧は自動的に閉じられます。一部の関数電卓のように')'で閉じることに注意する必要はなくなりますが、 その代わり括弧の外にカーソルを出す場合は、'入力ボックスへ移動ボタン'(
)を多用する必要があります。
関数をユーザが自由に定義できます。関数内では、BASIC言語様のプログラムを組むことができます。また、内部でローカル変数を使うことができ、複数の結果を返すことができます。
関数を宣言するには、二通りの方法があります。第一は、電卓内でFunction宣言を行う方法です。この目的のために電卓第二画面(キーパッドを横にスワイブすると現れる画面)に
ボタンを新設しました。第二は、ビューワ(McCal Viewer)を使う方法です。関数の管理およびソースコードエディタを持っています。これらの方法の詳細は第14〜15節で実例と共に説明します。
複数の返り値
複数の値を返すには、Return文でコンマで区切ってリストアップします。
Function #Test.test(a) { ...; Return x, y, #sin(a)}
複数の返り値を捕捉するには、値を格納すべき変数を角括弧でリストします(変数リスト)
[x,m,s] = #Test.test(2.5) x = #Test.test(10.5)
変数リスト内の変数の数は、返り値の数と同じか少なくなければいけません。少ない場合、返り値の多い部分は捨てられます。
三角関数を計算する時の角度の単位や、結果を表示するときの書式などを設定できます。
デフォルトでは、三角関数の引数は'度 (degree)'で解釈される設定になっています。表示ウィンドウ近くにその時の角度のモードが表示されています。(上の図の中の赤色2)ラジアンなどに変えたい場合は、Androidのmenuボタンをおして設定ウィンドウを呼び出します。あるいは、電卓キーボードから
ボタン( のシフト位置)を押す事で呼び出せます。書式を変更するには、同じくAndroidメニュー・設定から小数点の表示のための書式ダイアログを呼び出します。あるいは電卓キーボードから
ボタンを押す事で呼び出せます。浮動小数点・固定小数点・科学・技術などの書式モードをラジオボタン、小数点以下の表示桁数をスライダで変更できます。計算終了後、すぐにインスペクタボタン
を押せば、各種表示方法で計算結果を再表示できます。
16進数や8進数などの数値を入力できます。デフォルトの10進数以外の基数の数値を入力するには、数字列の前に識別子を付けます。Java/C言語に似せてあります。
ボタンは、 のシフト位置にあります。ベース | 前置識別子 | 例 ⇨ 10進での値 |
16進 | 0x | 0xFF ⇨ 255; 0x36afc ⇨ 223996 |
10進 | (無し) | 1234 ⇨ 1234 |
8進 | 0 (ゼロ) | 0377 ⇨ 255 |
2進 | 0b | 0b11111111 ⇨ 255 |
16進数の場合、0~Fまでの文字が使われますが、変数(次の節で説明します)と混同しないように注意が必要です。たとえば、0xffgは、0xFF(10進数表記で255) * g (変数)と解釈されます。'g'は、16進数では使われませんので、16進数は'g'の手前で終わっていると解釈され、省略された乗算と解釈されるためです。
同様に8進数で表記したつもりで078と入力すると、'8'は8進数で使われる数字ではないので、'8'の手前で8進数表記は終わっていると判断して、7*8 = 56と解釈されます。判りにくければ、後述の変換用関数を使って下さい。
0x100 * 0b101 ▶ 1280
16進0x100と、二進数101のビット積 = 0x500
0xFFFF & 0x3aF ▶ 943
10進数と16進数のみ、浮動小数点を表記できます。指数の指定は、それぞれ'E'と'p'を使いますが、それぞれ10と2の指数であることに注意して下さい。また、E, pの後ろは、10進の数として解釈されます。以下に例をリストします。
表記 | 表示(10進) | 数学的表現 |
3.14E-4 | 3.14E-4 | {3 + 1/10 + 4/(10*10)}×10-4 |
0x1p1 | 2 | 1×21 |
0xF.2Ap-3 | 1.895508 | 0xF.2A×2-3, {15 + 2/16 + 10/(16*16)}×2-3 |
07.2 | 1.400000 | 07 * .2 (8進数7と10進数0.2の積) |
10進数浮動小数点の場合、内部表現の2進数浮動小数点に変換する際に丸め誤差がしばしば発生しますが、16進浮動小数点の場合正確に変換できます。このため、'p'を用いて2の指数を指定する事になっています。
数の基数変換
インスペクタを使って、計算結果をそれぞれの進数に変換できます。
スクリプト内で変換
基数変換用の関数も用意されています。引数に文字列・数を受け取ると、それぞれの基数で変換した数値・文字列を返します。前置識別子は無視されます。直接前置識別子で表記する場合と異なりスペース文字は無視されますので、桁を見やすいように分けることも可能です。引数に数値を受け取ると、文字列に変換して返します。
基数 | 変換関数 | 例 ⇨ 10進での値 |
16進 | #hex("...") | #hex("FF FF") ⇨ 65,535; #hex("3 6a fc") ⇨ 223996 |
8進 | #oct("...") | #oct("377") ⇨ 255 |
基数変換用の関数の引数に数値をわたすと文字列を返します。
基数 | 変換関数 | 例 |
16進 | #hex(...) | #hex(0377) ⇨ "0xFF"; #hex(223996) ⇨ "0x36AFC"; #hex(0.5) ⇨ "0x1.0p-1" |
8進 | #oct(...) | 引数は整数。#oct(255) ⇨ "0377"; #oct(0xFF) ⇨ "0377" |
#hex(), #oct() 共に引数の型を自動判別して、対応する型を返します。
( のシフト位置)を押すと、これらの関数を選択するダイアログが現れます。
McCalは、度分秒と浮動小数点の間の変換を行う機能をそなえています。DMS (Degree-Minute-Second, 度分秒)変換あるいは、HMS (Hour-Minute-Second, 時分秒)変換は、度あるいは時の60進法の値を、内部で扱える浮動小数点に変換して演算を行います。HMSは、DMSで代用します。
(度の内部表現) = (度) + (分)÷60 + (秒)÷3600度分秒を入力するには、
ボタンを使います。Sin(23度15分32.5秒+5分11秒)を計算する例です。
テキスト表示では、°の文字が分秒の位置にも現れますが、清書表示では、度分秒に応じた表示が使われています。分秒のみの値を入力する場合は、0度を必ず入力してください。秒の後ろの
ボタンは省略可能です。浮動小数点実数を度分秒表示に変換するには、DMS変換関数(#dms())を用います。引数の値を、度分秒に変換し、文字列として返します。#hms()関数は、時分秒の表記法に沿った文字列(HHH:MM:SS)を返します。
23°15°32.5 ▶ 23.259028 #dms(#ans()) ▶ "23°15'32.5" " #hms(23°15°32.5) ▶ "23:15:32.5"
一度計算した値を保存して置く事ができれば便利です。関数電卓のメモリーに相当する機能は、McCalでは変数と呼び、英文字一つだけの名前をつけて管理できます('a'-'z', 'A'-'Z', ただし、'i'は除く)。また、Version 3からは、グローバル変数に単語を変数名に使うことができるようになりました。
'i'は、複素数単位として使われますので、変数としては使用できません。
変数に数値を記憶させるには、プログラミング言語風に代入によっておこないます。まずは代入ボタン
(エディタウィンドウには、=(イコール)として表示されます)によって変数に値を代入してみましょう。a = -2i-3
これで変数'a'に複素数の値'-3-2i'が代入されます。アルファベットを入力するには、ソフトウェアキーボードを使います。
計算が終わっって得られた結果を、後から変数に記憶させることもできます。後置代入演算子(
'STO'は、'STOre'の略)を使います。⇒ a ▶ -3-2i
変数が保持する値を使う場合は単純に式の中で変数名を評価することによって行われます。McCalには、旧来の関数電卓の一部で見られる'Recall'ボタンはありません。
a ▶ -3-2i
さらに
b = a * 2 ▶ -6-4i
であれば、答-6-4iが得られると共に、変数bに代入されます。
代数学的な慣例にしたがって、
を省略することが可能です。たとえば a=-3-2i の状態でb = 2a ▶ -6-4i
3 + ab ▶ 13 +24i
b = (a+3)(a-6) ▶ -4 +18i
(注意) 演算子の優先順序があり、積は和より優先されるので先に計算されます。優先順位はJava, Cなどと同じにしてあります。
さらには、この省略された掛け算は、明示的な
, より優先して計算されます。次の例では、'aa'の間の省略された掛け算の方が強く結びつけられています。明示的な掛け算、割り算は出現順に計算されます。
数式の清書機能により、意図しない計算をしてしまう危険はほとんどありません。
大文字の変数と省略された掛け算を使う時は注意が必要です。大文字は、Print, Forなどのキーワードの開始として認識されますが、一文字の時のみ変数と解釈されます。たとえば:
F=2; o=3; r=4 F or ▶ 24 F*or ▶ 24
'F'の後ろにスペース文字あるいは乗算演算子が入っているため、'F'は変数として解釈されます。
For ▶ Error
上の例では、'For'は、大文字の後に英文字が続いているため、キーワードとして認識されます。キーワードとしての'For'は、McCal Editor Helpで説明します。
変数が記憶できる値は、整数・浮動小数点数値・複素数・配列・文字列です。これらの型の間の演算は、出来る限り自動的におこなわれます。たとえば文字列の場合、和(+)のみが可能で、文字列の連結を行います。数値と文字列の和は、数値を文字列に変換して連結されます。
単語(複数文字)の変数名を指定するには、'@'を前につけます。例:@name, @ageなど。またこの'@'を持つ変数はグローバル変数であることを表し、ユーザ定義関数内から読み書きできます。逆に英小文字一つだけの('@'をつけない)変数名は、ユーザ定義関数内ではローカル変数として扱われます(その関数内でのみ見えます)。この変数のスコープについては、McCal Script Helpで説明します。
@age = 4 ▶ 4 @name = "MilimaCode" ▶ "MilimaCode" @intro = @name + ", "+ @age + " 周年" ▶ "MilimaCode, 4 周年"
McCal Viewer を起動すると、変数の値をリストビューにて表示してくれます。
配列の宣言
配列を使うには、Dim宣言文(Dimension)で特定の変数を配列として宣言します。
Dim a[20]
配列の添字は0から始まります。この例では、a[0] ~ a[19]までの配列が使えます。各要素の初期値は0です。
多次元配列を宣言するにもDim文(Dimension) 使います。複数の添え字には、次の二種類の表記法が使えます。
Dim b[2][3], c[10,2]
配列の要素の操作
配列の各要素には、実数・複素数・文字列の値を代入できます。各要素にアクセスするための添え字は、角カッコの中にコンマで区切ってリストアップするか(ex. b[10,3])、角カッコを並べる記法も使えます。(b[10][3])
b[0,0] = 16; b[0,1] = "野茂"; b[0,2] = "英雄" b[1][0] = 51; b[1][1] = "鈴木"; b[1][2] = "イチロー"
評価結果が配列の場合、単純に "array[10][3]"のようにサイズを表示します。各要素の値は表示しません。
b ▶ array[2][3]︎
Print 文あるいはインスペクタを使うことで、配列の内容をチェックできます。
Print b ▽16 ▽野茂 ▽英雄 ▽51 ▽鈴木 ▽イチロー
Print命令の出力の中の'▽'は、別の要素であることを示すと同時に、ログを記録中であれば、スプレッドシートファイルの別のセルに書き込まれることを示しています。
しかし、もっとも簡単に配列の内容を見るには、インスペクタ(Inspector)を起動することです。
ボタンを押すと、インスペクタが立ち上がり、直前の計算結果を表示してくれます。それが配列の場合、スプレッドシートのように表示し、タッチ動作で動かすことができます。変数が保持する配列データをスプレードシートプログラムのように表示するArrayViewerも装備しました。Array Viewerは、McCal Viewerの一部であり、McCal Viewerから起動します。ArrayViewerについては、ヘルプドキュメントが用意されています。
Array Viewerを使うと、Excel mobile, QuickOffice などとの間で相互にデータをコピーペーストすることが出来ます。
配列の使用はAndroidのメインメモリを消費します。現在の所、4000個までの要素の制限をかけてあります。多次元配列でも要素の総数は4000個までです。また多次元配列も現在は3次までです。
McCalは、一次元配列をベクトルに、二次元配列を行列として、行列演算を扱うことができます。
配列を作る
配列データの作成には、各要素に代入文で値を入れるのは面倒です。角括弧を用いてコード中で宣言するか、ArrayViewer を用いてインタラクティブにデータ入力できます。角括弧で二次元配列を定義する時は、二重の角カッコを用います。
a = [[1,2,3],[4,5,6],[7,8,9]] Print a ▽1 ▽2 ▽3 ▽4 ▽5 ▽6 ▽7 ▽8 ▽9
上記の例では、配列aのサイズは、a[3][3]になります。Dim文でサイズを指定した場合、サイズ指定が優先されます。指定されていない要素は0になり、右辺側の配列の方が大きい場合は余分な要素は捨てられます。
Dim a[4,4] = a Print a ▽1 ▽2 ▽3 ▽0 ▽4 ▽5 ▽6 ▽0 ▽7 ▽8 ▽9 ▽0 ▽0 ▽0 ▽0 ▽0
角カッコは、以上述べたように、配列の添え字を表す場合と、配列データを指定する場合の両方に使われます。McCalでは、変数名と共に使われる時のみ、添え字とみなします。
従って、配列を返す関数がありますが、その要素にアクセスするには、一度変数に代入してから、添え字を使う必要があります。
Array Viewerを使うと、配列のサイズや要素をインタラクティブに操作できます。
配列の領域を指定できるコロン演算子がサポートされました。MATLAB風のコロン演算子に合わせてあります。ただし、MATLABでは添え字は1から始まりますが、McCal では、0からはじまります。
下のArray Viewerスクリーンショットで表示されているデータを例にとり説明します。
単一の要素にアクセスするには、前節で述べたように、添え字を用いて指定します。
@soccer[0,1] ▶︎"Messi"
コロン演算子を用いると、配列の添え字で範囲を指定できます。下の例では、"0:5"で、0から5までの範囲を指定しています。番号1の縦の列を返します。
Print @soccer[0:5,1] ▽Messi ▽43 ▽28 ▽46 ▽50 ▽31 ▶︎array[6]
下の表のように、増分も指定できます。増分kを指定しない時、k=1になります。
a:b | a<bの時、[a, a+1, a+2,..,b]を表します。a>b or a=bの時、空です。 |
a:k:b | [a, a+k, a+2k, a+3k, ...a+m*k], m = (b-a)/kです。 |
a,bを指定しない時は、それぞれ0と配列サイズの最大値であるとみなします。従って、行、あるいは列を簡単に指定できます。
@soccer[:, 1] | 番号1の縦の列を返します。["Messi",43,28,46,50,31] |
@soccer[2, :] | 番号2の横の行を返します。[2013,28,55] |
@soccer[:, :] | 等価な行列を返します。@soccerと同じになります。 |
@soccer[0:1, 1:2] | 矩形領域を返します。[["Messi","Ronaldo"],[43,31]]と同じになります。 |
@soccer[1:, 2] | 番号2の縦の列の一部(1から列の最後まで)を返します。[31,55,46,40,53] |
縦の列を指定した例です。前出の例と同じ結果になります。
Print @soccer[:,1] ▽Messi ▽43 ▽28 ▽46 ▽50 ▽31 ▶︎array[6]
添え字外でコロン演算子が使われる時、縦の要素数が1の、二次元の配列を作成します。この場合a, b, kに浮動小数点を指定する事も可能です。
d=1:0.5:3 Print d ▽1 ▽1.500 ▽2.000 ▽2.500 ▽3.000 ▶︎array[1][5]
一次元の配列(ベクトル)にするには、転置演算子を使ってください。転置演算子に関しては、行列演算で説明します。
Print (1:0.5:3)' ▽1 ▽1.500 ▽2.000 ▽2.500 ▽3.000 ▶︎array[5]
使用例
ここでは、コロン演算子と#sstat(), simple statistics function,を使った例をあげます。この関数は、表形式で総和、平均値、標準偏差を計算します。
@re = #sstat(@soccer[1:,1:])
このスクリプトでは、配列のデータ部分をコロン演算子を用いて取り出しています。下の図で赤枠でしめしてある領域は@soccer[1:,1:]で取り出せます。
#sstat() の返り値が下です。元データはコピーされ(下の赤枠部分)、縦横それぞれの方向の総和、平均、標準偏差を付け加えます。
下のスクリーンショットでは、返り値の一部をコピーペーストで、元の配列にもどし、ラベルを付け加えてみました。S.D. は、standard deviation (標準偏差)。
McCalは、複数の式をセミコロンで区切り、一度に実行することもできます。セミコロンは、ソフトウェアキーボードから入力できます。次の例は、前回の計算結果(ラストアンサー)を円の半径(c)として、その半径を持つ円の面積と球の体積を求めます。
複文を実行すると、最後の式の結果(上の例ではbに代入された値)のみ表示されますので、Print命令を使って、途中結果を出力しています。
Print命令は、McCalのキーパッドを左にスワイプするとあらわれる二番目のキーパッドの中にあります。Print命令の後ろに任意個の式をコンマで区切って 並べると順に表示します。
Printの最初の文字は大文字になっていることに注意してください。関数が'#'で始まり、グローバル変数が'@'で始まるのと同じように、 大文字で始まる単語は命令・宣言のためのキーワードとして認識されます。
これらの複文は、かなり複雑になってしまいました。次節で説明するマクロ機能は、これらの複文に名前をつけて保存し、リストメニューからの選択あるいはボタン一つで呼び出せる機能です。
キーストロークを記録し、簡単に呼び戻せるマクロ機能を実現しています。次の例でマクロ機能を使ってみます。
以下の図のような、抵抗とコンデンサからなる回路に正弦波電源をつないだ場合、コンデンサにかかる電圧(Vc)を、いろいろな周波数について計算したいとします。理論的には、Vcは図中の式の様にインピーダンス(Z)を複素数で表して計算できます。(導出の詳細はMcCalと関係在りませんので、省略します)
この例では、最後の電圧(v)を種々の周波数で計算をしたいわけですが、虚数と分数を含む式を何度も入力するのは面倒です。周波数には変数 (f)を用いて最初に一度だけ式を入力します。抵抗(r)やコンデンサの容量(c)も変数を用いて計算します。
まず、周波数 f = 2000Hzの時は...
(メモ)得られた答: 71269568 -4.504772i は複素数ですが、電気の分野では、この複素数の絶対値がVcの振幅、偏角が位相を表しています。
非常に長い式になりましたが、マクロとして登録し、簡単に呼び出せるようにしてみます。 いろいろな周波数(f)の値に対してVcを求めたいので、上でfに代入した2000を入力ボックスに変更します。
を何回か押し、さきほどの式を呼び出します。カーソルを移動し、2000を消去して入力ボックスに変更します。入力ボックスは、キーボードキーのShift部分にマップしてある、区切り記号( ボタン)ダイアログから入力できます。
ボタンを押すと、McCalは、入力ボックスの値を評価できないためエラーを起こしますが、履歴タブの下に式を記録します。これをマクロタブの下に登録してみましょう。
McCal Viewer を起動し、履歴(history)タブの下の該当する項目をタップすると、ダイアログが現れます。
「Macro tabに移す」ボタンを選び、式に名前をつけると、マクロ領域に保存されます。下の図では、"Capacitor voltage in RC"とタイトルを付けました。
この項目をタップし、「マクロの管理」から「式をペースト」を選んで、McCal-ViewerからMcCal calculatorに式を移します。
次回からマクロボタン( )を押すだけで最後にペーストした式を何度でも呼び出せます。
この章では、計算を自動的に繰り返したい場合を扱います。例えば前節の電気回路で、いくつもの周波数の値に対して電圧(Vc)を求める場合など。McCalは、マクロボタン以外にも手軽に繰り返し計算を行うための関数を備えています。
まずは、繰り返し関数を使ってみます。McCalのキーパッドを左へスワイプすると、比較演算子や新規の関数用のボタンが並んだ2番目のキーボードが現れます。繰り返し関数#times を選びます。
テキスト表示は #times(■, {■}), 描画表示は上の通りです。ここでtimes関数の第二引数が波括弧で括られています。McCalでは、これをコードブロックと呼び、一連の操作(複文)を関数の引数として渡すことができます。 times関数は、第二引数のコードブロックを第一引数の回数だけ実行します。また変数'k'を特別扱いし、コードブロックを実行毎に'k'の値を0から始まり1ずつ増して行きますので、何度目の実行かtimes関数内で参照できます。
前節の電子回路の計算を例に取り、1000Hzの周波数から100Hz増やしながら20回計算を繰り返してみます。また、Print命令でステップ毎の計算結果を表示させるよりも、配列に結果を格納し、McCal Viewerで結果を閲覧することにします。
配列を準備しておいてから、
fの値は1000から始まり、ステップ毎に100増えて行きます。配列aのk番目の要素, a[k][0], にfの値をセーブしておきます。振幅(複素数の絶対値)をa[k][1]に代入しています。
ボタンを押した後、 McCal Viewerを起動( )して、 変数タブ⇨配列の内容を表示を選択すると、周波数と電圧の表ができているのがわかります。
McCalは、times関数以外にも幾つかのフロー制御を実現出来る関数を備えています。
#if | 条件分岐。 #if(condition, {then_clause}, {else_clause}); McCal-only. |
#while | 与条件下での繰り返し。#while({condition}, {main_body}); McCal-only. |
#loop | 無限回数の繰り返し。#timesと異なり、一回のループ実行毎に停止します。#loop({main_body}); McCal-only. |
#times | 指定された回数の繰り返し。#loopと異なり、ループ毎に停止しません。#times(how_many, {main_body}); McCal-only. |
#sigma(Σ) | 総和関数。#sigma(start, end, {main_body}); |
#repeat | 汎用的な繰り返し。 #repeat(start, end, {initializer}, {main_body}, {finalizer}); |
上記の関数では、カウンタ変数として'k'を特別扱いします。0から始まって1ずつ増えて行きますので、実行前に持っていた'k'の元の値は失われます。
上記の関数の説明は、FunctionViewer(後述)のドキュメントを参照してください。
これらのコードブロック繰り返し関数は複文を使って 短い処理を行う事を想定して実装されています。もう少し長い、複数行にわたる関数をユーザが定義できる機能は、ユーザ定義関数を用います。ユーザ定義関数内ではBASIC言語風の制御構造が使えます。
ここでは、Function文を使った関数の宣言について説明します。エディタを用いて関数を定義する方法は第二章で説明します。関数の宣言文は:
Function #Package.function(a,r,g,s) { 本体 }
となります。パッケージ名は大文字で始まる英数字、関数名は小文字で始まる英数字の名前です。パッケージとは、関連するユーザ定義関数を集めたファイルで、関数を整理する目的で使います。パッケージ名に総て大文字の名前は使わないで下さい。たとえばSYSなど。プログラム配布用に予約してあります。
引数リストは、英小文字の一文字のローカル変数をコンマで区切ります。関数が呼び出される時、関数に引き渡した式の値を評価し、ローカル変数に順番にコピーされます。
それでは、やってみましょう。キーパッドを左へスワイプすると第二のキーパッドが現れます。ここから
ボタンを選択します。入力が必要な部分は、入力ボックスに置き換えられています。Function #■.■(■) { ■ }
前節の例をとると、
Function #elc.volRC(f) {■}
パッケージ名:Elc, 関数名:volRC, 引数: f
の関数を定義します。コードブロックの中が関数の本体です。パッケージ名は自動的に頭文字が大文字に変更されます。
ここでMcCal Viewer を起動して(
)、前節のインピーダンスの式をコードブロック内にペーストして下さい。fの値を設定する部分を削除し、関数の引数として値を渡すことにします。Function #elc.volRC(f) {c=1E-8; r=5E3; v=#frac(10,1-2i#pi()fcr) }
返り値は、Return文がない場合、最後の実行文になります。また、Function文は一行です。
ボタンを押すと、関数登録に成功すれば、1が返ります。McCalに関数が登録されているか確認してみます。Function Viewer (
)から、Elcパッケージを選択すると、McCal Viewerに登録されていることがわかります。項目#Elc.volRC(f)をタップし、"Run"ボタンを選択すると、電卓画面に戻り、
#Elc.volRC(■)
となりますので、引数を入力ボックスを使って入力していきます。入力ボックスの数は、Function文で宣言した引数の数と同じになります。
次回からマクロボタン(
)を押すだけで最後にペーストした式を何度でも呼び出せます。この例では、プログラム本体は一行の複文を使っています。McCal Viewer からエディタを使うと、複数行に分けられる上に、BASIC言語風の制御文が使えます。次の章では、エディタを使ってみます。
前節の関数宣言で関数が登録されているか、Function Viewerで見てみましょう。 アイコン、あるいは
ボタンを押し、Function Viewer を起動します。まず、パッケージ名のリストが現れます。先ほどの"Elc"パッケージが作られています。"Elc"項目をタップすると、"Elc"パッケージに入っている関数のリストに切り替わります。さらに#Elc.volRC(f)を選択すると先ほど定義したソースコードを見ることができます。
ここでは、#Elc.volRC(f)関数を、f=1000Hzから3000Hzまで、200刻みで呼び出す関数を作ってみます。画面右上のアクションバー・オプションアイコンを押して「新規関数」を選んで現れるダイアログから、
test()を入力し、"OK"ボタンを押すと、新しい関数が追加されます。エディタを起動し、プログラムを入力します。
画面上部に関数名と説明(省略可)、アクションバー、その下にエディタウィンドウがあり、プログラム本体が表示されます。
右上のオプションメニューボタンを押し、「Run」を選べば、関数名がメインウィンドウにペーストされますので、
ボタンで実行できます。McCal Editor には、ヘルプドキュメントが用意されています。
別のサンプルプログラムです。関数 #unit(n)はループを使って、n×nの正方単位行列を返します。行列サイズは20X20以内に制限しています。
// サイズのチェック If n > 20 Then Println "Too Large" Return 0 End If // 配列の宣言 Dim a[n][n] // 正方単位行列の各要素をうめる For j=1 To n Step 1 For k=1 To n Step 1 If j==k Then a[j-1][k-1] = 1 Else a[j-1][k-1] = 0 End If Next Next // 配列を戻す Return a
複数の返り値:ユーザー関数が、複数の値を戻すことが可能になりました。"Return"文の後に、返り値をリストします。
Function #Test.test(a) { ...; Return x, y, #sin(a)}
複数の返り値を捉えるには、角括弧でくくられた変数リストに代入します。
[x,m,s] = #Test.test(a) x = #Test.test(a)
上の一番目の例では、変数x,m,sに、それぞれ代入しています。 二番目の例では、最初の返り値のみが変数xに保存されます。返される値の数よりも、変数の数が少ないか同じである必要があります。詳しくはMcCal Editorのヘルプを参照してください。
二次元の配列は、数学の行列として、和差積演算のサポートや、各種演算子が利用できます。また逆行列や固有値などを計算するための関数を用意してあります。
Version 4.3より、行列演算の機能は大幅に改良されました。行列計算に関するドキュメントを参照してください。
McCalは、数式をできるだけ自然な順に入力し、直感的に理解できるように数学的に自然な形で表示することを主眼に開発されました。 いままでの関数電卓ユーザにも、違和感なく使っていただけると考えています。
McCalはユーザーの入力をプログラムコードとして記憶し、後で呼び出して変更したり、再計算できます。実際の計算評価は、この文字列に対して行っており、 McCalはスクリプト言語のインタープリタを搭載しています。
McCal Calculatorから呼び出すサブプログラムの遷移図を下に示します。
McCalでは特に、繰り返し計算を手軽に行えるように配慮されています。パソコンが普及した現代では、少し複雑なプログラムはパソコンで実行するのが当たり前になりました。Androidの電卓としてのMcCalは、数十行程度までのプログラムの実行を手軽に行うことをデザインゴールにしました。また、スプレッドシートファイルの間で、データをやりとりする機能も持っています。
バグなどのソフトウェアの瑕疵については全力で除去しておりますが、もし発見された場合、ご一報いただければ幸いです。本ソフトウェアの使用により生じた損害、または第三者からのいかなる請求について、作者はその責任を負えませんので、あらかじめご了承ください。