![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Иван2512 |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 2 Пол: Мужской Репутация: ![]() ![]() ![]() |
Всем здрасьте)
от меня требуется решить квадратное уравнение со следующим условием 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 не могу понять, в чем дело. Прошу помочь, зараннее благодарен)) |
Федосеев Павел |
![]()
Сообщение
#2
|
Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 481 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
К пониманию можно пойти двумя путями.
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
В дальнейшем для большей наглядности можно перенести код решения кв. ур. в процедуру и вызывать её. Тогда будет видна структура программы. Сообщение отредактировано: Федосеев Павел - |
Иван2512 |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 2 Пол: Мужской Репутация: ![]() ![]() ![]() |
Подправил код на такой:
Код 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. Опять не могу понять, где проблема( Кто может, помогите. |
Федосеев Павел |
![]()
Сообщение
#4
|
Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 481 Пол: Мужской Реальное имя: Федосеев Павел Репутация: ![]() ![]() ![]() |
Если у тебя FPC - добавь в начале программы строки
uses Это даст вывод в консольном окне номера строки с ошибкой. Далее - прочти в "user.pdf" описание ошибки с кодом 200. Совмести мысленно текст строки и описание ошибки. И в результате медитаций увидишь, что всему виной экономия на объявлении переменных (или неверный способ их использования - можно корни записывать сразу в x и x1, а потом сравнить и при необходимости поменять местами). x := (sqrt(d)-b)/(2*a); |
![]() ![]() |
![]() |
Текстовая версия | 8.09.2024 8:30 |