Помощь - Поиск - Пользователи - Календарь
Полная версия: Решение квадратного ур-я Помогите
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Иван2512
Всем здрасьте)
от меня требуется решить квадратное уравнение со следующим условием
1)в действительных числах
2) если корня два то вывести их в порядке возрастания

и главное:
На входе три числа: a,b,c

Выдать
-1 если решений уравнения бесконечно много
0 если решений нет
1 если уравнение стало линейным выдать х
2 если квадратное уравнение с двумя корнями, выдат х1 и х2 по возрастанию
3 если у квадратного ур-я крвтные корни и выдать х

числа -1; 0; 1; 2; 3; являются кодами их нужно вывести вместе с корнями или же без таковых.

мною был написан следующий код

Var
a,b,c,x,x1,d:Real;
Begin
Readln(a,b,c);
If a=0 then
Begin
If b=0 then
If c=0 then
Writeln('-1')
else
Writeln('0')
Else
Begin
x:=c/b;
Writeln('0 ',x:0:2);
End;
End;
d:=sqr(b)-4*a*c;
If d>=0 then
Begin
If d=0 then
begin
x:=-b/(2*a);
Writeln('3 ',x:0:2);
end
else
begin
a:=(sqrt(d)-b)/(2*a);
b:=(-sqrt(d)-b)/(2*a);
If a>b then
begin
x:=a;
x1:=b;
end
else
begin
x:=b;
x1:=a;
end;
Writeln('2 ',x:0:2,' ',x1:0:2);
end;
end
Else
Writeln('0');
Readln
End.

но при вводе 0;0;0 вылетает с ошибкой exitcod=207

не могу понять, в чем дело.
Прошу помочь, зараннее благодарен))
Федосеев Павел
К пониманию можно пойти двумя путями.
1) Открываем "user.pdf" (документация к FreePascal) и читаем:
Цитата
207 Invalid floating point operation Can occur if you try to calculate the square root or logarithm
of a negative number.

2) Просто помедитировать о варианте 0-0-0 в свете формулы
a:=(sqrt(d)-b)/(2*a);
b:=(-sqrt(d)-b)/(2*a);

и факта вывода на экран значения -1.

Т.е. в самом начале программа определяет вариант (-1), но продолжает считать по некорректной в данной ситуации формуле.
То же самое происходит и при вводе варианта (1).

Думаю, что нужно чуть изменить структуру программы так, чтобы после определения вариантов (-1), (1) и (0) не выполнялся расчёт по формуле квадратного уравнения.
По-быстрому это или
1) поставить Exit после обработки вариантов (-1), (1) и (0)

If a=0 Then
Begin
If b=0 Then
If c=0 Then
Begin
Writeln('-1');
Exit; <---------
End
Else
Begin
Writeln('0');
Exit; <---------
Exit;
Else
Begin
x := c/b;
Writeln('0 ',x:0:2); <------ здесь разве 0?
Exit; <---------
End;
End;

2) Заключить все вычисления корней кв. ур. в ветку Else для условия If a=0 Then

If a=0 Then
Begin
...........................
End
Else
Begin
d := sqr(b)-4*a*c;
If d>=0 Then
.......................................
End;
ReadLn;



В дальнейшем для большей наглядности можно перенести код решения кв. ур. в процедуру и вызывать её. Тогда будет видна структура программы.
Иван2512
Подправил код на такой:
Код

Var
a,b,c,x,x1,d:Real;
  Begin
   Readln(a,b,c);
   If a=0 then
    Begin If b=0
    then If c=0 then
     Writeln('-1')
      else
       Writeln('0')
       Else
        Begin
         x:=c/b;
          Writeln('3 ',x:0:2);
           End;
            end
             Else
             Begin
             d:=sqr(b)-4*a*c;
              If d>=0 then
              Begin
              If d=0 then
               begin
                x:=-b/(2*a);
                 Writeln('3 ',x:0:2);
                  end
                   else
                   begin
                    a:=(sqrt(d)-b)/(2*a);
                     b:=(-sqrt(d)-b)/(2*a);
                      If a>b then
                       begin
                        x:=a;
                         x1:=b;
                         end
                          else
                          begin
                           x:=b;
                           x1:=a;
                            end;
                            Writeln('2 ',x:0:2,' ',x1:0:2);
                             end;
                             end
                             Else
                              Writeln('0');
                              End;
                               End.



Так теперь вылет при а<>0 , b<>0 , а с=0.
Опять не могу понять, где проблема(
Кто может, помогите.
Федосеев Павел
Если у тебя FPC - добавь в начале программы строки
uses
HeapTrc, LineInfo; {для отладки}

Это даст вывод в консольном окне номера строки с ошибкой.
Далее - прочти в "user.pdf" описание ошибки с кодом 200.
Совмести мысленно текст строки и описание ошибки.

И в результате медитаций увидишь, что всему виной экономия на объявлении переменных (или неверный способ их использования - можно корни записывать сразу в x и x1, а потом сравнить и при необходимости поменять местами).
        x := (sqrt(d)-b)/(2*a);
x1 := (-sqrt(d)-b)/(2*a);
If x1>x Then
Begin
d := x; \
x := x1; |------> Swap(x, x1);
x1:=d; /
End;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.