Solution 3/ja

From Lazarus wiki
Jump to: navigation, search

English (en) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

3Ea - 解答 (著者: Tao Yue, 状態: 原文のまま修正なし)

フィボナッチ数列問題の解答

(* 著者:    Tao Yue
   日付:      19 July 1997
   記述:
      最初の10個のフィボナッチ数列の数を求める。
   Version:
      1.0 - original version
*)
 
program Fibonacci;
 
var
   Fibonacci1, Fibonacci2 : integer;
   temp : integer;
   count : integer;
 
begin    (* Main *)
   writeln ('最初の10個のフィボナッチ数列は:');
   count := 0;
   Fibonacci1 := 0;
   Fibonacci2 := 1;
   repeat
      write (Fibonacci2:7);
      temp := Fibonacci2;
      Fibonacci2 := Fibonacci1 + Fibonacci2;
      Fibonacci1 := Temp;
      count := count + 1
   until count = 10;
   writeln;
 
   (* もちろん、この問題をとくために FOR ループや WHILE ループを使うこともできる。 *)
 
end.     (* Main *)

2の累乗値の解答

(* 著者:    Tao Yue
   日付:      13 July 2000
   記述:
      20000未満の2の累乗値をすべて求め、1行に5つ表示する。
   Version:
      1.0 - original version
*)
 
program PowersofTwo;
 
const
   numperline = 5;
   maxnum = 20000;
   base = 2;
 
var
   number : longint;
   linecount : integer;
 
begin    (* Main *)
   writeln ('Powers of ', base, ', 1 <= x <= ', maxnum, ':');
   (* ループの設定 *)
   number := 1;
   linecount := 0;
   (* ループ *)
   while number <= maxnum do
      begin
         linecount := linecount + 1;
         (* 行の最初の数字でなければカンマとスペースを表示させる *)
         if linecount > 1 then
            write (', ');
         (* 数字を表示させる *)
         write (number);
         (* 数列の最後の数字でなく、行の最後の数字ならコンマを表示し、次の行に行く。 *)
         if (linecount = numperline) and not (number * 2 > maxnum) then
            begin
               writeln (',');
               linecount := 0
            end;
         (* 数字を増やす *)
         number := number * base;
      end;  (* while *)
   writeln;
 
   (* このプログラムも REPEAT..UNTIL ループを用いて書き換えることができる。 *)
 
end.     (* Main *)

私が3つの定数、すなわち、基数、各行に表示するための累乗の数、最大数を使ったことに注意して欲しい。こうすることで簡単に、このプログラムが将来、改変できることを確実にしている。

直の値よりも定数を利用するというのは身につけておくべきよいプログラミング習慣である。非常に長いプログラムを書いたとき、ある数値を何千回も参照することになるかもしれない。もし、それらを決め打ちしていたなら、それらをすべて探し出さなくてはならなくなる。また、同じ値を異なる文脈で利用しているかもしれない。従い、単純に検索・置換するというわけにはいかない。定数を使うことでプログラムを拡張するのがずっと簡単になるのである。

また、数値変数に対して longint タイプを用いたことにも注意して欲しい。こうした訳は number <= 20000 のチェックで失敗したときに、number16384 の2つあとの累乗で 32768 に達してしまうからである。これは整数タイプの範囲(-32768 から 32767まで)を超えてしまう。(longint でない場合を試して、何が起こるか見てみなさい。)

previous contents next