unit complex; interface type tcomplex = record re, im: real; end; function AbsComplex(z: tcomplex): real; procedure AddComplex(z1, z2: tcomplex; var res: tcomplex); procedure SubComplex(a, b: tcomplex; var res: tcomplex); procedure ScaleComplex(var z: tcomplex; c: real); procedure MultComplex(z1, z2: tcomplex; var res: tcomplex); function DivComplex(a, b: tcomplex; var res: tcomplex): boolean; procedure PowerComplex(z: tcomplex; var res: tcomplex; n: integer); procedure PrintComplex(z: tcomplex); implementation function AbsComplex(z: tcomplex): real; begin AbsComplex := sqrt(sqr(z.re) + sqr(z. im)) end; procedure AddComplex(z1, z2: tcomplex; var res: tcomplex); begin res.re := z1.re + z2.re; res.im := z1.im + z2.im; end; procedure SubComplex(a, b: tcomplex; var res: tcomplex); begin res.re := a.re - b.re; res.im := a.im - b.im; end; procedure MultComplex(z1, z2: tcomplex; var res: tcomplex); begin res.re := z1.re * z2.re - z1.im * z2.im; res.im := z1.re * z2.im + z1.im * z2.re end; procedure ScaleComplex(var z: tcomplex; c: real); begin z.re := z.re * c; z.im := z.im * c end; function DivComplex(a, b: tcomplex; var res: tcomplex): boolean; begin DivComplex := false; // False = error / True = Ok if (b.re = 0) and (b.im = 0) then exit else begin res.re := ((a.re*b.re)+(a.im*b.im))/((b.re*b.re)+(b.im*b.im)); res.im := ((a.im*b.re)-(a.re*b.im))/((b.re*b.re)+(b.im*b.im)); end; end; procedure PowerComplex(z: tcomplex; var res: tcomplex; n: integer); var i: integer; T: tcomplex; begin T := z; for i := 2 to n do begin MultComplex(T, z, T); end; res := T; end; procedure PrintComplex(z: tcomplex); const sign: array[boolean] of char = ('-', '+'); begin write(z.re:6:1, sign[z.im > 0], abs(z.im):6:1, '*i'); end; end.