-
Ребят, есть ли какая-нибудь библиотека, которая может принимать на вход текст вида: 3+(a+x*x*0-10-10*2*1*b+8)/1-a А выдавать упрощённое: 1-20*b То есть - раскрывать скобки, группировать/складывать там где возможно, выкидывать умножение на ноль/единицу и деление на единицу.
Если нету библиотек для Делфи/ФриПаскаля, может кто знает онлайн-сервисы - я бы попробовал через IdHTTP отправлять/получать данные.
-
И было бы неплохо возможность указывать значения переменным. Например для того примера укажем что "b = -1/20" и тогда должно выдать просто "2".
-
-
-
-
эм... Я ж как бы спрашиваю за "библиотеку" или "компонент" под Делфи, а не сайт-онлайн или чужую прогу...
А чего, Mathcad/Mathlab/Maple можно юзать под Делфи? Не задумывался об таком. И без установки самих программ будет работать, да?
-
-
> An a Student (29.11.16 20:03) [5] > эм... Я ж как бы спрашиваю за "библиотеку" или "компонент" под Делфи, а не сайт-онлайн или чужую прогу...
Ну да, а вот это писалось во сне, очевидно:
> An a Student (28.11.16 14:39) > Если нету библиотек для Делфи/ФриПаскаля, может кто знает > онлайн-сервисы - я бы попробовал через IdHTTP отправлять/получать данные.
-
> Сайт тот наверняка и пользуется библиотекой.
Думаете сайт написан на Делфи? В найденных ссылках навскидку вопросы на форумах без ответов, буду поковырять поглубже.
> [7]
Это как крайний вариант, если окажется что под Делфи совсем вообще нифига нету. С:
-
> [8] An a Student (30.11.16 09:16) > Думаете сайт написан на Делфи?
Причём тут на чём там сайт реализован. Библиотеки, например, на Си++ написаны, а подключить их можно много к чему. Разве не очевидные вещи? Тебе надо их найти, найти их описание и вызывать их функции из Делфи.
-
А самому это реализовать не предлагать? Не так уж оно страшно для простых арифметических символьных преобразований. А значения переменных, после реализации символьных преобразований, в полученное выражение подставить и вообще легко.
-
Поищем на выходных, поищем...
Я только учусь. Не думаю что осилю такое на данный момент. Даже примерно не представляю как и с какой стороны подступаться. У меня генератор формул, для себя. По вводу пользователя, с вариациями. Но в какой-то момент они становятся слишком большими из-за лишних
... + 5*x + ... - 5*x + ... - (...)*(...)*(...)*1*1*0*1/1+... Надо бы их упрощать автоматически, а то после каждого изменения параметра на форме вручную упрощать 200~300 формул? Это не дело.
-
> Не так уж оно страшно для простых арифметических символьных > преобразований.
напиши раскрытие скобок (a+b)(c+d)(x+y) - уже несколько тяжко становится.
-
> [12] kilkennycat © (01.12.16 02:00) > напиши раскрытие скобок (a+b)(c+d)(x+y) - уже несколько > тяжко становится.
Сколько угодно в любом сочетании. Недавно ссылку давал. Лет 10 назат хороший знакомый попросил курсовую сделать родственнику. Справка по F1. https://cloud.mail.ru/public/4JqA/eZAgnyy3g
-
(a+b)*(c+d)*(x+y) Какой ты вредный, зависла на твоём примере.:) Надо будет найти косяк.
-
> Inovet © (01.12.16 02:57) [14]
это сказывается работа бета-тестером в прошлом :)
-
> [15] kilkennycat © (01.12.16 12:28) > это сказывается работа бета-тестером в прошлом :)
Что интересно, студент курсовой сдал.:) Видать, ни он сам, ни преподаватели не тестировали. Я поправил, надеюсь. Можешь тестировать.:) https://cloud.mail.ru/public/JiCh/djypzF2QXВ общем, не столько это сложно, сколько кропотливо. Для нормальной программы я бы студенчиские подходы не стал применять, сделал бы более универсально и не на коленке, а так всё только в рамках задания и на голом Си++, ну кроме самой формы.
-
> Можешь тестировать.:)
404 :))
-
-
(a+b)*(c+d)*(y+x+x) и (a+b)*(c+d)*(y+2*x)
Выражение 1 ( a + b ) * ( c + d ) * ( y + x + x ) Выражение 1 после преобразования 2 * a * c * x + a * c * y + 2 * a * d * x + a * d * y + 2 * b * c * x + b * c * y + 2 * b * d * x + b * d * y Выражение 2 ( a + b ) * ( c + d ) * ( y + 2 * x ) Выражение 2 после преобразования 2 * a * c * x + a * c * y + 2 * a * d * x + a * d * y + 2 * b * c * x + b * c * y + 2 * b * d * x + b * d * y Разность выражений 1 и 2 -2 * a * d * x + 2 * b * d * x Выражения тождественно неравны.
-
ошибка плавающая. повторное внесение показало равенство
-
ага, стабильно возникает,если сначала написать выражение 2 (a+b)*(c+d)*(y+2x) сравнить, затем исправить на (a+b)*(c+d)*(y+2*x) сравниваем - ошибка.
-
> [21] kilkennycat © (01.12.16 20:09)
Загадочная ошибка. Что-то с коцами строк из мемок что ли, так и не понял, сегодня уже не осилю. Заменил вот такое t.Pars(memExpr1->Text + L"-(" + memExpr2->Text + L")"); на вот такое t.Pars(String().sprintf(L"%s-(%s)", memExpr1->Text.c_str(), memExpr2->Text.c_str()).c_str()); стало стабильно, хотя под дебагером всплывает одинаковая строка в функции bool Pars(wchar_t *e) Это в модуле где вся работа делается.
Заодно на Юникод переделал, перед исправлением основной ошибки. А экзешник в новой версии распух аж в 6 раз. Ладно, фиг с ним, развлёкся маленько.
-
-
> [22] Inovet © (01.12.16 22:04) > t.Pars(memExpr1->Text + L"-(" + memExpr2->Text + L")");
ну тут, конечно, ещё c_str() была.
-
теперь: (a+b)*(c+d+d)*(y+2*x) и (a+b)*(c+d+d)*(y+x+x) выдает неравны. изначально, независимо ни от чего
(a+b)*(c+d+d)*(y+2*x) и (a+b)*(c+d+d)*(y+2*x) выдает то равны, то неравны каждое сравнение
-
> выдает то равны, то неравны каждое сравнение
после второго сравнения. любого.
-
Как вы это делаете-то? Равны... Не равны... В принципе упрощает-то оно правильно или нет?
По интерфейсу - Ctrl+A не работает, окно не растягивается, это дюже неудобно. А мне как этим пользоваться программно? Просто упростить оно может или нет? Мож в виде DLL или хоть из командной строки передавать ей данные?
-
> В принципе упрощает-то оно правильно или нет?
в принципе правильно.
-
> [27] An a Student (02.12.16 01:17)
Да окно там дело десятое, можно и в ДЛЛ собрать - на входе строка, с выходе преобразованная строка, но я это одноразовое поделие не предлагал в качестве рабочего инструмента, а просто как пример возможности сделать самостоятельно. Придётся, конечно, делать, и не один день. Зато интересно. Ты вот лучше скажи - для чего тебе надо именно преобразования? Судя по > [1] An a Student (28.11.16 14:52) > И было бы неплохо возможность указывать значения переменным. > Например для того примера укажем что "b = -1/20" и тогда > должно выдать просто "2".
Может, тебя устроит какой-нибудь готовый скриптовый движок, не из тяжёлой артилерии с мощной математикой из уже озвученных выше математических программ? Есть бесплатные скрипты. Например http://torry.net/authorsmore.php?id=5949Есть платные. Например https://www.fastreport.ru/ru/product/fast-script/Я давно не интересовался. Искать по словам "script Delphi", "скриптовый движок Delphi"
-
> [25] kilkennycat © (01.12.16 22:34) > (a+b)*(c+d+d)*(y+2*x) и (a+b)*(c+d+d)*(y+x+x) выдает неравны. > изначально, независимо ни от чего
Первое вообще неправильно, причём нестабильно. Что-то с вычислением констант, похоже. Ну, по хорошему, надо бы дальше отлаживать.
-
> Inovet © (02.12.16 06:26) [30] > Ну, по хорошему, надо бы дальше отлаживать.
да. и добавить знак деления, а то 3 действия есть, а 4-го нет.
-
Нет, это просто самый "полный/очевидный" случай, таких будет мало. Для моего уровня говорю не так просто самому. По каким хоть принципам/алгоритмам это делается? Да и мне не надо исходников, просто что-то готовое, к чему можно обращаться из кода Делфи. Юнит/DLL или типа того.
И модуль. И степень.
P.S. Ссылка из [3] работает, уже думал грузить в TWebBrowser и парсить упрощённое, но оказалось оно некоторые переменные считает числами. Например вместо "e" ставит 2.7183, оно как бы ясно, но у меня это переменная.
|