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

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

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

 
 Ответить  Открыть новую тему 
> Решение квадратного ур-я Помогите, необходима помощь
Иван2512
сообщение 19.01.2013 20:18
Сообщение #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 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 19.01.2013 21:24
Сообщение #2


Бывалый
***

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

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


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



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

Сообщение отредактировано: Федосеев Павел - 19.01.2013 21:29
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Иван2512
сообщение 19.01.2013 22:00
Сообщение #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 
 К началу страницы 
+ Ответить 
Федосеев Павел
сообщение 20.01.2013 0:36
Сообщение #4


Бывалый
***

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

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


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

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

 



- Текстовая версия 29.03.2024 16:18
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"