home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
modula1
/
reihe.mod
< prev
Wrap
Text File
|
1993-07-28
|
5KB
|
153 lines
MODULE Reihe;
(* Harmonische Reihe
Das folgende Programm berechnet die harmonische
Reihe der Form:
m
Sm = Σ 1/i
i=1
einmal von links: 1/1 + 1/2 + ... + 1/m,
einmal von rechts: 1/m + 1/(m-1) + ... + 1/2 + 1/1
und errechnet anschließend die Differenz die sich bei der Berechnung
von links und von rechts ergibt.
*)
FROM RealInOut IMPORT WriteReal;
FROM InOut IMPORT ReadCard,
WriteString,
WriteLn;
CONST
Maxm = 40000; (* Maximaler Wert fuer m *)
VAR
m : CARDINAL; (* die einzugebende Zahl m *)
sumleft, (*linke Summe *)
sumright, (* rechte Summe *)
difference (* Differenz der beiden Summen *) : REAL;
(*******************************************************************)
(* PROCEDURE Init *)
(*******************************************************************)
(* Installiert das Programm REIHE. *)
(* (Nachricht ausgeben) *)
(*******************************************************************)
PROCEDURE init();
BEGIN
WriteLn; WriteLn;
WriteString('Das folgende Programm berechnet eine harmonische ');
WriteString('Reihe der Form:'); WriteLn; WriteLn;
WriteString(' m'); WriteLn;
WriteString(' Sm = Σ 1/i'); WriteLn;
WriteString(' i=1'); WriteLn; WriteLn;
END init;
(*******************************************************************)
(* PROCEDURE CalcLeft *)
(*******************************************************************)
(* Berechnet die Harmonische Reihe von links nach rechts, *)
(* also von 1 bis m, und gibt sie an das aufrufende Prg. zurueck. *)
(*******************************************************************)
PROCEDURE calcleft(m : CARDINAL) : REAL;
VAR
i : CARDINAL;
ireal, sum : REAL;
BEGIN
FOR i:=1 TO m DO
ireal:=FLOAT(i);
sum:=sum + (1.0/ireal);
END;
RETURN sum;
END calcleft;
(*******************************************************************)
(* PROCEDURE CalcRight *)
(*******************************************************************)
(* Berechnet die Harmonische Reiche von rechts nach links, *)
(* also von m bis 1 (Schrittweite -1) und gibt sie ans aufrufende *)
(* Prg. zurueck *)
(*******************************************************************)
PROCEDURE calcright(m : CARDINAL) : REAL;
VAR
i : CARDINAL;
ireal, sum : REAL;
BEGIN
FOR i:=m TO 1 BY -1 DO
ireal:=FLOAT(i);
sum:=sum + (1.0/ireal);
END;
RETURN sum;
END calcright;
(*******************************************************************)
(* PROCEDURE Readm *)
(*******************************************************************)
(* Liest eine Zahl (hier m) ein und gibt sie ans aufrufende Prg *)
(* zurueck *)
(*******************************************************************)
PROCEDURE readm() : CARDINAL;
VAR
z : CARDINAL;
BEGIN
REPEAT
WriteLn;
WriteString('Bitte m eingeben: ');
ReadCard(z);
UNTIL (z>0) AND (z<Maxm);
WriteLn;
RETURN z;
END readm;
(*******************************************************************)
(* PROCEDURE Calculation *)
(*******************************************************************)
(* -Ruft CalcRight und Calcleft mit dem Parameter m auf *)
(* -Berechnet die Differenz der beiden Berechnungen *)
(* -Gibt die berechneten Ergebnisse aus *)
(*******************************************************************)
PROCEDURE calculation(m : CARDINAL);
BEGIN
WriteLn;
sumleft:=calcleft(m);
WriteString('Das Ergebnis der Berechnung von links nach rechts ');
WriteString('lautet: ');
WriteReal(sumleft, 13);
WriteLn;
sumright:=calcright(m);
WriteString('Das Ergebnis der Berechnung von rechts nach links ');
WriteString('lautet: ');
WriteReal(sumright, 13);
WriteLn;
difference:=sumright-sumleft;
WriteString('Differenz zwischen den beiden Berechnungsverfahren');
WriteString('......: ');
WriteReal(difference, 13);
WriteLn; WriteLn;
WriteString('Ende der Berechnung. ');
WriteLn; WriteLn;
END calculation;
(*******************************************************************)
(* Hauptprogramm *)
(*******************************************************************)
BEGIN
init;
m:=readm();
calculation(m);
END Reihe.