home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
modula2
/
library
/
fst
/
modula3
/
adtkompl.mod
< prev
next >
Wrap
Text File
|
1993-07-28
|
2KB
|
95 lines
IMPLEMENTATION MODULE adtkomplex;
(* adtkomplex stellt Datenstruktur und Operat. fuer kompl. Zahlen
Achtung, das Problem des Zahlen-Ueber- und Unterlaufs bei
REAL-Operationen ist nicht abgfangen *)
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
FROM MathLib0 IMPORT sqrt;
TYPE KomplexInt = RECORD
Re,Im:REAL
END;
Komplex = POINTER TO KomplexInt;
PROCEDURE Kreieren(VAR X:Komplex);
BEGIN
ALLOCATE(X,SIZE(KomplexInt))
END Kreieren;
PROCEDURE Loeschen(VAR X:Komplex);
BEGIN
DEALLOCATE(X,SIZE(KomplexInt));
X:=NIL;
END Loeschen;
PROCEDURE Setzen(VAR X:Komplex;RT,IT:REAL);
BEGIN
X^.Re:=RT;
X^.Im:=IT;
END Setzen;
PROCEDURE RT(X:Komplex):REAL;
BEGIN
RETURN X^.Re
END RT;
PROCEDURE IT(X:Komplex):REAL;
BEGIN
RETURN X^.Im
END IT;
PROCEDURE Summe(X,Y:Komplex; VAR Z:Komplex);
BEGIN
Z^.Re:=X^.Re + Y^.Re;
Z^.Im:= X^.Im + Y^.Im;
END Summe;
PROCEDURE Differenz(X,Y:Komplex; VAR Z:Komplex);
BEGIN
Z^.Re:=X^.Re - Y^.Re;
Z^.Im:= X^.Im - Y^.Im;
END Differenz;
PROCEDURE Produkt(X,Y:Komplex; VAR Z:Komplex);
VAR ZInt:KomplexInt; (* für den Fall X = Z oder Y = Z *)
BEGIN
ZInt.Re:=X^.Re * Y^.Re - X^.Im * Y^.Im;
ZInt.Im:=X^.Re * Y^.Im + X^.Im * Y^.Re;
Z^:= ZInt;
END Produkt;
PROCEDURE Quotient(X,Y:Komplex; VAR Z:Komplex);
VAR ZInt:KomplexInt; (* für den Fall X = Z oder Y = Z *)
Nenner:REAL;
BEGIN
IF Betrag(Y)=0.0 THEN (* Division durch Null *)
Setzen(Z,0.0,0.0);
ELSE
WITH Y^ DO
Nenner:= Re* Re + Im*Im;
END; (* WITH *)
ZInt.Re:=(X^.Re*Y^.Re + X^.Im*Y^.Im)/Nenner;
ZInt.Im:=(X^.Im*Y^.Re - X^.Re*Y^.Im)/Nenner;
Z^:=ZInt;
END; (* IF *)
END Quotient;
PROCEDURE Betrag(X:Komplex):REAL;
BEGIN
WITH X^ DO
RETURN sqrt(Re*Re+Im*Im)
END
END Betrag;
PROCEDURE Gleich(X,Y:Komplex):BOOLEAN;
BEGIN
RETURN(X^.Re=Y^.Re) AND (X^.Im=Y^.Im)
END Gleich;
END adtkomplex.