Fomcal 公式の文法


第4版
2016/12/23

変数

命名則

変数名で使用できる文字は英字とアンダースコアー '_' および数字です. 英字またはアンダースコアーから始まる必要があります. 大文字と小文字は区別されます. 関数と同名の変数も使用可能です.

定数

定義ずみの定数は以下のとおり.

ユーザ定義の定数も使用できます. ただし,today,now,が将来の機能のために予約されています. これらは現バージョンでは使用しないで下さい.

配列の定数も定義できます.

定数と同名の変数は定義できません.

配列変数

変数と同じ命名規則で配列変数が定義・使用が可能です. 配列の添字は 0 以上の整数で括弧 '[', ']' で括って指定します. 多次元配列は添字をコンマ ',' で区切って指定します. 添字の数値が実数の場合,小数点は四捨五入されます.

次元数の上限は3です.

配列の要素数の上限は 100,000 です.

例)
  A[5]
  A[1,2,3]
  A[1+2,1.2]

定義方法

変数欄による定義

「定義」ページの「変数」欄で公式の入力値となる変数を定義します. その際,変数の説明は省略できますが,変数名は省略できません.

配列変数については変数名の冒頭に @ 記号を付してください. 「変数」欄での配列変数は1次元配列のみ行え,かつサイズは指定できません. 公式の使用時には,カンマ , で区切って値を指定します.

公式中での定義

一時的に使用する変数が公式中で定義できます. 詳細は次章の代入式配列の定義を参照してください.

定数と変数ページ

「定数と変数」ページでは公式や電卓で共通して使用できる定数や, 電卓の変数が定義できます. 使用法についてはこのページより閲覧できるマニュアルを参照して下さい.

公式

公式は変数と定数,実数,コンマ ',' と括弧 '(', ')',および以下の演算子と関数から構成されます.

演算子

以下の演算子が使用できます.

ただし,* は省略できません.

複数の式

複数の公式をセミコロン ';' で区切って記述することで,これらを同時に計算することもできます. 結果欄では ';' の位置で改行されます.

例)
  1+2; 3*4

結果)
  3
  12

代入式

公式中に,代入式 [変数]=[式] が記述できます. [式]の計算結果が[変数]に代入されます. 計算結果は表示されません. もし,配列変数でない[変数]が公式の入力として定義されていなければ, 一時的な変数がその場で定義されます. 配列変数は予め定義されている必要があります(次項参照).

セミコロン ';' で区切ってこれ以降の式中でこの変数が使用できます.

例)
  x=3; x*4

結果)
  12
例)
  A[4]=5;
  A[1+2]=6;
例)2次方程式 ax2+bx+c=0 の解法
  det=b*b-4*a*c;
  fg=GE(det,0)*NOT(EQ(a,0));
  fg;
  IF(fg,(-b+sqrt(det))/(2*a),0);
  IF(fg,(-b-sqrt(det))/(2*a),0);

なお,変数定義欄で定義された変数への代入により,ユーザが入力した値は上書きされます.

例)変数 x が定義されているものとする.
  x=x+1;x

結果)ユーザが x=1 を入力している場合.
  2

配列の定義

配列の定義は @ から ; までの間で行います. @ の後に配列名と [, ] で括って各次数のサイズを指定します. サイズは数式を記述することもできます. 全ての要素には 0 がセットされます.

例)
  @A[5];
  @x[5,4];
  n=10;
  @y[n,n*2];

配列の値を { } 内に羅列して1次元配列が定義できます. その際,配列のサイズは指定しないでください.

例)
  @A={0,1,2};
  A[1]

結果)
  1

配列のサイズは ASize 関数で取得できます.

コメント

" 以降 " または ; までのコメント文字列は結果欄にそのまま出力されます. # 以降 # または ; までのコメント文字列は無視されます. コメント文字列は ; で区切られた1行の中で,式を挟んで行頭と行末の2箇所に記述できます.

例)
  #コメント(無視される);
  "代入の例;
  x=1#代入式;
  "x="x

結果)
  代入の例
  x=1

例)
  "合計金額"100+200"円

結果)
  合計金額300円

関数

算術関数

算術関数は同名のC言語の関数を呼んでいます.

三角関数
( θ-角度[rad], a-底辺, b-高さ )
cos(θ)cos関数
sin(θ)sin関数
tan(θ)tan関数

三角関数の逆関数
( a-底辺, b-高さ, r-斜辺, 返値-角度[rad] )
acos(t)cosの逆関数, t=a/r
asin(t)sinの逆関数, t=b/r
atan(t)tanの逆関数, t=b/a, 出力範囲[-π/2,π/2]
atan2(b,a)tanの逆関数, 出力範囲[-π,π]

対数
ln(x)自然対数: ln x
log(a,b)対数: logab (=ln(b)/ln(a))
log10(x)常用対数: log10 x

その他
exp(x)指数関数: ex
pow(x,a)ベキ乗: xa
abs(x)絶対値: |x|
sqrt(x)平方根
√(x)平方根
round(x)四捨五入
floor(x)小数点の切り捨て
fmod(x,y)x÷y の余り

論理関数

ゼロを偽,ゼロでない数値を真とする論理関数が備わっています.

論理関数
NOT(fg)否定: fgが真の場合 0 を返し,偽の場合 1 を返す.
EQ(a,b)比較: a==b
LT(a,b)比較: a<b
LE(a,b)比較: a≤b
GT(a,b)比較: a>b
GE(a,b)比較: a≥b

分岐関数

処理の分岐を行います.

分岐関数
IF( fg, x, y )
判定関数
fgが真(fg≠0)の場合 x を評価(計算実行)し,偽(fg=0)の場合 y を評価してその値を返す.
SWITCH( i, eq0, eq1, ...)
i=0 の場合 eq0 を, i=1 の場合 eq1 を, ... 評価してその値を返す.

Σ, Π 演算関数

総和演算 Σ を関数表現にした SIGMA と 総乗演算の Π を関数表現にした PI があります.

関数の第一引数では繰り返しに用いるパラータを定義します. パラメータ名はユーザ定義の変数とは異なる名称にして下さい. 第二引数はパラメータの初期値,第三パラメータは終了値を指定します. 第四引数は繰り返し適用される数式を指定します.

Σ, Π 演算関数
( i-パラメータ, i0-iの初期値, i1-終了値 )
SIGMA(i,i0,i1,eq)
PI(i,i0,i1,eq)

配列サポート関数

配列のサイズを取得する関数 ASize および, 値が1次元配列のどの位置に当てはまるか調べる関数 ALevel があります.

配列サポート関数
ASize(A,d)
配列サイズの取得
A: 配列名
d=0: 全要素数の取得
d>0: d 個目の添字のサイズ取得
ALevel(A,fg,v)
1次元配列中の値の位置取得
A: 1次元配列名.昇順に値がセットされている必要がある.
(以下の説明で A のサイズは n とする.)
fg: 範囲の判定方法.
 fg=0 or 2: A[i]≤v<A[i+1]
 fg=1 or 3: A[i]<v≤A[i+1]
ただし,A[-1]= -∞,A[n]= ∞ とみなす.
v: 判定する値
返り値:
上記の判定式を満たす i が返る.
ただし,fg=2 または 3 の場合で i=-1 のとき 0 が返る.
備考) fg=2 または 3 を指定すれば,戻り値をAのインデックス値として使用した場合にレンジエラーを回避できる.

例)ASize
  @A[2,3];
  ASize(A,0);
  ASize(A,1);
  ASize(A,2)

結果)
  6
  2
  3

例)ALevel
  BMI=27;
  @A={0,25,30,35,40};
  "肥満度="ALevel(A,0,BMI)

結果)
  肥満度=1

拡張構文

公式を繰り返し実行したり,条件によって実行する公式を切り替えることなど, より複雑な処理が可能な簡易プログラミング機能が備わっています.

$ ヘッダ/ブロック

Fomcal の構文解析器は,式文字列をまず行ごとに分解し, 空白を除いた行頭の $ 記号の有無によって拡張構文の行であるか判別します. $ が先頭の行は $ ヘッダと呼びます. $ ヘッダは $ の直後に IF,FOR などのコマンドが記述されます. $ が無い行は,次の $ ヘッダが現れるまで再び連結され,一組の公式(式ブロック)として扱われます. $END ヘッダは他の $ ヘッダと組みで使用されます. この $ ヘッダから $END までを $ ブロックと呼びます. $ ブロックには他の $ ブロックや式ブロックを入れ子状に格納できます. $OUT など $ ヘッダのみの $ ブロックもあります.

例)IFブロックの例
  $IF EQ(x,1)
     y=1
  $ELSE
     y=2
  $END

$ ヘッダ内の引数の区切り

$ ヘッダに複数の引数がある場合にはコロン : で区切ります.

例)
  $FOR i:1:5
    i # i の値表示
  $END

文字列

$ ヘッダ中で," または ' で囲まれた部分は,文字列として扱われます. 文字列でない部分は式として評価されます. なお,$ ヘッダ中では ; で区切って複数の式を記述することはできません.

\ を用いて以下の特殊文字を出力できます.

$ ブロック内での変数定義

$ ブロック内で定義された変数はこれ以降,ブロック外部でも使用可能です.

$ ブロック詳細


$ ヘッダ一覧
$ ヘッダ機能
$$コメント
$OUT文字列出力
$PRINT書式つき文字列出力
$IF条件分岐
$ELSEIF条件分岐($IFと共に使用)
$ELSE条件分岐($IFと共に使用)
$FOR繰り返し処理
$WHILE繰り返し処理
$BREAK繰り返し処理の中断
$CONTINUE繰り返し処理を中断し繰り返しの冒頭に戻る
$STOP処理終了
$END $ ブロックの終末

$$ コメント

書式

$$[コメント文]

処理

$$以降行末までの記述はコメント文として無視されます.

$OUT

書式

$OUT [文字列/式]:[文字列/式]: ...

処理

文字列や式の値を出力します. コロン : で区切り,複数の文字列や値を出力できます. 出力後,改行する場合には,最後尾に "\n" を記述してください.

例)
  x=1
  $OUT "答えは,"
  $OUT "X=":x
  $OUT " です.\n"

結果)
  答えは,X=1 です.

$PRINT

書式

$PRINT [フォーマット]:[文/式]:[文/式]: ...

処理

C 言語の printf 関数と同じ形式のフォーマットを文字列で指定して,文字列や値を出力します. ただし,型指定子としては,c(文字)および p(ポインタ)は使用できません.

例)
  x=1.23
  $PRINT "答えは X=%f です.\n":x

結果)
  答えは X=1.23 です.

$IF

書式

$IF [式]
  [式ブロックまたは $ ブロック] 
$ELSEIF [式]
  [式ブロックまたは $ ブロック] 
$ELSEIF [式]
  [式ブロックまたは $ ブロック] 
...
$ELSE
  [式ブロックまたは $ ブロック] 
$END

処理

条件分岐を実行します.$IF および $ELSEIF は条件判定する式を記述します. 式の値が 0 の場合は偽,0でない場合を真と判定します. $ELSEIF,$ELSE は省略可能です. $ELSEIF は複数配置が可能です.

例)2次方程式 ax^2+bx+c=0 の解
  det=b*b-4*a*c;
  $IF EQ(det,0)
    -b/(2*a)
  $ELSEIF GT(det,0)
    (-b-sqrt(det))/(2*a);
    (-b+sqrt(det))/(2*a)
  $ELSE
    $OUT "No solution"
  $END

$FOR

書式

$FOR [カウンター変数]:[初期値]:[終了値]
  [式ブロックまたは $ ブロック]
$END

処理

$END までの式ブロックまたは $ ブロックを繰り返し実行します. その際,カウンター変数には初期値から終了値までの整数列の値が順次代入されます. もし,[初期値]>[終了値]であればカウンターの値は1づつ減少します. カウンター変数は $FOR 以前に定義されているものであれば,上書きされます. 定義されていなければ,新たに定義され,$FOR ブロック以降も使用できます. なお,$FOR ブロック内でカウンター変数を上書きしても,次のループの先頭ではカウンター値が代入されます. したがって,カウンター変数に終了値を超える値を代入してもループは続行されます. ループの途中で終了するには $BREAK ブロックを使用してください.

暴走を防止するために, ループ回数の上限は 1,000,000 に設定されていて,これを超える場合強制的に終了します.

$BREAK でループは強制終了します. $CONTINUE でこれ以降 $END までを無視して次のループを実行します.

例)
  x=0
  $FOR i:1:10
     x=x+i
     $OUT x:"\n"
  $END

$WHILE

書式

$WHILE [判定式]
  [式ブロックまたは $ ブロック]
$END

処理

[判定式] の値が 0 になるまで [式ブロックまたは $ ブロック] を繰り返し実行します. [判定式] はループの先頭で評価されます.

暴走を防止するために, ループ回数の上限は 1,000,000 に設定されていて,これを超える場合強制的に終了します.

$BREAK でループは強制終了します. $CONTINUE でこれ以降 $END までを無視して次のループを実行します.

例)
  x=1
  i=1
  $WHILE LE(i,10) 
     $OUT x:"\n"
     x=x+i;i=i+1
  $END

$BREAK

書式

$BREAK

処理

$FOR,$WHILE のループの中断に使用されます. $BREAK が実行されるとループを中断し,$FOR または $WHILE ブロックから抜け出します. $FOR または $WHILE ブロック内でない場所で実行されると,$STOP と同様に処理を終了します.

例)
  $FOR i:0:10
    $OUT i:"\n"
    $IF EQ(i,2)
      $BREAK
    $END
  $END

結果)
  0
  1
  2

$CONTINUE

書式

$CONTINUE

処理

$FOR,$WHILE のループ内で使用します. $CONTINUE が実行されると,ループの先頭に戻ります. $FOR の場合,カウンターには次の値がセットされます.

例)
  $FOR i:0:4
    $OUT i:"\n"
    $IF EQ(i,2)
      $CONTINUE
    $END
  $END

結果)
  0
  1
  3
  4

$STOP

書式

$STOP

処理

処理を終了します.

公式を関数として用いる場合,関数の処理は終了しますが,呼び出し側の処理は続行されます.


⬆︎
Ⓒ2016, Noboru Imai.