Casio Basic

**Casio Basic**（カシオ・ベーシック）とは、カシオが販売するプログラミング関数電卓に搭載される独自規格のプログラミング言語の通称である。

## 歴史
最初にCasio Basic(以下CB)が搭載された電卓は、である。この頃のCBの命令はわかりにくく、命令の数が少なく、制約が多い言語であった。その後、fx-5800Pなどの機種が発売され、これらに搭載されたCBにはキーコードを取得したり任意の場所に文字を表示したりすることができるようになった。グラフ電卓(fx-CG50等)が登場するとCBにもグラフを描画する機能が搭載された。このようにCBは電卓の進歩に合わせて進歩してきた。しかしそれに伴う課題も多く見られる。

## 仕様
ここではfx-5800Pなどに搭載されている比較的新しいCBについて説明する。計算は電卓に入力するように計算式を入力し、その他はBASICのように必要に応じて入力コマンドやループ、条件分岐コマンドなどを入力していく。

例としてオームの法則を利用し電圧、電流、抵抗のうち不明なもの１つを残りの２つから計算するプログラムを挙げる。
```
"V=1,I=2,R=3"?→S
If S=1
Then 
"I"?→I
"R"?→R
I*R
IfEnd
If S=2
Then 
"V"→V
"R"?→R
V/R
IfEnd
If S=3
Then
"I"?→I
"V"?→V
V/I
IfEnd
```
まず、最初の行で電圧、電流、抵抗のうちどれを求めるかユーザーに尋ねる文章を表示している。電圧(V)は1,電流(I)は2,抵抗は3を入力する。

（それ以外を入力するとそのまま表示される。そのためこのプログラムのように想定しない値が入力されたときにエラーになるような構文は避けるべきである。）

CBでは「”」で囲んだものは問答無用で表示される。次の？は入力を求めるコマンドであり、ユーザーが数値を入力してEXEキーを押すまで待機する。その値はSという変数に代入される。

Casio Basicでは基本的に変数名は１文字で、A-Z,θ,rが使用可能。すなわち変数の数は29個までとなる。グローバル関数、ローカル関数の概念は存在しない。

（そのため例えば画面に点を表示する関数、PxlOnではX,Yが処理用の変数として予約、使用されるため、誤ってその変数に書き込みを行うとプログラム全体がエラーで停止する。）

次のIf~IfEndでは、先程キー入力を求めSに代入された値がもし1なら、電圧を計算するため電流と抵抗を入力するよう求めている。入力された数はI,Rの変数に代入される。CBではIfを使う場合必ずThenが必要である。ThenとIfEndの間に書いた処理が、Ifで判定した条件が真である場合に実行される。

(もしここで例えば20+30と入力するとその場で計算が行われ、50が変数に代入される。)

次の行では、入力された値が代入された変数同士で計算を行っている。計算する場合は電卓のように計算式を入力するだけである。その結果は変数でもない、最後に実行した結果を保存するメモリに記録される。計算結果をすぐに表示したい場合は、▲のような形の出力コマンドを計算式のあとに入力する。すると計算結果が表示され、ユーザーが何らかのキーを押すまで待機する。

次の行にはまたIfがあるが、これは最初の入力で2を選んだときの処理である。そのため次のIfEndまでは読み飛ばされる。

その次もIf~IfEndがあるが、これは最初に3を選んだときの処理であるため、このあとの処理も飛ばされ、プログラムが終了する。CBの仕様として、先程の最後に実行した計算が保存されるメモリに入っている内容が表示される。
## 問題点

### 動作の重さ
多彩な機能を持つCasio Basicであるが、その反面主に動作が重いことが課題である。特にグラフィック関連の処理が非常に動作が遅い。カシオのグラフ関数電卓で最速であるfx-CG50でさえ、画面全体を塗りつぶすプログラムには2時間以上かかる。とはいえ、公式を記録しておいて値を入力し計算する、数十回繰り返し計算をする程度では重いことを感じないため、むしろ使用したほうが良いのは当然である。

#### 動作が重いコマンド
* 三角関数等
** 単体で使用するときはほとんど問題になることはないが、Σ、積分、ループなどで使用すると通常の計算の数倍計算速度が落ちる。

* :　(区切り文字）
** コマンドを1行に2つ以上書くときに使用するが、これは1つの命令として処理されるため、多用すると動作が重くなる。

* PxlOn , PlotOn
** これらのグラフィック関連のコマンドは動作が重く、1命令に数十～数百ミリ秒かかる。

* Locate
** Locateは指定された場所に文字列や数値を表示するが、これの処理には数十ミリ秒かかる。

* 行列、リストの読み書き
** 大量のデータを処理するため必然的に遅くなる。

* If文
** 1回の処理に100ms程度かかる。

* Disp(⊿)コマンド
** 画面に値を表示するものであるが、これは値を表示後ユーザーが[EXE]キーを押すまで待機する。待機させない場合は指定した場所に値を表示するLocateを使用する。

### メモリ、変数の少なさ
Casio Basicは、変数名を大文字のA-Z,θ,小文字のrのいずれか1文字にしなくてはならない。しかもグローバル変数、ローカル変数の概念がまったくない。そのためCasio Basicでプログラミングを行う場合は変数の数をいかに少なくできるかが重要である。変数を減らす手段として、行列やリストを使う方法がある。リストは他の言語における1次元配列のようなもので、名前は数字で1~27まで使用できる。データの上限は1つのリストあたり999個である。しかし実際はメインメモリの容量による制限で、最もメモリの多いfx-CG50ではほとんどすべてのメモリのデータを消しても2400個が限界である。実際は他のプログラムやデータなどでメモリが使用されるため、1000個程度が限度である。しかしリストを使用するとどこになんのデータが有るかわかりづらくなり、すぐにスパゲティプログラムになってしまう。しかもこのリストは通常計算で使用するリストと共用であるため、誤って大切なリストに書き込みをしてしまうと取り返しのつかないことになってしまう。プログラム開始時にリストはクリアされない。そのため事前にユーザーにリストモードでデータを入力させ、そのデータを用いて大量の複雑な計算をプログラムで行うことも可能である。

Casio Basicでは一応擬似的に2次元配列が使用可能である。それは計算用の行列を2次元配列のように使用することである。Casio Basicには行列を読み書きするコマンドが用意されているが、先述のリストよりもメモリの消費が激しく、他にほとんどデータがないとしても60*60の行列を一個使用する程度で限界である。また、こちらも同様に上書きには注意が必要である。誤って上書きしないようプログラムを開始する前には確認メッセージを表示させたりすると言った工夫が必要である。

しかし、これらの方法は動作が非常に重く、一回の読み書きで数百ミリ秒の時間を要し、何個も値を書き換えたりすると数秒に渡りプログラムが一時停止する。そのため動きがあるアクションゲームなどを制作する際は使用を控えるのが賢明である。また、行列を作成する時、メモリが足りなくなると容赦なくプログラムが停止するため、行列の作成は途中でプログラムが停止しないようプログラムの最初に行うようにし、プログラムの途中で行列を作成、拡張することは避ける。

### 対処法
これらの問題を解消する方法としては、規模の大きなプログラムやグラフィック描画の多いプログラムを作成する場合はそもそもCasio Basicを使わないことである。極端すぎるかもしれないが、よほどのこだわりがなければ後述のC.Basicなどを使うか、大きなプログラムはアドインアプリケーションとしてC言語で作成することが好ましい。Casio Basicが重い原因は、そもそも大きなプログラムを作成することを前提に設計されていないからである。Casio Basicは電卓の入力作業や公式の暗記などの手間を削減することが目的であり、その仕様をどう見てもゲームなどを作成するための言語ではないと言える。Casio Basicはあくまで電卓の延長であることを意識して使用するべきである。

## C.Basic
C.Basicとは有志が開発したCasio Basicを高速化し、少し機能の拡張を行ったものである。

Casio Basicで作成したプログラムはすべて動作し、Casio Basicの数倍~数万倍の速度で動作する。グラフィック関連の処理は非常に高速で、画面全体を塗りつぶすプログラムが純正Casio Basicで2時間程度かかるのに対し、Casio Basicでは１秒間に2回程度画面を塗りつぶすことができるほどである。通常の演算も高速で、加算では十倍程度早い。さらに、変数名に小文字を使用することが可能になり、変数の数がおよそ倍増した。しかしこれをするとそのプログラムはC.Basicでしか動作しなくなってしまう。

導入は通常のアドイン・アプリケーションと同じようにでき、fx-9860Gシリーズや、fx-CG20/50など殆どのプログラム電卓で使用できる。

ただし使用すると、カシオの想定していないアプリケーションであるため保証の対象外となる可能性がある。

## コマンド一覧

操作やコマンドは基本的にfx-CG20,50のものを記載する。したがってそれ以外の機種では使用できない場合がある。

また、先述のアドイン、C.Basicの独自コマンドは除く。

また、ここに示したものは代表的なもののみである。

### 基本的なコマンド

#### ⊿（実際は黒色）
計算式やメモリの値を表示し、プログラムを一時停止する。EXEキーで再開される。

#### 
複数のコマンドを1行にまとめる。ただし動作が遅くなる。

#### If~Then~(Else~)IfEnd

```text
If <分岐条件>
Then<処理>
(Else<処理>)
IfEnd
```
の書式。必ずThenとIfEndが必要。Ifを２つ以上使う場合はIf1つあたり、ThenとIfEndが1つずつ必要。Elseは必須ではない。

例えば
```text
If A=1
Then "TRUE"
If A=0
Then "FALSE"
IfEnd
```
というようなことはできない。

#### For
For→ To  (Step ) Next

の書式にする。Stepは特に指定がない場合は1になる。まず初期値は最初の実行時に制御関数に代入される。Nextに到達するとStepで指定した数だけ制御変数の値が増加する。制御変数の値が終了値以上になるとループが終了し、Nextの次の行が実行される。ループの中にループを入れることもできる。

#### Do

#### While

### 論理演算(AND,OR,NOT,XOR)
[OPTN]-[LOGIC]

計算式の中に論理演算子を入力できる。論理演算は常に1または0を出力する。

#### 例
A≠1 Or B≠2のとき、Dsz Cを実行する例。
```text
A≠1 Or B≠2⇒Dsz C
```


### Angle()
2つのベクトルのなす角を求める。

Vct A=[1 2] Vct B=[3 4]

#### 操作
[OPTN][F2][F6][F6][F4][F1][ALPHA][X,θ,T][,][F1][ALPHA][log][)][EXE]

### Ans
Casio Basicにはアンサーメモリがあり、最後に実行した計算の答えが自動的に格納される。すでに値が入っている場合は当然ながら上書きされるため注意が必要。

[SHIFT][(-)]で入力できる。

### Abs
絶対値を求める。

### Arg/Abs
a+bi の形で表される複素数をガウス平面上の座標とみなし絶対値|Z|と偏角argを求める。

#### 例
|3+4i| =5

### Augment(
2つのリストを1つに統合する。

List1{1,2,3}とList2{6,7,8}を統合するには、
```text
Augment(List 1,List 2)
```
のようにする。統合されたリストは{1,2,3,6,7,8}となる。

### グラフコマンド

#### AxesON/OFF
グラフ画面での座標軸の表示/非表示の切り替え。

#### BG-None/BG-Pict
グラフ画面の背景を指定する。

画像を表示する場合は次のように入力する。
```text
BG-Pict <ピクチャーメモリの番号>(,a)
```
,a　をつけると画像が保持しているビューウインドウ値がロードされる。

画像を表示しない場合は BG-None だけを入力する。

#### Color
グラフィックの色を指定する。fx-CG10/20/50のみ。

Black , Blue , Red , Magenta , Green , Cyan , Yellow が使用可能。

例えば、赤で画面を塗りつぶす場合はこのようなプログラムになる。
```text
GridOff:AxesOff:LabelOff:ClrGraph
For 1→A To 180:For 1→B To 379
Red PxlOn A,B:Next:Next
```
最初の行では、グラフ画面のグリッド、軸、ラベルを非表示にしたあと、グラフ画面をクリアしている。

2行目はループであり、Y軸のループの中にX軸のループが入っている。

3行目でループの実行回数を座標にして赤で点を表示している。PxlOnの前のRedで色を指定している。その後ループをすすめるNextコマンドがある。

#### PxlOn/PlotOn/PxlOff/PlotOff

##### 書式
{PxlOn Y座標,X座標}

指定した座標に点を描画する。非常に動作が重い。

多くのプログラミング言語とは異なりX座標とY座標の引数の順番が逆である。

PlotOn/Offは、古い機種と互換性を保つためにある。これを使用するとfx-cg10/20/30では1ドットが3x3になる。

PxlOff/PlotOffは点を削除する。

### Ref
ガウスの消去法アルゴリズムで、指定した行列の階段状の行列を求める。

### ReP/Imp
複素数a+biの実部aをRePで,虚部bをImPで抽出する。

### Resid-List
プログラム内で残差計算の設定をし、指定したリストに残差を保存する。

Resid-Noneで残差計算を実行しない。

### Return
サブルーチンから復帰する。

### Rmdr
整数を整数で割ったときの余りを求める。

例:107 Rmdr 7 =2

### Σ(
Σ計算を行う。

### sin/cos/tan/sinh/cosh/tanh
三角関数、双曲線関数の計算を行う。

sin X でXのサインの値を求める。sin-1やcos-1で逆三角関数の値を求める。

### Solve()
方程式の解の近似値を求める。未知数はxのみで、それ以外は変数とみなされる。また、２次方程式など解が2つ以上あるものはどれか１つしか求めることができない。さらには、この関数の各引数の中にsolve、積分、微分、Σなどを入れることはできないなど制約が多く、さらに解が収束しないとエラーとなりプログラム全体が停止するなどするため、よほどの理由がない限り使用しない方が望ましい。

### Square
グラフ画面に四角形を描画する。情報が少なく、詳細不明。

### プログラム制御コマンド

#### Break
ループの中で使用するとそのループから無条件で脱出する。

#### Prog
他のプログラムをサブルーチンとして呼び出す。呼び出されたプログラムは先頭から順番に実行される。ファイルが見つからない場合はエラーとなりプログラム全体が停止する。

#### Stop
プログラムを終了する。ループの中で使用するとエラーを出さずに終了する。

### Str
文字列メモリを操作する。Casio Basicには文字列メモリがあり、1~20まで20個のメモリが使用できる。文字列は表示や関数の引数などに使用可能。

代入する場合は数値メモリと同様→を使用する。

### 文字列操作コマンド

#### Exp
文字列を式に変換して計算する。

#### Exp▶Str（
グラフ式を文字列に変換し、指定された文字列メモリに格納する。

#### StrCmp(
入力した文字列を文字コード表で大小を比較する。

#### StrInv(
文字列を逆にして返す。

#### StrJoin（
２つの文字列を結合する。

#### StrLeft
入力した文字列の左から指定した文字数目からの文字列をコピーする。

#### StrLen
文字列の長さを返す。

#### StrLwr
文字列をすべて小文字に変換する。

#### StrMid
文字列を指定した文字数目から別に指定した文字数分を取り出す。

#### StrRight
StrLeft関数を右からコピーするようにしたもの。

#### StrRotate
文字列を指定した文字数分ローテーションする。

#### StrShift
文字列を指定した文字数分シフトした文字列を返す。

#### StrSrc
文字列を2つ指定する。1つ目の文字列の中の指定した文字数目から検索し、2つ目の文字列が含まれるかどうかを返す。

#### StrUpr
文字列をすべて大文字に変換する。

#### <文字列1>+<文字列2>
2つの文字列を結合する。

### Swap
行列の行を入れ替える。

例えば、

\begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6\end{bmatrix}

の行を入れ替えて、

\begin{bmatrix} 1 & 4 \\ 3 & 6\\ 2 & 5 \end{bmatrix}

にすることができる。

## 出典、参考文献

一部のURLは、Wikipediaのサーバーでスパム判定されるため、最初のhは抜かれています。閲覧の際はURLの先頭にhをつけてください。