Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Как получить в ответе комплексное число?

Автор: Awe 14.09.2006 3:54

Всем здрасте! smile.gif

вот прочитал FAQ, поискал на форумах... но все-равно че-та не догнал...

Вот как мне допустим в результате вычислений получит комплексное число???

например переменная Д есть дисскриминант, и вот если он меньше нуля.....

Заранее спасибо! smile.gif

Автор: volvo 15.09.2006 22:39

Вот пример решения квадратного уравнения с получением комплексных корней:

Type
{ Этот тип используется для указания, является ли корень действительным или комплексным }
T = (_real, _complex);

{ Это - структура для работы с любыми корнями }
ResType = record
case style: T of
_real : (r: real);
_complex: (re, im: real);
end;

{ Процедура, печатающая число как действительное или комплексное, в зависимости от поля style }
Procedure Print(X: ResType);
Const sign: Array[Boolean] Of Char = ('-', '+'); { Для отображения знака числа }
Begin
Case X.style Of
_real : WriteLn(X.r:10:5);
_complex: WriteLn(X.re:10:5, ' ' + sign[X.im > 0], Abs(X.im):10:5, ' * i');
End;
End;

Const
Epsilon = 1.0E-10;
maxDistance = 1.0E+07;

{
Сама функция решения квадратного уравнения взята из

FAQ: Решение уравнений различных степеней

и немного подправлена ...
}
Function solveQuadratic(Var x: Array Of Double;
Var y: Array Of ResType): Byte;
Var
a, b, c, Desc: Double;
T: Double;
Begin
a := x[0]; b := -x[1]; c := x[2];
If a = 0 Then
Begin
solveQuadratic := 0;
If b = 0.0 Then Exit;

solveQuadratic := 1;
y[0].style := _real;
y[0].r := c / b; Exit
End;

solveQuadratic := 0;
Desc := Sqr(b) - 4 * a * c;
If Desc < 0.0 Then Begin

{ 2 комплексных корня }
solveQuadratic := 2;
{ Первый }
y[0].style := _complex;
y[0].re := b / (2 * a); y[0].im := - Sqrt(Abs(Desc)) / (2 * a);
{ Второй }
y[1].style := _complex;
y[1].re := b / (2 * a); y[1].im := + Sqrt(Abs(Desc)) / (2 * a);
Exit;

End
Else
If Abs(Desc) < Epsilon Then
Begin
solveQuadratic := 1;
y[0].style := _real;
y[0].r := 0.5 * b / a;
Exit
End;

Desc := Sqrt(Desc);
T := 2 * a;
y[0].style := _real;
y[0].r := (b + Desc) / T;
y[1].style := _real;
y[1].r := (b - Desc) / T;
solveQuadratic := 2
End;


Const
{ Уравнение: X^2 + 2*X + 3 = 0 }
ax: Array[0 .. 2] Of Double = (1, 2, 3);

Var
ay: array[0 .. 2] Of ResType;
roots, i: Integer;

Begin
roots := solveQuadratic(ax, ay);
Writeln( 'number of roots = ', roots );

{ Печатаем корни }
For i := 0 To Pred(roots) Do Begin
WriteLn( 'root #', i + 1, ' = '); Print(ay[i]);
End;
End.


P.S. В следующий раз не задавай вопросы в FAQ, для этого есть раздел "Задачи"