Где ошибка?

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Где ошибка?

Re: Где ошибка?

ivan! » 16 июл 2009, 23:22

Давай сначала решим аналитически:
Изображение
Значит, количество корней зависит от двух условий - что дискриминант больше, меньше или равен нулю и что все подкоренное выражение б, м или р нулю.
] D - дискриминант; t1,t2 - корни
Тогда условия на корни выглядят так:
4 корня: D > 0 and t1 > 0 and t2 > 0
3 корня: D > 0 and (t1 > 0 and t2 = 0 or t1 = 0 and t2 > 0)
2 корня: D = 0 and t1 > 0
1 корень: D = 0 and t1 = 0
0 корней: D = 0 and t1 < 0 or D < 0 or D > 0 and t1 < 0 and t2 < 0

Код: Выделить всё

procedure solve(a,b,c: real; var count: integer; var roots: array of integer);
var
  D, sD: real;
  t1, st1: real;
  t2, st2: real;
begin
  D:= b*b - 4 * a * c;
  if D > 0 then
  begin
    sD:= sqrt(D)
    t1:= 0.5 * (-b + sD) / a;
    t2:= 0.5 * (-b - sD) / a;
    if t1 > 0 and t2 > 0 then
    begin
      count:= 4;
      st1:= sqrt(t1);
      st2:= sqrt(t2);
      roots[1]:= st1;
      roots[2]:= -st1;
      roots[3]:= st2;
      roots[4]:= -st2;  
    end else
    if t1 > 0 and t2 = 0 then
    begin
      count:= 3;
      st1:= sqrt(t1);
      roots[1]:= st1;
      roots[2]:= -st1;
      roots[3]:= 0;
    end else
    if t1 = 0 and t2 > 0 then
      count:= 3;
      st2:= sqrt(t2);
      roots[1]:= 0;
      roots[2]:= st2;
      roots[3]:= -st2;
    end else count:= 0;
  end else
  if D=0 then
  begin
    t1:= -0.5 * b / a;
    if t1 > 0 then
    begin
      count:= 2;
      st1:= sqrt(t1);
      roots[1]:= st1;
      roots[2]:= -st1;
    end else
    if t1 = 0 then
    begin
      count:= 1;
      roots[1]:= 0;
    end else
      count:= 0;
  end else
    count:= 0;
end;
Не уверен, что будет работать, но я старался :) писал прямо здесь, в форуме :) поэтому не компилировал :)

Где ошибка?

Conner » 15 июл 2009, 18:26

Задание.
Заданы коэффициенты а,б и ц биквадратного уравнения ax4+bx2+c=0.Найти все его действительные корни.

Программа вроде работает,но всегда в ответе выводит 2 корня один из которых (х2) всегда равен 0 :/ Чую что-то не то с кодом...

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var a,b,c,D,x1,x2,x3,x4,y1,y2:real;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
c:=StrToFloat(Edit3.Text);
D:=sqr(b)-4*a*c;
if D<0 then
Label5.Caption:='v uravnenii' +chr(13)+'net dejstvitelnix kornej'
else
begin
y1:=(-b+sqrt(D))/(2*a);
y2:=(-b-sqrt(D))/(2*a);
if (y1<0) and (y2<0) then
Label5.Caption:='V uravnenii' +chr(13)+'net dejstvitelnix kornej'
else
if (y1>=0) and (y2>=0) then
begin
x1:=sqrt(y1);
x2:=(-x1);
x3:=sqrt(y2);
x4:=(-x3);
Label5.Caption:='X1 ='+FloatToStr(x1)+chr(13)+'X2 ='+FloatToStr(x2)+chr(13)+'X3 ='+FloatToStr(x3)+chr(13)+'X4 ='+FloatToStr(x4);
end
else if (y1>=0) then
begin
x1:=sqrt(y1);
x2:=(-x1);
Label5.Caption:='X1 ='+FloatToStr(x1)+chr(13)+'X2 ='+FloatToStr(x2);
end
else if (y2>=0) then
begin
x1:=sqrt(y2);
x2:=(-x1);
Label5.Caption:='X1 ='+FloatToStr(x1)+chr(13)+'x2 ='+FloatToStr(x2);

end;
end;
end;
end.
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
С 0 разобрался,а вот почему не выводит 4 корня?

Вернуться к началу