Решение квадратного ур-я Помогите, необходима помощь |
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 не могу понять, в чем дело. Прошу помочь, зараннее благодарен)) |
Федосеев Павел |
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); и факта вывода на экран значения -1. Т.е. в самом начале программа определяет вариант (-1), но продолжает считать по некорректной в данной ситуации формуле. То же самое происходит и при вводе варианта (1). Думаю, что нужно чуть изменить структуру программы так, чтобы после определения вариантов (-1), (1) и (0) не выполнялся расчёт по формуле квадратного уравнения. По-быстрому это или 1) поставить Exit после обработки вариантов (-1), (1) и (0)
2) Заключить все вычисления корней кв. ур. в ветку Else для условия If a=0 Then
В дальнейшем для большей наглядности можно перенести код решения кв. ур. в процедуру и вызывать её. Тогда будет видна структура программы. Сообщение отредактировано: Федосеев Павел - 19.01.2013 21:29 |
Иван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. Опять не могу понять, где проблема( Кто может, помогите. |
Федосеев Павел |
20.01.2013 0:36
Сообщение
#4
|
Бывалый Группа: Пользователи Сообщений: 298 Пол: Мужской Реальное имя: Федосеев Павел Репутация: 8 |
Если у тебя FPC - добавь в начале программы строки
uses Это даст вывод в консольном окне номера строки с ошибкой. Далее - прочти в "user.pdf" описание ошибки с кодом 200. Совмести мысленно текст строки и описание ошибки. И в результате медитаций увидишь, что всему виной экономия на объявлении переменных (или неверный способ их использования - можно корни записывать сразу в x и x1, а потом сравнить и при необходимости поменять местами). x := (sqrt(d)-b)/(2*a); |
Текстовая версия | 29.03.2024 16:18 |