IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Решение квадратного ур-я Помогите, необходима помощь
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Всем здрасьте)
от меня требуется решить квадратное уравнение со следующим условием
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

не могу понять, в чем дело.
Прошу помочь, зараннее благодарен))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


К пониманию можно пойти двумя путями.
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;



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

Сообщение отредактировано: Федосеев Павел -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Подправил код на такой:
Код

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.
Опять не могу понять, где проблема(
Кто может, помогите.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Знаток
****

Группа: Пользователи
Сообщений: 481
Пол: Мужской
Реальное имя: Федосеев Павел

Репутация: -  9  +


Если у тебя 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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 25.04.2024 22:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name