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

  main()
  {
      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

  main()
  {
      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>

  main()
  {
      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() を使って求めるには、 どうすればよいか。

桂田 祐史
2017-09-29