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

  1995年12月8日の課題 :  ポインタ

[1] ポインタを覚える。

  1. ポインタはデータのアドレスを指し示す変数である。

  2. ポインタ変数は記号 ^ によって表現される。 ( 書式は sample8asample8b 参照 )

  3. ポインタ変数は プログラム実行中に手続き new によって記憶領域が確保される。

  4. nil は何も指し示していないポインタである。

  5. ポインタで指し示すレコード型変数のフィールドに 同じポインタ型を加えることによって、 動的なデータ構造・再帰的データ構造をつくることができる。
    ( 例 : sample8a の beki の中の next や、 sample8b の ref の中の prev,left,right  )

  6. ポインタは関数の戻り値にすることができる。 ( sample8a の bunkai )

[2] サンプル

program sample8a;

type
  seki=^sobeki;
  sobeki=record
           sosuu,beki:integer; 
           next      :seki
         end;

var
  n:integer;
  b:seki;
  hitotsume:boolean;

function bunkai(x:integer):seki;
var
  p,e,m:integer;
  r,s:seki;
begin
  new(r);
  bunkai:=r;
  p:=1;
  m:=trunc(sqrt(x));
  repeat
    p:=p+1;
    e:=0;
    while (x mod p)=0 do begin x:=(x div p); e:=e+1 end;
    if e>0
      then begin
        r^.sosuu:=p;
        r^.beki:=e;
        if x=1
          then r^.next:=nil
          else begin
            new(s);
            r^.next:=s;
            r:=s;
            m:=trunc(sqrt(x))
          end
      end;
  until (x=1) or (p>m);
  if x>1
    then begin
      r^.sosuu:=x;
      r^.beki:=1;
      r^.next:=nil;
    end;
end;

begin
  repeat
    writeln;
    write('2 以上の自然数を入力してください( 0 ならば終了): ');
    readln(n);
    if n>1
      then begin
        write(n:1,' = ');
        b:=bunkai(n);
        hitotsume:=true;
        while b<>nil do
          begin
            if hitotsume=false then write(' × ');
            write(b^.sosuu:1);
            if b^.beki>1 then write('^',b^.beki:1);
            hitotsume:=false;
            b:=b^.next
          end;
        writeln
      end;
  until n=0
end.