{* * @(#) s_c_equ.pas - Program for solving square equations with * complex coefficients. * (c) 1994 Ivan Maidanski http://ivmai.chat.ru * Freeware program source. All rights reserved. ** * Language: Turbo Pascal * Tested with: Turbo Pascal v7.0 * Last modified: 1994-11-30 17:05:00 GMT+03:00 *} program ComplexSquareEquation; {$E+,N+} type TReal= Extended; type TCmpNum= record Re,Im: TReal end; function EqualZeroNum(A: TCmpNum): Boolean; begin EqualZeroNum:=(A.Re=0) and (A.Im=0) end; procedure AddNum(A,B: TCmpNum; var Res: TCmpNum); begin Res.Re:=A.Re+B.Re; Res.Im:=A.Im+B.Im end; procedure SubNum(A,B: TCmpNum; var Res: TCmpNum); begin Res.Re:=A.Re-B.Re; Res.Im:=A.Im-B.Im end; procedure MulNum(A,B: TCmpNum; var Res: TCmpNum); var V: TReal; begin V:=A.Re*B.Im+A.Im*B.Re; Res.Re:=A.Re*B.Re-A.Im*B.Im; Res.Im:=V end; procedure DivNum(A,B: TCmpNum; var Res: TCmpNum); var V,U: TReal; begin V:=Sqr(B.Re)+Sqr(B.Im); U:=(A.Im*B.Re-A.Re*B.Im)/V; Res.Re:=(A.Re*B.Re+A.Im*B.Im)/V; Res.Im:=U end; procedure SqRtNum(A: TCmpNum; var Res: TCmpNum); var V: TReal; begin V:=Sqrt(Sqr(A.Re)+Sqr(A.Im)); Res.Im:=Sqrt((V-A.Re)/2); Res.Re:=Sqrt((V+A.Re)/2) end; procedure WriteNum(A: TCmpNum); begin Write('(',A.Re); if A.Im>=0 then Write('+'); WriteLn(A.Im,'*I)') end; procedure ReadNum(var A: TCmpNum); begin Read(A.Re,A.Im) end; var A,B,C: TCmpNum; const Zero: TCmpNum = (Re: 0; Im: 0); const Two: TCmpNum = (Re: 2; Im: 0); procedure Init; begin Write('Enter A: '); ReadNum(A); Write('Enter B: '); ReadNum(B); Write('Enter C: '); ReadNum(C) end; procedure NoSolvation; begin WriteLn('This equation has no solvation.') end; procedure AnySolvation; begin WriteLn('X <= C (any number)') end; procedure OneSolvation; begin DivNum(C,B,C); SubNum(Zero,C,C); Write('X= '); WriteNum(C) end; procedure TwoSolvations; begin DivNum(B,A,B); DivNum(C,A,C); DivNum(B,Two,B); SubNum(Zero,B,B); MulNum(B,B,A); SubNum(A,C,A); if EqualZeroNum(A) then begin Write('X1,X2= '); WriteNum(B) end else begin SqRtNum(A,A); Write('X1= '); AddNum(B,A,C); WriteNum(C); Write('X2= '); SubNum(B,A,C); WriteNum(C) end end; begin Init; if EqualZeroNum(A) then if EqualZeroNum(B) then if EqualZeroNum(C) then AnySolvation else NoSolvation else OneSolvation else TwoSolvations; WriteLn end.