Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Квадратное уравнение 2


Автор: Voventus 7.12.2004, 14:42
А теперь моя прога.
Код


program my;
var a, b, c:real;
     x1, x2, x:real;
     D:real;
begin
writeln('Решение квадратного уравнения ax^+bx+c');
writeln('Введите a');
readln(a);
writeln('Введите b');
readln(b);
writeln('Введите с');
readln;
D:=sqr(D)-4*a*c;
if D>0 then
         begin
         x1:=(-b-sqrt(D))/(2*a);
         x2:=(-b+sqrt(D))/(2*a);
         writeln('x1=', x1);
         writeln('x2=', x2);
end;
if D=0 then
         begin
         x:=-b/(2*a);
         writeln('x=', x);
end;
if D<0 then writeln('Решений нет!');
readln;
end.

Автор: Akina 7.12.2004, 14:55
В программе имеется ошибка. Если не найдешь сам - то это ошибка в генах.

PS. Ввод копирайта мне тоже понравился...

Автор: Dayana 7.12.2004, 14:55
Voventus, а в где вопрос?
Добавлено @ 14:58
Akina, в программе ни одна ошибка...

Автор: Fedor 7.12.2004, 16:22
Цитата(Voventus @ 7.12.2004, 13:42)
D:=sqr(D)-4*a*c;

!!!!
Эта строчка сразу в двух местах - источник бед

Автор: Zero 7.12.2004, 18:06
Цитата(Morpheus @ 7.12.2004, 16:22)
сразу в двух местах - источник бед

А почему в двух местах, помоему он просто опечатался в одном месте???
D ─> b smile

Автор: Akina 7.12.2004, 18:37
Zero
Возникает вопрос - он что, текст в окне темы тюкал? что-то я засомневался. Занчит, копировал. А раз так, и в тексте есть ошибки - то не проверял либо работу программы, либо выдаваемые ею результаты... скорее ляпа таки в генах...

Я уж не говорю о том что если 2 решения совпадают - их можно вывести один раз, ладно, но при наличии комплексных корней говорить что их нет вообще - сакс.

Ну и груда логических и алгоритмических ляпов. Что будет, если а=0? что будет, если b*b не помещается в real?

а интерфейс...

Автор: Voventus 7.12.2004, 18:44
Akina! Да, действительно в окне тюкал тюкал! smile
Если a=0, то уравнение типа ax^+bx+c=0 - уже НЕ квадратное, а линенйное!!!!!
Я думаю, что никому не придет в голову решать уравнение типа 3x+3=0 через дискриминант. smile

Автор: Akina 7.12.2004, 18:56
ну-ну...

Цитата(Voventus @ 7.12.2004, 19:44)
Я думаю, что никому не придет в голову решать уравнение типа 3x+3=0 через дискриминант.

Больше никогда так не думай.

Например: ты сделал алгоритм чего-то и реализовал его программно. В данном случае решение квадратного уравнения. Кто-то берет твой алгоритм и превращает его в процедуру, заменив ввод исходных данных из командной строки на передачу параметров, и использует в своей программе. Все что надо соблюдено, имена-типы... однако в процессе работы часть передаваемых подпрограмме уравнений оказывается вырожденной, в результате у человека программа падает или того хуже - глючит. А кто ему в карман нагадил?

Не хочешь делать хорошо - не делай вообще. Или делай, но никому не рассказывай, пока не сделаешь хорошо. ИМХО.

Автор: Zero 7.12.2004, 19:21
Цитата(Morpheus @ 7.12.2004, 16:22)
сразу в двух местах - источник бед

Ещё раз, почему в двух местах, я что-то непонял???

Автор: Fedor 7.12.2004, 20:11
Цитата(Akina @ 7.12.2004, 17:37)
но при наличии комплексных корней говорить что их нет вообще - сакс.

между прочем, в средней школе так и делают. Или ты учил комплексные числа в школе?

Цитата(Akina @ 7.12.2004, 17:37)
если b*b не помещается в real?
а интерфейс...

Не грузи человека!:) Скорее всего, на этом примере они учат основы Паскаля - операции с действительными числами, условия. А ты интерфейс...

Цитата(Zero @ 7.12.2004, 18:21)
почему в двух местах

smile в одном, в одном. Я затупил. Забыл формулу дискриминанта. Переучил матанализ... smile

Автор: geckelberryfinn 7.12.2004, 23:11
Цитата(Voventus @ 7.12.2004, 14:42)
-b+sqrt(D)/(2*a)


Если я не ошибаюсь, то должно быть так

Код

(-b+sqrt(D))/(2*a);


А вообще давно уже вручную не считал smile

Автор: Voventus 8.12.2004, 06:52
Akina, РАЗ УЖ ВЫ НАСТАИВАЕТЕ, то тгда вот:
Код


program Quad;

Var
A,B,C,D: Double;
S: String;
Done: Boolean;
begin
Repeat
WriteLn('Программа решения квадратного уравнения A*x^2+B*x+C=0');
Write('Введите A: '); ReadLn(A);
Write('Введите B: '); ReadLn(B);
Write('Введите C: '); ReadLn(C);
WriteLn;
WriteLn('Решение:');

If A=0 Then Begin
If B=0 Then Begin
If C=0 Then Begin
WriteLn('x - любое число');  
End Else Begin
WriteLn('Корней нет');
End;
End Else Begin
WriteLn('x=',-C/B);  
End;
End Else Begin
D:=B*B-4*A*C;
If D=0 Then Begin
WriteLn('x=',-B/2/A);  
End Else Begin
If D>0 Then Begin
WriteLn('x1=',(-B+sqrt(D))/2/A);  
WriteLn('x2=',(-B-sqrt(D))/2/A);
End Else Begin
WriteLn('x1=',-B/2/A,'+i*',sqrt(-d)/2/Abs(A));  
WriteLn('x2=',-B/2/A,'-i*',sqrt(-d)/2/Abs(A));
End;
End;
End;

WriteLn;
Write('Решить ещё одно уравнение? (y/n) '); ReadLn(S);
Done:=(S<>'y');
Until Done;
end.

Автор: Zero 8.12.2004, 10:24
А я запетил ещё одну ошибку, коментарии в паскале через дробь не разрешены... smile

Автор: Voventus 8.12.2004, 11:55
Zero да это чтобы вам было понятно!

Автор: Zero 8.12.2004, 18:20
Да мне то понятно, это я так к слову smile

Автор: Spaun 8.12.2004, 22:28
Voventus

Код

writeln('Введите с');
readln;


должно быть

Код

writeln('Введите с');
readln(с);


Автор: Voventus 9.12.2004, 07:03
Spaun да вы про первую прогу забудьте, смотрите вторую!

Автор: Fedor 9.12.2004, 16:20
Voventus Так задача решена уже? Проблемы остались?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)