next up previous contents index
: 効率的なプログラムを書くには? : 制御構造とやさしいアルゴリズム : 2 分法とニュートン法   目次   索引


最大値と配列

配列というのは添字つきの変数で自由に代入や参照が可能である. 他の言語では array と呼ばれるが, Asir では数学的なオブジェクト である vector, matrix を 単なる入れ物として用いて array の 代用品としている.

  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

  2. 配列要素の取り出し
    [3] B[2];           
    3
    [4] C = (B[0]+B[1]+B[2])/3;  
    2
    [5] C; 
    2
    
        
    B の添字 2 に対応する要素 式の中に現れる配列要素アクセス C には 2 が入っている

  3. 配列要素への代入
    [6] A[0] = -1; 
    -1
    [7] A;
    [ -1 0 0 0 0 ]
    
        
    A の先頭に -1 を代入 A が配列なら, A の値は配列全体

  4. 配列の長さの取り出し
    [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() は乱数を戻す関数である.

A % N AN でわった余り.


平均値を求めるプログラムも同じように書ける.

/* 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



next up previous contents index
: 効率的なプログラムを書くには? : 制御構造とやさしいアルゴリズム : 2 分法とニュートン法   目次   索引
Nobuki Takayama 平成15年9月12日