2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение19.08.2009, 14:33 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Alhimik, похоже, Вы занимаетесь какой-то, извините, алхимией (pun intended) там, где надо полноценный парсер писать - или уж плюнуть.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение19.08.2009, 15:39 
Заслуженный участник


15/05/09
1563
Alhimik в сообщении #236294 писал(а):
Да, и вот еще, для тех, кто печётся о растянутости страницы и у кого есть текст программы для delphi, хоть в консоле, но чтобы пользователь мог ввести функцию f(x) с клавиатуры и точку x_0, а программа бы выдавала значение функции в точке f(x_0)
ИСН в сообщении #236305 писал(а):
Alhimik, похоже, Вы занимаетесь какой-то, извините, алхимией (pun intended) там, где надо полноценный парсер писать - или уж плюнуть.

Согласен с предыдущим оратором. :D Alhimik, объясните, зачем оно нужно? Если это учебная задача - то какова учебная цель? А если практическая потребность - есть пакеты, которые все интегрируют, что надо. Воспроизвести хотя бы приближенно результат многолетнего труда большого числа профессионалов - странная затея...

Если программа предназначена для обработки, например, экспериментальных данных, то ввод с клавиатуры уж точно никому не нужен. Для демонстрационных целей лучше подходят упомянутые пакеты (Wolfram Mathematica и т.п.).

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение19.08.2009, 16:08 
Аватара пользователя


30/05/09
121
Киев
Для тех, кому интерестно:
Где-то я уже писал:

Вот так называется захотел разнообразить прогу по численному нахождению определённого интеграла чтобы пользователю предостаивть возможность задавать функицию (на языке delphi, естественно).

Учебная задача была просто написать элементарную программку на использование цикла for ... to ...do . В качестве тренировки я выбрал приблизительое нахождение определённого интеграла самым дубовым методом (подсчета интегральной суммы). Потом мне захотелось расширить возможности программы и предоставить пользователю самому вводить не только интервал иннтегрирования и количество итераций, но и функцию. И тут-то вышла проблемка. Использование dll не помогло. О динамическом компилировании в delphi я в и-нете ничего не нашел (google). О том, что такое парсер, уважаемый ИСН, не имею ни малейшего понятия. Поэтому, раз уж никто не может настрочить текст (на delphi) для демонстративной проги (пользователь пишет функцию, а программа выводит её значение в точке, скжем 1), то прошу хоты бя посоветовать какуе-то толковую литературу по этому делу.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение19.08.2009, 16:50 
Заслуженный участник


15/05/09
1563
Alhimik в сообщении #236317 писал(а):
Учебная задача была просто написать элементарную программку
Какую же учебную цель может преследовать появление возможности, которую Вы хотите реализовать?

1) Пользователь Вашей программы будет учиться описывать различного вида функции на некоем языке программирования (например, Паскаль). Возможно, но вряд ли для этих целей следует использовать результат его работы в программе для интегрирования. Уж лучше - построение графиков. Кроме того, если перед пользователем Вашей программы поставлена задача научиться программировать на некоем языке, то, видимо, у него есть средства для компиляции. Задача решена.

2) Вы хотите научиться реализовывать динамическую замену некоей процедуры (в смысле языка программирования). Здесь лучше использовать ООП и предложить пользователю фиксированый набор функций для интегрирования. И объединить это в визуальной программе с визуализацией текста реализации функции, графика функции и т.д.

3) Вы хотите научиться реализовывать разбор синтаксических конструкций. Вот в этом случае действительно надо изучать науку о компиляторах/интерпретаторах.

Alhimik в сообщении #236317 писал(а):
О том, что такое парсер, уважаемый ИСН, не имею ни малейшего понятия.
Гугл Вам в помощь: Парсер. :wink: Там и ссылки на литературу найдете, и другие полезные ссылки.

-- Ср авг 19, 2009 15:55:32 --

Как упрощенный вариант парсера могу предложить предоставить пользователю возможность "собирать" код функции из заготовок, входящих в фиксированный набор: арифметические операции, скобки (порядок действий), элементарный функции. То есть не давать пользователю возможность писать самому текст, а лишь вставлять готовые элементы. Этим Вы прежде всего упростите задачу обнаружения ошибок (этот вопрос на начальных стадиях обучения обходят стороной, а ведь он порождает минимум 50% забот для разработчиков нетривиального пользовательского интерфейса). Но все равно задача будет не совсем тривиальной, особенно для изучающего язык программирования.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение19.08.2009, 20:25 
Заслуженный участник


27/04/09
28128
Справки русской и у меня нет, а жаль. Хороший компонент. А так в двух словах сказать не получится. Поищите там в установочном каталоге папку Demo, там консольные программы как раз. Правда, комментарии английские.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение20.08.2009, 07:00 
Аватара пользователя


30/05/09
121
Киев
Что-то мне кажется, что для себя, только любителя программирования, я поставил сильно сложную задачу. Надеюсь, что в будущем я еще перечитаю сей форум и разберусь с этим делом.
Спасибо всем, кто принимал участие.
Пологаю, что тема закрыта.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение01.10.2009, 13:53 
Аватара пользователя


18/02/09
95
Ой, я хотела бы Вам задать вопрос: Вы хотите, чтобы пользователь сам вводил функцию для интегрирования? т.е. например,какую-нибудь рациональную,потом -- к.-н. логарифмическую и т.п.

-- Чт окт 01, 2009 14:54:55 --

т.е. программка первоначально была написана для какой-то одной функции?

-- Чт окт 01, 2009 14:58:24 --

Если я Вашу мысль правильно поняла, то я делала нечто похожее, правда, не с интегралами)))

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение11.10.2009, 21:47 
Заблокирован


05/07/09

265
Рязань
Alhimik в сообщении #236317 писал(а):
Для тех, кому интерестно:
Где-то я уже писал:

Вот так называется захотел разнообразить прогу по численному нахождению определённого интеграла чтобы пользователю предостаивть возможность задавать функицию (на языке delphi, естественно).

Учебная задача была просто написать элементарную программку на использование цикла for ... to ...do . В качестве тренировки я выбрал приблизительое нахождение определённого интеграла самым дубовым методом (подсчета интегральной суммы). Потом мне захотелось расширить возможности программы и предоставить пользователю самому вводить не только интервал иннтегрирования и количество итераций, но и функцию. И тут-то вышла проблемка. Использование dll не помогло. О динамическом компилировании в delphi я в и-нете ничего не нашел (google). О том, что такое парсер, уважаемый ИСН, не имею ни малейшего понятия. Поэтому, раз уж никто не может настрочить текст (на delphi) для демонстративной проги (пользователь пишет функцию, а программа выводит её значение в точке, скжем 1), то прошу хоты бя посоветовать какуе-то толковую литературу по этому делу.

Всё достаточно просто.
Обозначим:
Пр - процедура анализа строки
Прf1 - процедура вычисления функции 1.
Прf2 - процедура вычисления функции f2.
и т.д.
Пример:
f1(f2)+(5+f3+f4)
Решение.
Шаг 1.
Запускаем процедуру Пр слева на право.
Она не встречает скобок, а встречает функцию f1 с аргументом в скобках.
Процедура Пр определяет этот аргумент и запускает процедуру Прf1 с аргументом f2.
Шаг 2.
Процедура Прf1 производит анализ аргумента слева направо.
Она не встретила скобок, но встретила функцию f2 без аргументов.
Поэтому она запускает процедуру Прf2.
Шаг 3.
Процедура Прf2 подсчитала числовое значение и результат передался процедуре Прf1 как аргумент в виде числа.
Шаг 4.
Процедура Прf1 подсчитала числовое значение (ч1)и результат передался процедуре Пр.
Шаг 5.
Процедура Пр заменила исходную строку строкой:
ч1+(5+f3+f4)
и видит, что это не число, поэтому она начинает заново свое действие, но уже с новой строчкой.
Шаг 6.
Процедура встречает число, но после числа другого числа не встречает, а встречает открывающуюся скобку, поэтому она игнорирует число и определяет то что в скобках.
Определив то что в скобках она запускает саму себя с аргументом, который определила.
Шаг 6.
Процедура Пр получила в качестве аргумента строку:
5+f3+f4.
Шаг 7.
Процедура Пр проигнорировала число 5 и запустила процедуру f3.
Шаг 8.
Процедура f3 получила значение ч2 и передала его процедуре Пр.
Шаг 9.
Процедура Пр получила число ч2 и преобразовала строку в новую:
5+ч2+f4.
После чего определив, что результат не равен числу, начинает заново анализировать строку.
Шаг 10.
Процедура Пр встретила чило 5 и число ч2.
Произведя сложение их она получит число ч3. После чего строка заменится на строку:
ч3+f4.
Шаг 11.
Рассуждая аналогично, получим, что процедура Пр в конце концов из строки 5+f3+f4 получит число ч4.
Это значение она передаст самой себе.
Шаг 12.
Процедура Пр сформирует строку ч1+ч4.
Определив, что это не число, она начнёт анализ сначала. И здесь,уже получит окончательный ответ в виде числа ч5.
Это и будет значением исходной функции в данной точке.

P.S.
Чтобы не запутаться, можно начать со скобок, постепенно от них избавляясь

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение15.10.2009, 17:08 
Заслуженный участник


27/04/09
28128
Не надо там ничего заменять, надо просто рекурсивную процедуру Пр, которая результатом даёт число, и для каждой функции для "вычисления" её параметров тоже использовать Пр. А то будет куча одинакового кода во всех местах. Только хуже.
А процедура Пр разбирает выражение с помощью BNF-грамматики (каждому правилу - по внутренней процедуре, а перед этим разобрать весь текст на лексемы другой процедурой). Тогда только всё оправданго и будет хорошо и со вкусом. Другую реализацию подобных штук ни в коем случае не стоит

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение24.10.2009, 11:52 


24/10/09
1
Недавно мне пришлось решить подобную задачу.
Как упоминалось ранее, существует возможность встраивания в программу интерпретируемых языков. В моём случае я выбрал Lua ( http://lua.ru ). Для встраивания его в Дельфи есть библиотека lua4delphi ( http://sourceforge.net/projects/lua4delphi/ ). Она позволяет даже создавать интерфейсы Дельфи на лету во время выполнения программы, но если эта функциональность не нужна - библиотеку можно обрезать до простого интерпретатора (что я и сделал).

Надеюсь, эта информация поможет. Удачи!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу Пред.  1, 2

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group