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

  1995年10月27日の課題 : if 文、for 文、while 文、repeat-until 文

[1] if 文を覚える。基本形は

  if (条件判定) then (実行文);

  if (条件判定) then (実行文1) else (実行文2);

実行文が複数あるときは begin と end でブロックを作る。 (以下の [2~5] も同様。)

[2] case 文を覚える。

(式)の値に応じて違う作業をするときに用いる。 一般形は、

  case (式) of

   (case ラベル), … ,(case ラベル):(実行文);
        :
   (case ラベル), … ,(case ラベル):(実行文);

  end;


[3] for 文を覚える。

1ずつ変化する制御変数を用いてループを作る。 一般形は、

  for (制御変数):=(初期値) to  (最終値) do (実行文);

  for (制御変数):=(初期値) downto  (最終値) do (実行文);

前者は 初期値 ≦ 最終値 のとき、 後者は 初期値 ≧ 最終値 のときで、 この不等号が成り立たない場合には実行文は一度も実行されない。


[4] while 文を覚える。

条件判定がループの最初にある形である。 一般形は、

  while (条件判定) do (実行文);

[5] repeat 文を覚える。

条件判定がループの最後にある形である。 一般形は、

  repeat (実行文) until (条件判定);

実行文を最低1回実行する点が while ループと異なる。


[6] goto 文について

[7] サンプル
program sample4a;  { 角谷予想 }

{ [偶数なら2で割る、奇数なら3倍して1を足す]
   という操作を自然数に繰り返すと必ず1になるという予想がある。}

var
  n,max:integer;
  over:boolean;
        
begin
  max:=(maxint-1) div 3;
  over:=false;
  repeat
    write('2 以上 ',max:1,' 以下の自然数を入力してください : ');
    readln(n);
  until (n>=2) and (n<=max);
  write(n:1);

  while n<>1 do
    begin
      if (n>max) or (n<0) then begin over:=true; exit end;
      if (n mod 2)=0
        then n:=n div 2
        else n:=3*n+1;
      write(' → ',n:1)
    end;
  writeln;
  if over=true then writeln('overflow occurs !!');
end.
program sample4b;

var
  ok:boolean;
  sentaku,stepsuu:integer;
  shokichi,haba:real;
  loguni:real;
     
procedure table(function f(x:real):real; a,b:real; c:integer);
var i:integer;
begin
  for i:=1 to c do 
    begin
      writeln('x = ',a:10:5,',  f(x) = ',f(a):10:5);
      a:=a+b
    end
end;

function nibeki(x:real):real;
begin nibeki:=exp(loguni*x) end;

function heihoukon(x:real):real;
begin heihoukon:=sqrt(x) end;

function sanjoukon(x:real):real;
begin sanjoukon:=exp(ln(x)/3) end;

{ 関数や手続きも他の関数や手続きの引数にできる。テキスト pp.86-88 参照 }

begin
  loguni:=ln(2);
  writeln('数表を作成します。');
  writeln('1 : 2のべき,  2 : 平方根,  3 : 3乗根');
  writeln;
  repeat
    write('1, 2 または 3 を入力してください : ');
    readln(sentaku);
    if (sentaku>=1) and (sentaku<=3)
      then ok:=true
      else begin ok:=false; writeln('再入力') end;
  until ok=true;
  write('数表の初期値を入力してください : ');
  readln(shokichi);
  write('数表の刻み幅を入力してください : ');
  readln(haba);
  write('数表のステップ数を入力してください : ');
  readln(stepsuu);
  writeln;

  case sentaku of
    1: table(nibeki,shokichi,haba,stepsuu);
    2: table(heihoukon,shokichi,haba,stepsuu);
    3: table(sanjoukon,shokichi,haba,stepsuu)
  end;
end.