配列というのは添字つきの変数で自由に代入や参照が可能である. 他の言語では 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
0
newvect(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
|