RosettaCodeData/Task/Arithmetic-Complex/Component-Pascal/arithmetic-complex.pas

87 lines
1.9 KiB
ObjectPascal

MODULE Complex;
IMPORT StdLog;
TYPE
Complex* = POINTER TO ComplexDesc;
ComplexDesc = RECORD
r-,i-: REAL;
END;
VAR
r,x,y: Complex;
PROCEDURE New(x,y: REAL): Complex;
VAR
r: Complex;
BEGIN
NEW(r);r.r := x;r.i := y;
RETURN r
END New;
PROCEDURE (x: Complex) Add*(y: Complex): Complex,NEW;
BEGIN
RETURN New(x.r + y.r,x.i + y.i)
END Add;
PROCEDURE ( x: Complex) Sub*( y: Complex): Complex, NEW;
BEGIN
RETURN New(x.r - y.r,x.i - y.i)
END Sub;
PROCEDURE ( x: Complex) Mul*( y: Complex): Complex, NEW;
BEGIN
RETURN New(x.r*y.r - x.i*y.i,x.r*y.i + x.i*y.r)
END Mul;
PROCEDURE ( x: Complex) Div*( y: Complex): Complex, NEW;
VAR
d: REAL;
BEGIN
d := y.r * y.r + y.i * y.i;
RETURN New((x.r*y.r + x.i*y.i)/d,(x.i*y.r - x.r*y.i)/d)
END Div;
(* Reciprocal *)
PROCEDURE (x: Complex) Rec*(): Complex,NEW;
VAR
d: REAL;
BEGIN
d := x.r * x.r + x.i * x.i;
RETURN New(x.r/d,(-1.0 * x.i)/d);
END Rec;
(* Conjugate *)
PROCEDURE (x: Complex) Con*(): Complex,NEW;
BEGIN
RETURN New(x.r, (-1.0) * x.i);
END Con;
PROCEDURE (x: Complex) Out(),NEW;
BEGIN
StdLog.String("Complex(");
StdLog.Real(x.r);StdLog.String(',');StdLog.Real(x.i);
StdLog.String("i );")
END Out;
PROCEDURE Do*;
BEGIN
x := New(1.5,3);
y := New(1.0,1.0);
StdLog.String("x: ");x.Out();StdLog.Ln;
StdLog.String("y: ");y.Out();StdLog.Ln;
r := x.Add(y);
StdLog.String("x + y: ");r.Out();StdLog.Ln;
r := x.Sub(y);
StdLog.String("x - y: ");r.Out();StdLog.Ln;
r := x.Mul(y);
StdLog.String("x * y: ");r.Out();StdLog.Ln;
r := x.Div(y);
StdLog.String("x / y: ");r.Out();StdLog.Ln;
r := y.Rec();
StdLog.String("1 / y: ");r.Out();StdLog.Ln;
r := x.Con();
StdLog.String("x': ");r.Out();StdLog.Ln;
END Do;
END Complex.