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・・・・ になることがあるのです。そのような場合に,この判断は有効になります。