4.2 ベクトルの扱いの練習

(ここは大規模工事が必要なので…参考程度に)

  1. 長さ $ n$ の配列で $ n$ 次元のベクトルを表現することができる。$ n$ 次元 ベクトル $ \vec a=(a_1, a_2, \cdots, a_n)$ の最大値ノルム

    $\displaystyle \Vert\vec a\Vert _{\infty}:=\max_{i=1,2,\cdots,n}\vert a_i\vert
$

    を計算する関数を作ることを目標にする。手始めに、標準入力から入力された $ 3$ 次元ベクトルの最大値ノルムを計算する、次のようなプログラムを書き始 めた。関数 maxnorm0() を完成させよ。
    #include <stdio.h>
    
    #define N 3
    
    int main(void)
    {
        int i;
        double a[N], maxnorm0();
        for (i = 0; i < N; i++)
            scanf("%lf", &a[i]);
        printf("maxnorm=%g\n", maxnorm0(a));
    }
    
    double maxnorm0(....
    

    (関数に配列を引数として渡す方法、最大値の計算法など)
  2. (前問の続き) ベクトルの長さ $ n$ は、プログラムの実行時に変更したいと 考えて、次のようなプログラムを書き始めた。関数 maxnorm() を完成 させよ。
    #include <stdio.h>
    
    #define MAXN 1000
    
    int main(void)
    {
        int i, n;
        double a[MAXN], maxnorm();
        printf("input n (<= %d): ", MAXN); scanf("%d", &n);
        if (n > MAXN)
            exit(1);
        for (i = 0; i < n; i++)
            scanf("%lf", &a[i]);
        printf("maxnorm=%g\n", maxnorm(a, n));
    }
    
    double maxnorm(....
    

    できれば maxnorm() の定義は別のファイルに書いて、分割コンパイ ルできるようにする。
    (再利用可能性の高い関数を書く方法など)
  3. 前問のプログラムでは MAXN の定義を書き換えれば、大きな次元のベ クトルに対応するプログラムに変更できるが、それでもプログラムに変更が必 要なのは面倒である。また、大きな MAXN をあまり大きくすると、無駄 である。そこで、ベクトルの長さ $ n$ をプログラムの実行時に指定できるよ うなプログラムが望ましい。これは次のように malloc() を使うように 書き換えれば良い。
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int i, n;
        double *a, maxnorm();
    
        printf("input n: "); scanf("%d", &n);
        a = malloc(n * sizeof(double));
        if (a == NULL) {
            fprintf(stderr, "メモリーが確保できません\n");
            exit(1);
        }
        /* 以下、プログラムの字面は前問とまったく同じで OK */
        for (i = 0; i < n; i++)
            scanf("%lf", &a[i]);
        printf("maxnorm=%g\n", maxnorm(a, n));
    }
    
    double maxnorm(....
    

    (C++ を勉強しているならば、同じことを C++ で書いてみよ。)
    長さ $ n$ のベクトルを標準入力から二つ読み込んで、それらの和、内積、 ユークリッド・ノルムと、二つのベクトルのなす角度を計算するプログラムを 作れ。後で、利用できるように、addvector(), dotproduct(), norm(), angle() のような関数を作ること。
  4. ある理由から
    a[0], a[1], a[2], $ \cdots$, a[100]
    の両端 a[0], a[100] を除いた
    a[1], a[2], $ \cdots$, a[99]
    の絶対値の最大値を知りたいとする。maxnorm() を使って求めるには、 どうすればよいか。



桂田 祐史