Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите понять метод Парсера.


Автор: Vad 23.11.2004, 20:47
Как я понял тут надо юзать Парсинг, но вот как его юзать я понять не могу, плз кто имел дело с этим помогите.
Надо сделать так чтобы когда пользователь вводил функцию(она может быть обсолюьно любая) то она просчитывалась с пдоставлением чисел в место переменых например от 1 до 100. Или как там график чертиться smile Я еще просто не пробовал график чертить.
Спасибо за внимание.

Автор: Yanis 23.11.2004, 21:05
Во первых:
http://www.codenet.ru/
Раздел: компиляторы.

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

Автор: Vad 23.11.2004, 21:08
Спасибо, и если найдешь калькулятор этот пришли на мыло мне плз. [email protected].
Только я не могу понять в разделе компиляторы что смотреть??

Автор: Vad 23.11.2004, 21:24
Народ ну помогите плз smile smile smile

Автор: Guest 23.11.2004, 22:12
Vad Ну как чего смотреть? смотреть нада как устроены компиляторы потому что у тебя задача сходная с тем что приходится делать компилятору при трансляции программ из кода языка в машинный код...

Автор: Vad 23.11.2004, 22:21
Е мое, во тчо я ввязался, надо разобраться, наверняка времени много уйдет, а тут еще и 9 класс экзамены smile Ну ничего прорвемся!! Народ у кого есть примерчики Скиньте сюда плз! smile
За ранее благодарен!

Автор: Vad 24.11.2004, 14:28
ау люди добрые, помогите мне ламеру плз smile

Автор: dm9 24.11.2004, 14:58
Из этой программы я выдирал модуль рассчёта выражения по формуле.
Принцип такой. Задаёшь формулу, задаёшь что чему равно и он выдаёт ответ. То, что тебе надо. Придётся 10 минут покопаться в чужих исходниках, у меня программа с использованием этого модуля пропала smile
Не разберёшься - пиши smile

Авторство неизвестно, качалось с delphimaster.ru.

PS По какой-то причине Кладовка на delphimaster.ru закрыта, поэтому авторство восстановить не удастся smile

PPS У автора особое чувство юмора, не забудь мессаги исправить, которые появляются при ошибках smile

PPPS Поддерживаются функции:
sin, cos, exp, ln, tg, lg, max, min, log, ctg, ^, %.

Автор: Vad 26.11.2004, 23:49
че то я не розабрался, не пойму че такое j ^( Да и ваще код не очеьн понятен smile

Автор: dm9 27.11.2004, 00:07
А если посидеть часок и поразбираться?

Автор: Vad 27.11.2004, 00:30
сидел , не очень то понятнО smile

Автор: dm9 27.11.2004, 00:58
Эх, блин... курс молодого бойца. Как использовать чужой код.

Этап A. Разведка
Запускаем программу. Смотрим, что она делает.
Что-то считает, стопудово. Видим внизу циферки: N=6 000 000 000, A=40.
Изображаем из себя дурачка - вводим в строку "Y" (без кавычек). И - надо же, какое чудо! Там появляется типа ответ: 150000000. А что, если ввести такое: "Y^2+500*Sin(d)". Ты смотри-ка, выдал ответ! Значит, эта штуковина действительно умеет считать формулы!!! КРУТО! Убедившись, что придурок из форума нас не обманул, и эта программа действительно делает что надо, приступаем к этапу B.

Этап B. Погружение
Открываем исходники. Программа для открывания - Delphi. Блокнот - это следующий этап. Файл cal.dpr. Тыкаем Ctrl+F12 и выделяем там все файлы. Enter. Исходники открыты. Тыкаем Shift+F12. Выделяем единственную строчку. Enter. Форма проекта открыта. Всё. Можно приступать к процессу. Замечаем, что вычисление происходит при нажатии на кнопку "Вычислить". Смотрим обработчик этого события (нажав на этот самый пункт меню). Видим код. Процедура из целых семи строчек. Подумать только, здесь и есть всё, что нам надо!!! Как я пришёл к этому выводу? А очень просто. Здесь есть строчка "c:=TCalculator.Create;". Это означает создание объекта. Каков тип объекта? Класс, если хотите? TCalculator, конечно! Процесс инициализации, или настройки, если по-деревенски, обычно происходит ПОСЛЕ создания объекта. Только после создания заполняются поля и вызываются методы. Поскольку создание объекта происходит здесь, значит, и инициализация здесь же. Смотрим, как происходит эта инициализация. АГА, НАШЛИ! Мы проходимся по строкам TMemo (цикл) и выполняем "c.AddParam(memo.Lines[i]);"! То есть строку из Memo добавляем методом AddParam! Хорошо, но так мы зададим только дополнительные правила для вычисления выражения. Например, "X=14", "R=4", "D=X+R". Но где само выражение, которое надо вычислить? А это не следующая строчка? А как начать вычисление и получить ответ? Наверное, это метод GetValue(value)?

Этап C. Переносим чужой код в наше приложение
Здесь надо посмотреть, какие используются модули. Намёк - основной модуль прописан после строчки "implementation" файла main.pas, а затем надо посмотреть, какие файлы использует этот модуль.
Копируем файлы к себе, подключаем их (uses), затем пишем то, что мы узнали:
c := TCalculator.Create;
c.AddParam ('X=4');
c.AddParam ('Y=5');
c.Expression := 'X+Y';
b := c.getValue (value).
c.Free;

Контрольный вопрос - где будет ответ, в b или в value, и каких они типов (смотреть в модуле, содержащем класс TCalculator, то есть Calculator.pas)?

Не забывай вызывать Free, хотя автор этого и не делает - хорошая привычка всегда освобождать за собой память.

Домашее задание - добавить к списку поддерживаемых функций функцию ch(x), равную 0.5(exp(x)+exp(-x)) и sh(x), равную 0.5(exp(x)-exp(-x)) smile

Если что непонятно - с удовольствием отвечу, но готовое решение выкладывать не буду, так как у меня правило: с 25 числа каждого месяца не выкладывать готовые решения...

Автор: Vad 27.11.2004, 22:08
Если не разберусь до 1 декабря выложишь??

Автор: dm9 27.11.2004, 23:10
Ты разбирайся, разбирайся smile
Что непонятно - спрашивай, отвечу.
Решение не выложу smile
Добавлено @ 23:13
Если после моих указаний не разберёшься, будет странно smile
Если, конечно, тебе это действительно надо.
Добавлено @ 23:17
Вернее, не так. Готовое решение я УЖЕ выложил, тебе осталось только это понять smile

Автор: Гость_Vad 5.12.2004, 22:57
Там функций много не понятных ( smile

Автор: dm9 6.12.2004, 11:00
Например?

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