08 演算と文字列処理
プログラミングでの「演算」にはいろいろなタイプがあります。数値の四則演算,ベクトルや行列の計算に加え,文字列の処理も一種の演算です。ここではあまり詳細には立ち入らず,よく使うものだけを説明しておきます。
四則演算
数(実数・複素数)の和・差・積・商は,他のプログラミング言語同様,+,-,*,/ で計算します。特に,かけ算の * は,Cindyscriptでも省略はできません。(Mathematica や GeoGebraでは 省略できたり,スペースで代用できたりします)
たとえば,1次関数 f(x) を定義するとき,f(x)=2x+1 とはできません。f(x)=2*x+1 とします。かけ算の * は結構書き忘れるので注意が必要でしょう。
累乗・累乗根
累乗は ^ です。累乗根は,平方根だけ,関数 sqrt() が用意されています。それ以外は分数乗の累乗で表します。たとえば,2の正の平方根は sqrt(2) ,2の3乗根は 2^(1/3) です。ただし,3乗根は3つのうち1つしか得られません。たとえば,8^(1/3) は2になりますが,(-8)^(1/3) は,-2 ではなく 1 + i*1.7321 になります。3乗根をすべて得るには,roots() 関数を用います。roots()関数は1変数の多項式からなる方程式の解を求める関数で,低次の項から係数をリストにして渡します。x^3+8=0 の解は roots([8,0,0,1]) で得られます。
ベクトルの演算
ベクトルはリストで表します。
和・差:a,b がベクトルのとき,a+b,a-b で和・差が求められます。
実数倍:aが実数,bがベクトルのとき,ベクトルの実数倍は a*b で得られます。
内積 :a,b がベクトルのとき,a*b は内積です。たとえば,a=[2,3]; b=[3,-1] のとき,a*bは 3 となります。
外積 :外積は関数 cross() を用います。たとえば,a=[2,1,2];b=[3,-1,2]; のとき,cross(a,b) は [4,2,-5] となります。
行列の演算
和・差・実数倍
MA,MBが行列,m,nが実数のとき,mMA+nMBは m*MA+n*MB で計算できます。*が必要です.
積
MA,MBが行列のとき,MA*MBは積が定義できるのであれば積を返します。定義できない(行数、列数が合わない)場合は未定義値になります。
例:MA=[[1,2],[2,3]];MB=[[3,-1],[2,1]]; のとき,MA*MB は [[7,1],[12,1]] になります。
逆行列 :関数 inverse(M)を用います。Mが行列です。
行列式 :関数 det(M)を用います。
転置行列 :関数 transpose(M)を用います。
小行列 :関数 submatrix(M,m,n)を用います。
余因子行列:関数 adj(M)を用います。
固有値 :関数 eigenvalues(M)を用います。
固有ベクトル:関数 eigenvectors(M)を用います。
文字列処理
文字列の結合
+ 演算子は文字列を結合します。Cindyscriptで特徴的なのは,一つでも文字列があれば,文字列以外のものが含まれていても文字列になるということです。
例: "きょうは"+"いい天気" は "今日はいい天気"
a=2;b=3; のとき,a+"たす"+b+"は"+(a+b) は,"2たす3は5" になります。
例: a=[2,3] のとき,a+"はリスト" は "[2,3]はリスト" になります。
文字列への変換
text(<expr>) は <expr> を評価して文字列にします。
例:text(3*2) は 3*2 の結果が6なので "6" になります。
文字列の抜きだし
substring(文字列,a,b) は文字列の a 文字目の次からb文字目までを抜き出します。「a文字目の次」に注意してください。
例:str="Hello World" の始めの5文字は substring(str,0,5) でとり出します。substring(str,1,5)ではありません。
文字列の長さ
length(文字列) で取得します。
文字列の検索
index(文字列1,文字列2) で,文字列1の中の文字列2を検索し,最初に見つかった位置を返します。ない場合は0です。
続けて検索するには index(文字列1,文字列2,n) を用います。n文字目以降を検索します。
文字列の演算には,この他にもいろいろなものがありますが,応用編で使うときに説明します。
ブール演算
真偽値の演算です。AND,OR,XOR,NOT ができます。
AND:and(a,b) または a & b
OR :or(a,b) または a % b
XOR :xor(a,b)
NOT:!a
等しい,等しくない
条件判断で「aとbが等しいとき」というのをよく使います。「以上」「以下」もあります。これらは,結果が true か false になるのでブール演算の一種です。
等しい : a==b
等しくない: a!=b
より大きい: a>b
より小さい: a<b
以上 : a>=b (a=<b とはできません)
以下 : a<=b
誤差の吸収
コンピュータで小数の計算をするときは誤差がつきものです。条件判断をするとき,そのわずかな誤差で判断を誤ることがあります。「等しくなるはずなのに」ということがよくあります。調べてみると,小数点以下第14位で違っていたりします。これは,Cindyscriptだけでなく,表計算ソフトでも,Mathematica でも起こります。
Cindyscriptにはこのようなときのために,「ほとんど等しい」が用意されています。
ほとんど等しい:~= (チルダとイコール)
例:1/3 と 0.3333333・・・ を比較します。
この例では,1/3 と 0.3333333333333・・ はどこまでいっても(有限なら)異なるはずなので,「まあ同じ」になられては困るわけですが,ある計算結果が数学的には 1/3 でも,コンピュータの計算では小数演算ですので 0.33333・・・・ になることがあるのです。そのような場合に,この判断は有効になります。