配列というのは添字つきの変数で自由に代入や参照が可能である. 他の言語では array と呼ばれるが, Asir では数学的なオブジェクト である vector, matrix を 単なる入れ物として用いて array の 代用品としている.
名前のついた入れ物と思える. 変数が式の中に現れるとその中に入って いる値と置き換わる. また, 代入式の左辺に現れると, 右辺の値が その入れ物の中身になる (上書き). 普通の変数は今までのプログラムで利用してきた. たとえば前節最後の プログラムの Epsilon, P, Q, A 等は (普通の)変数である.
普通の変数(入れ物)が長さ Size 個だけつながったもの.
A[0] | A[1] | ![]() |
A[Size-1] |
[0] A = newvect(5); [ 0 0 0 0 0 ] [1] B = newvect(3,[1,2,3]); [ 1 2 3 ] |
長さ 5 の配列 (vector) を生成して A に代入
最初は 0 ベクトル 長さ 3 の配列を初期値指定して生成 B[0] = 1, B[1] = 2, B[2] = 3 |
[3] B[2]; 3 [4] C = (B[0]+B[1]+B[2])/3; 2 [5] C; 2 |
B の添字 2 に対応する要素 式の中に現れる配列要素アクセス C には 2 が入っている |
[6] A[0] = -1; -1 [7] A; [ -1 0 0 0 0 ] |
A の先頭に -1 を代入 A が配列なら, A の値は配列全体 |
[8] size(A); [5] [9] size(A)[0]; 5 |
長さを取り出す組み込み関数
リストを返す リストの先頭要素が長さ |
配列についてまとめると,次のようになる.
配列(asir ではベクトルと呼ぶ)のなかのデータの最大値を求めてみよう.
/* cond8.rr */ def main() { Total=5; A = newvect(Total); for (K=0; K<Total; K++) { A[K] = random() % 100; } print(A); /* search the maximum */ Max = A[0]; for (K=0; K<Total; K++) { if (A[K] > Max) { Max = A[K]; } } print("Maximum is ",0); print(Max); }
|
まず, 乱数でデータをAへ格納してから, 最大値を探す.
実行結果は次のようになる.
[450] load("cond8.rr"); 1 [453] main(); [ 58 10 55 62 2 ] Maximum is 62 0newvect(N) はサイズ N のベクトルを生成する関数である. random() は乱数を戻す関数である. |
平均値を求めるプログラムも同じように書ける.
/* cond9.rr */ def main() { Total=5; A = newvect(Total); for (K=0; K<Total; K++) { A[K] = random() % 100; } Sum = 0; print(A); for (K=0; K<Total; K++) { Sum = Sum + A[K]; } print("Average is ",0); print(Sum/Total); }
|
左が平均値を求めるプログラムである.
実行例は
[445] load("cond9.rr"); 1 [448] main(); [ 77 90 39 46 58 ] Average is 62 0
|