計算機実験 II(塩田・森教官) No.2

  1995年10月13日の課題 : 基本算法、配列型、type の定義

[1] 基本算法を眺める。

  1.  整数の +,-,*,divmod

  2.  実数の +,-,*,/,trunc(切り捨て、値は整数値), round(四捨五入、値は整数値)

  3.  整数、実数の abssqrcossinarctansqrtexpln,etc.

  4.  文字列の +,lengthsubstrindex,etc. ( Sun Pascal のマニュアルを見よ )

  5.  論理値の andornot,etc.

[2] 配列]を覚える。例えば、

    var v:array[1..3] of real;

と宣言すると v は v[1],v[2],v[3] の3つの実数からなる配列となる。


[3] type 文(型の定義)を覚える。

基本的なデータ型から新しいデータ型を作ることができる。 宣言には type 文を用いる。例えば

    type vector=array[1..3] of real;
    var v,w:vector;

と宣言すると v,w は添え字1~3を持つ実数の配列となる。 このとき v と w は型が一致しているので w:=v; という代入が可能である (成分ごとに代入する必要がない)。 この代入は次のような宣言をした場合には不可能になる。

    var
      v:array[1..3] of real;
      w:array[1..3] of real;


[4] const 文(定数の定義)を覚える。

プログラム全体で値の変わらないデータを定数宣言でき、 例えば配列の上下限の宣言に使える。


[5] 乱数を覚える。

random() は 0 から 1 の間の乱数を返す関数。 乱数発生ルーチンの再初期化命令は各PASCALごとに異なるが、 Sun Pascal では

  整数変数 := seed(整数変数); 

と書く。


[6] サンプル(ヤコビ法): 行列の固有ベクトルを求める反復法。
program sample2;

const size=2;

type 
  vector=array[1..size] of real;
  matrix=array[1..size] of vector;

var
  a:matrix;
  u,v:vector;
  i,j,k,x:integer;
  y,z:real;

begin
  x:=seed(wallclock); { 乱数発生ルーチンの初期化 }
  writeln('A = ');
  for i:=1 to size do 
    begin
      for j:=1 to size do
        begin
          a[i,j]:=round(5*random(1)); { 整数乱数 }
          write(a[i,j]:2:0)
        end;
      writeln
    end;
  writeln;

  z:=0;
  for i:=1 to size do
    begin
      u[i]:=random(1); { 実数乱数 }
      z:=z+sqr(u[i])
    end;
  z:=sqrt(z);
  writeln('u = ');
  for i:=1 to size do
    begin
      u[i]:=u[i]/z;
      writeln(u[i]:10:5)
    end;

  for k:=1 to 20 do
    begin
      for i:=1 to size do 
        begin
          y:=0;
          for j:=1 to size do y:=y+a[i,j]*u[j];
         v[i]:=y
        end;
      u:=v; { 同じ型を持つ変数の代入 }
      z:=0;
      for i:=1 to size do z:=z+sqr(u[i]);
      z:=sqrt(z);
      writeln('u = ');
      for i:=1 to size do
        begin
          u[i]:=u[i]/z;
          writeln(u[i]:10:5)
        end;
      writeln
    end
end.