```Contributor: PAUL GRISWOLD

{
I wrote the following program for an introductory computer science course.
It was written in Turbo Pascal, but I believe everything in it is standard,
so it should work fine with Think Pascal.
pgriswold@delphi.com
}

type
ComplexType = record          {Complex number ADT}
RealPart      : real;     {Real portion of complex number}
ImaginaryPart : real;     {Imaginary part of complex number}
end;

var
Complex1,                     {First complex number}
Complex2,                     {Second complex number}
Result : ComplexType;         {Result of current operation}

procedure OutputNumber(ComplexNumber : ComplexType);
{  Displays complex number in a+bi format.

Pre Condition:  ComplexNumber is defined;
Post Condition:  Complex number is written to the screen in a+bi format
}
begin {OutputNumber}
writeln(ComplexNumber.RealPart:0:4,' + ',ComplexNumber.ImaginaryPart:0:4,
'i');
end;  {OutputNumber}

function Magnitude(ComplexNumber : ComplexType) : real;
{  Determines the magnitude of a complex number.

Pre Condition:  ComplexNumber is defined;
Post Condition:  Magnitude of complex number is returned.
}
begin  {Magnitude}
Magnitude :=
sqrt(sqr(ComplexNumber.RealPart)+sqr(ComplexNumber.ImaginaryPar
t));
end;   {Magnitude}

procedure AddComplex(Complex1,Complex2 : ComplexType;
var Result : ComplexType);
{   Adds two complex numbers.

Pre Condition:  Complex1 and Complex2 are defined;
Post Condition:  Result contains the sum of Complex1 and Complex2
}
Result.RealPart := Complex1.RealPart + Complex2.RealPart;
Result.ImaginaryPart := Complex1.ImaginaryPart + Complex2.ImaginaryPart;

procedure MultiplyComplex(Complex1,Complex2 : ComplexType;
var Result : ComplexType);
{   Multiplies two complex numbers.

Pre Condition:  Complex1 and Complex2 are defined;
Post Condition:  Result contains the product of Complex1 and Complex2
}
begin  {MultiplyComplex}
Result.RealPart := Complex1.RealPart * Complex2.RealPart -
Complex1.ImaginaryPart * Complex2.ImaginaryPart;
Result.ImaginaryPart := Complex1.Realpart * Complex2.ImaginaryPart +
Complex2.RealPart * Complex1.ImaginaryPart;
end;   {MultiplyComplex}

procedure DivideComplex(Complex1, Complex2 : ComplexType;
var Result : ComplexType);
{   Divides two complex numbers.

Pre Condition:  Complex1 and Complex2 are defined;
Post Condition:  Result contains the quotient of Complex1 and Complex2
}

var tmp1, tmp2 : real;  {temporary variables}

begin   {DivideComplex}

Tmp1 := sqr(Complex2.RealPart) + sqr(Complex2.ImaginaryPart);
Tmp2 := (Complex1.RealPart * Complex2.RealPart +
Complex1.ImaginaryPart * Complex2.ImaginaryPart)/Tmp1;
Result.ImaginaryPart := (Complex1.ImaginaryPart * Complex2.RealPart +
Complex1.RealPart * Complex2.ImaginaryPart)/Tmp1;
Result.RealPart := tmp2;
end;   {DivideComplex}

begin  {driver}
write('Enter Real Part of a:      ');
write('Enter Imaginary Part of a: ');
writeln;

write('Enter Real Part of b:      ');
write('Enter Imaginary Part of b: ');
writeln;

write('Sum is ');
OutputNumber(Result);

MultiplyComplex(Complex1,Complex2,Result);
write('Product is ');
OutputNumber(Result);

DivideComplex(Complex1,Complex2,Result);
write('Quotient is ');
OutputNumber(Result);

writeln('Magnitude of a is ',Magnitude(Complex1):0:4);
writeln('Magnitude of b is ',Magnitude(Complex2):0:4);
end.  {driver}
```