Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Delphi _ Решение квадратного уравнения

Автор: Искатель 26.12.2010 0:36

Здравствуйте!
С вашего позволения попрошу у вас совета в решении такой проблемы:
Моя программа (в Делфи), вычисляет корни квадратного уравнения.
Я затрудняюсь с добавлением этой проверки: if d=0 then...
Подскажите, как правильно это вписать?
И если можно, помогите с кнопочкой "Очистка", не представляю как её запрограммировать.



Прикрепленные файлы
Прикрепленный файл  ___________.______._____________________.rar ( 213.83 килобайт ) Кол-во скачиваний: 280

Автор: -TarasBer- 26.12.2010 1:17

Я просмотрел код unit1.pas в блокноте, ничего не понял.
Что за Button1, Edit1?
Почему нельзя давать компонентам человеческие имена?
Проверка на то, что дискриминант нулевой, выглядит так: if abs(d) < eps then ...
В качестве eps напиши что-то типа 1E-10
Это всё (вместо простого сравнения с нулём) из-за того, что погрешности вычислений могут привести к некоторому отклонению. Короче, прямо сравнивать вещественные числа нельзя.
Очистка что должна делать? Если очищать поля ввода, то просто пиши labelResult.Caption := '';

Автор: Искатель 26.12.2010 15:28

Спасибо!
Я в корне переделал код программы (это требование преподавателя!).
Она сделана на трёх формах и вроде бы работает. Не пойму только, почему вычисляет результаты неправильно.
Подскажите, пожалуйста, есть в ней ошибка?


Прикрепленные файлы
Прикрепленный файл  Projects.rar ( 221.58 килобайт ) Кол-во скачиваний: 325

Автор: Гость 26.12.2010 16:24

Ну блин.

((-b)+Sqrt(D))/2*a

Вот везде скобок наставил, кроме там, где нужно.

(-b+Sqrt(D))/(2*a)

И назови компоненты нормально (поле Name).

Автор: -TarasBer- 26.12.2010 16:27

Да у тебя вообще в обработчике кнопки логика неверная.
Если дискриминант меньше нуля, то зачем показывать вторую форму?
И зачем показывать форму до изменения её содержимого?

Поменяй тот кусок на



if D<0 then form3.show
else begin
form2.panel1.caption:=FloatTostr(((-b)+Sqrt(D))/(2*a));
if abs(D) < 1E-9 then form2.panel2.caption:= ''
else form2.panel2.caption:=FloatTostr(((-b)-Sqrt(D))/(2*a));
form2.show;
end;



Автор: Искатель 26.12.2010 17:39

Черт побери! До чего же приятно иметь дело с профессионалами!!! Супер! Работает как надо!

Уважаемые профи! Ну не понимаю я смысл этой строки, хоть убей: if abs(D) < 1E-9 then form2.panel2.caption:= ''.
Если преподаватель будет спрашивать что означает сие, мне останется только блеять или мычать.
Объясните, пожалуйста

Автор: volvo 26.12.2010 17:52

Цитата
мне останется только блеять или мычать
Не надо ни мычать, не блеять... Из-за погрешности представления вещественных чисел (Гугл знает об этом, если что), нельзя два вещественных числа сравнивать напрямую (оператором "="). Нужно проверить, не превышает ли модуль их разности некоего маленького значения. Вот ты и проверяешь модуль дискриминанта: если он меньше одной миллиардной (10-9), то можно в данном случае его считать нулем.

Автор: Искатель 26.12.2010 18:01

Спасибо! Если что, так и объясню. Представляю какие глаза будут у препода! Думаю он про это не знает!

Автор: Искатель 23.05.2011 12:26

Класс

Автор: TarasBer 23.05.2011 13:24

Так вставило, что до сих пор не отпустило?

Автор: Искатель 23.05.2011 21:11

Да нет, извините. Не в этом дело. Просто в одной из своих тем, хотел удалить кое-какой документ, являющийся коммерческой тайной, но видимо это невозможно. А тут просто хотел проверить, а оно вон как вышло.

Автор: TarasBer 24.05.2011 9:44

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

Автор: Искатель 24.05.2011 15:40

Грубо

Автор: Lapp 24.05.2011 23:30

Цитата(Искатель @ 24.05.2011 16:40) *
Грубо

Искатель, ты зря принял это на свой счет. TarasBer просто сказал тебе причину, по которой время редактирования собственных мессаджей было сокращено до 8 часов (с начального в несколько дней), он не имел в виду тебя. И, кстати, он не совсем точно выразился - таких "придурков" не много, но они все же есть (прецеденты были).

Главный момент такой: написанный тобой мессадж принадлежит не тебе, а форуму. Редактирование - только для исправления опечаток и т.п. Всегда рекомендуется подумать, прежде чем отправить пост. И уж конечно, не следует помещать в него важную информацию для ограниченного круга лиц. В случае, если такое все же произошло (по недомыслию), советую обратиться к Администрации форума.

Автор: TarasBer 25.05.2011 9:25

> прециденты

Автор: Lapp 25.05.2011 10:42

Цитата(TarasBer @ 25.05.2011 10:25) *
> прециденты

спасибо, исправил, +1

Не ошибается тот, кто ничего не делает ))
Не подумай, что это про тебя, Тарас - у тебя алиби:
> .. которые сначала создаёт тему, ..
smile.gif