home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
modula3
/
bino.mod
< prev
next >
Wrap
Text File
|
1993-07-28
|
6KB
|
168 lines
MODULE bino;
(*********************************************************************
Berechnung des Bimomialkoeffizienten
┌ ┐
│ N │
│ K │
└ ┘ auf rekursive und iterative Weise.
*********************************************************************)
FROM InOut IMPORT ReadCard,
WriteCard,
WriteLn,
Read,
WriteString,
ReadString;
FROM IO IMPORT WrLngCard;
CONST
Min = 0; (* kleinstmoegliche Zahl *)
Max = 69; (* groesstmoegliche Zahl *)
VAR
n, k : CARDINAL;(* diese Zahlen bilden den Binomialkoeffizienten *)
ch : CHAR; (* Variable fuer die Tastatureingabe *)
(*******************************************************************)
(* PROCEDURE lesenat *)
(*******************************************************************)
(* Liest eine Zahl ein und gibt sie an das aufrufende Prg zurueck. *)
(* Die zurueckgegebene Zahl erfuellt folgende Bedingung: *)
(* min <= zahl <= max *)
(*******************************************************************)
PROCEDURE lesenat(min, max : CARDINAL; m : ARRAY OF CHAR) : CARDINAL;
VAR
z : CARDINAL;
BEGIN
REPEAT
WriteString(m);
WriteString(' (');
WriteCard(min, 0);
WriteString('<=zahl<=');
WriteCard(max, 0);
WriteString('): ');
ReadCard(z); (* solange eine Zahl einlesen *)
WriteLn; (* bis die Zahl *)
UNTIL (z>=min) AND (z<=max); (* die Bedingungen erfuellt. *)
RETURN z;
END lesenat;
(*******************************************************************)
(* Procedure REKURSIV *)
(*******************************************************************)
(* Berechnet den Binomialkoeffizienten rekursiv. *)
(*******************************************************************)
PROCEDURE rekursiv(n, k : CARDINAL) : LONGCARD;
BEGIN
IF (k=0) OR (k=n) THEN
RETURN 1;
ELSE
RETURN rekursiv(n-1, k) + rekursiv(n-1, k-1);
END;
END rekursiv;
(*******************************************************************)
(* Procedure FAK *)
(*******************************************************************)
(* Berechnet die Fakultaet der Zahl z. *)
(*******************************************************************)
PROCEDURE fak(z : CARDINAL) : LONGREAL;
VAR
i : CARDINAL;
f : LONGREAL;
BEGIN
IF (z=0) THEN (* 0! = 1 *)
RETURN 1.0;
ELSE
f:=1.0;
FOR i:=2 TO z DO
f:=f*LONGREAL(i);
END;
END;
RETURN f;
END fak;
(*******************************************************************)
(* Procedure NICHTREKURSIV *)
(*******************************************************************)
(* Berechnet den Binomialkoeffizienten (n k) nach folgender Formel:*)
(* n! *)
(* (n k) = --------- *)
(* k! (n-k)! *)
(*******************************************************************)
PROCEDURE nichtrekursiv(n, k : CARDINAL) : LONGCARD;
VAR
z : LONGREAL;
BEGIN
z:=fak(n)/(fak(k)*fak(n-k)); (* Koeffizienten nach Formel berechnen *)
z:=z+0.5; (* auf 0 Stellen runden und als *)
RETURN LONGCARD(z); (* LONGCARD-Variable zurueckgeben *)
END nichtrekursiv;
(*******************************************************************)
(* Procedure INIT *)
(*******************************************************************)
(* setzt die Variablen n und k auf 0 und gibt eine Nachricht aus. *)
(*******************************************************************)
PROCEDURE init;
BEGIN
n:=0; k:=0;
WriteLn;
WriteString(' ┌N┐');
WriteLn;
WriteString('Dieses Programm berechnet den Binomialkoeffizenten └K┘');
WriteString(' auf zwei'); WriteLn;
WriteString('Arten, naemlich rekursiv bzw. nicht-rekursiv.');
WriteLn;
WriteString('Bitte beachten Sie bei der Eingabe von n und k,');
WriteString(' dass gelten muss:');
WriteString(' k<=n');
WriteLn; WriteLn;
END init;
(*******************************************************************)
(* Hauptprogramm *)
(*******************************************************************)
BEGIN
init;
REPEAT
n:=lesenat(Min, Max, 'Bitte n eingeben');
k:=lesenat(Min, Max, 'Bitte k eingeben');
WriteLn;
UNTIL (k<=n);
WriteString('[R]ekursiv, [N]icht rekursiv oder [B]eides: ');
REPEAT
Read(ch); (* Was soll berechnet werden *)
UNTIL (ch='r') OR (ch='R') OR (* r = nur rekursiv *)
(ch='n') OR (ch='N') OR (* n = nicht rekursiv *)
(ch='b') OR (ch='B'); (* b = beides *)
WriteString(ch);
WriteLn; WriteLn;
IF (ch='r') OR (ch='R') THEN (* rekursiv *)
WriteString('Rekursive Loesung......: ');
WrLngCard(rekursiv(n, k), 0);
WriteLn;
ELSIF (ch='n') OR (ch='N') THEN (* nicht rekursiv *)
WriteString('Nicht-rekursive Loesung: ');
WrLngCard(nichtrekursiv(n, k), 0);
WriteLn;
ELSE (* beides *)
WriteString('Rekursive Loesung......: ');
WrLngCard(rekursiv(n, k) ,0);
WriteLn;
WriteString('Nicht-rekursive Loesung: ');
WrLngCard(nichtrekursiv(n, k), 0);
WriteLn;
END;
WriteLn; WriteLn;
WriteString('Ende der Berechnung!');
WriteLn; WriteLn;
END bino.