home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
mod2brd1
/
mnf.mod
< prev
next >
Wrap
Text File
|
1990-04-08
|
4KB
|
144 lines
MODULE Mnf;
(*********************************************************************
Programm zum Errechnen der Mitternachtsformel.
Mit der Mitternachtsformel ist folgende Formel gemeint:
(-1)*b +/- SQRT(b*b + 4*a*c)
x1/x2 = ----------------------------
2*a
mit deren Hilfe die Nullstellen einer quadratischen Funktion
zweiten Grades (a*x^2+b*x+c) errechnet werden können.
********************************************************************)
FROM RealInOut IMPORT ReadReal,
WriteReal;
FROM InOut IMPORT WriteString,
WriteLn;
FROM MathLib0 IMPORT sqrt;
VAR
a, b, c : REAL; (* enthalten die Koeffizienten a, b, c *)
x1, x2 : REAL; (* enthalten die Nullstellen x1, x2, falls vorhanden *)
wertunterwurzel : REAL; (* enthaelt den Wert, der mit sqrt ausgerechnet
werden soll *)
PROCEDURE Init();
(* Installiert das Programm, gibt eine Meldung aus und
setzt die Variablen auf 0 *)
BEGIN
WriteString('Programm zur Berechnung der Nullstellen einer');
WriteLn;
WriteString('quadratischen Funktion zweiten Grades (a*x^2+b*x+c)');
WriteLn;
WriteString('mittels der Mitternachtsformel: '); WriteLn; WriteLn;
WriteString(' (-1)*b +/- SQRT(b*b + 4*a*c)'); WriteLn;
WriteString('x1/x2 = ----------------------------'); WriteLn;
WriteString(' 2*a'); WriteLn;
a:=0.0;
b:=0.0;
c:=0.0;
x1:=0.0;
x2:=0.0;
wertunterwurzel:=0.0;
END Init;
PROCEDURE LeseReal(meldung : ARRAY OF CHAR) : REAL;
(* gibt die Meldung aus und liest eine REAL-Zahl ein *)
VAR
realzahl : REAL;
BEGIN
WriteString(meldung);
ReadReal(realzahl);
WriteLn;
RETURN realzahl;
END LeseReal;
PROCEDURE LeseKoeffizienten();
(* Liest die Koeffizienten a, b, c ein *)
BEGIN
WriteLn;
WriteString('Geben Sie bitte die Koffezienten ein.');
WriteLn;
a:=LeseReal('Bitte die Realzahl a eingeben: ');
b:=LeseReal('Bitte die Realzahl b eingeben: ');
c:=LeseReal('Bitte die Realzahl c eingeben: ');
WriteLn;
WriteString('f(x) = '); (* Funktion ausgeben *)
WriteReal(a, 8);
WriteString('* x^2 + ');
WriteReal(b, 8);
WriteString('* x + ');
WriteReal(c, 8);
WriteLn;
WriteLn;
END LeseKoeffizienten;
PROCEDURE QWurzel(zahl : REAL) : REAL;
(* Berechnet den Wert := sqrt(zahl). Falls zahl<0 ist, liefert
QWurzel den Wert -1 zurueck *)
VAR
wurzel : REAL;
BEGIN
IF (zahl<0.0) THEN wurzel:=-1.0;
ELSIF (zahl=0.0) THEN wurzel:=0.0;
ELSE wurzel:=sqrt(zahl);
END;
RETURN wurzel;
END QWurzel;
(* Hauptprogramm *)
BEGIN
Init; (* Initialisieren *)
LeseKoeffizienten; (* Koeffizienten einlesen *)
wertunterwurzel:=(b*b - 4.0*a*c); (* Wert unter der Wurzel berechnen *)
(* a=0.0 => Division durch 0, Fehler ausgeben *)
IF (a=0.0) THEN
WriteLn;
WriteString('Konnte keine Nullstellen berechnen, da a=0');
WriteLn;
(* wertunterwurzel<0.0 => man berechnet die Wurzel einer negativen
Zahl, Fehler ausgeben *)
ELSIF (wertunterwurzel<0.0) THEN
WriteLn;
WriteString('Funktion besitzt keine Nullstellen, da (b*b - 4*a*c)<0');
WriteLn;
(* andernfalls Nullstelle(n) berechnen *)
ELSE
x1:=((-1.0)*b + QWurzel(wertunterwurzel)) / (2.0*a);
x2:=((-1.0)*b - QWurzel(wertunterwurzel)) / (2.0*a);
(* nur eine Nullstelle vorhanden => x ausgeben *)
IF (x1=x2) THEN
WriteLn;
WriteString('Eine Nullstelle gefunden: x = ');
WriteReal(x1, 8);
WriteLn;
(* oder zwei Nullstellen => x1, x2 ausgeben *)
ELSE
WriteLn;
WriteString('Zwei Nullstellen gefunden:');
WriteLn;
WriteString('x1 = '); WriteReal(x1, 8);
WriteLn;
WriteString('x2 = '); WriteReal(x2, 8);
WriteLn;
END;
END;
(* Programm mit einer Meldung beenden *)
WriteLn;
WriteLn;
WriteString('Ende der Berechnung.');
WriteLn;
WriteLn;
(* Und Tschuess *)
END Mnf.