Конференция "Основная" » Посоветуйте библиотеку для упрощения алгебраических выражений [D7, WinXP]
 
  • An a Student (28.11.16 14:39) [0]
    Ребят, есть ли какая-нибудь библиотека, которая может принимать на вход текст вида:
       3+(a+x*x*0-10-10*2*1*b+8)/1-a
    А выдавать упрощённое:
       1-20*b
    То есть - раскрывать скобки, группировать/складывать там где возможно, выкидывать умножение на ноль/единицу и деление на единицу.

    Если нету библиотек для Делфи/ФриПаскаля, может кто знает онлайн-сервисы - я бы попробовал через IdHTTP отправлять/получать данные.
  • An a Student (28.11.16 14:52) [1]
    И было бы неплохо возможность указывать значения переменным.
    Например для того примера укажем что "b = -1/20" и тогда должно выдать просто "2".
  • KSergey © (29.11.16 14:01) [2]
  • KSergey © (29.11.16 14:39) [3]
  • Inovet © (29.11.16 15:41) [4]
    > [3] KSergey ©   (29.11.16 14:39)
    > Блин, и ведь работает!
    > Офигеть

    Калькулятор у меня на столе
    http://s018.radikal.ru/i503/1611/ab/366a7d2f0384.jpg

    А по сабжу, я специально не занимался, но есть ведь библиотеки от чего-то из этого Mathcad, Mathlab, Maple.
  • An a Student (29.11.16 20:03) [5]
    эм... Я ж как бы спрашиваю за "библиотеку" или "компонент" под Делфи, а не сайт-онлайн или чужую прогу...

    А чего, Mathcad/Mathlab/Maple можно юзать под Делфи? Не задумывался об таком. И без установки самих программ будет работать, да?
  • Inovet © (30.11.16 04:32) [6]
    > [5] An a Student   (29.11.16 20:03)

    Сайт тот наверняка и пользуется бмблиотекой. Под Делфи библиотеками можно пользоваться. Гугл есть?
    https://www.google.ru/?gws_rd=ssl#newwindow=1&q=maple+delphi
    https://www.google.ru/?gws_rd=ssl#newwindow=1&q=matlab+delphi
  • KSergey © (30.11.16 08:11) [7]
    > An a Student   (29.11.16 20:03) [5]
    > эм... Я ж как бы спрашиваю за "библиотеку" или "компонент" под Делфи, а не сайт-онлайн или чужую прогу...

    Ну да, а вот это писалось во сне, очевидно:

    > An a Student   (28.11.16 14:39) 
    > Если нету библиотек для Делфи/ФриПаскаля, может кто знает
    > онлайн-сервисы - я бы попробовал через IdHTTP отправлять/получать данные.
  • An a Student (30.11.16 09:16) [8]
    > Сайт тот наверняка и пользуется библиотекой.

    Думаете сайт написан на Делфи?
    В найденных ссылках навскидку вопросы на форумах без ответов, буду поковырять поглубже.

    > [7]

    Это как крайний вариант, если окажется что под Делфи совсем вообще нифига нету. С:
  • Inovet © (30.11.16 09:39) [9]
    > [8] An a Student   (30.11.16 09:16)
    > Думаете сайт написан на Делфи?

    Причём тут на чём там сайт реализован. Библиотеки, например, на Си++ написаны, а подключить их можно много к чему. Разве не очевидные вещи? Тебе надо их найти, найти их описание и вызывать их функции из Делфи.
  • Inovet © (30.11.16 09:46) [10]
    А самому это реализовать не предлагать? Не так уж оно страшно для простых арифметических символьных преобразований. А значения переменных, после реализации символьных преобразований, в полученное выражение подставить и вообще легко.
  • An a Student (01.12.16 01:32) [11]
    Поищем на выходных, поищем...

    Я только учусь. Не думаю что осилю такое на данный момент. Даже примерно не представляю как и с какой стороны подступаться.
    У меня генератор формул, для себя. По вводу пользователя, с вариациями. Но в какой-то момент они становятся слишком большими из-за лишних
    ... + 5*x + ... - 5*x + ... - (...)*(...)*(...)*1*1*0*1/1+...
    Надо бы их упрощать автоматически, а то после каждого изменения параметра на форме вручную упрощать 200~300 формул? Это не дело.
  • kilkennycat © (01.12.16 02:00) [12]

    > Не так уж оно страшно для простых арифметических символьных
    > преобразований.

    напиши раскрытие скобок (a+b)(c+d)(x+y) - уже несколько тяжко становится.
  • Inovet © (01.12.16 02:44) [13]
    > [12] kilkennycat ©   (01.12.16 02:00)
    > напиши раскрытие скобок (a+b)(c+d)(x+y) - уже несколько
    > тяжко становится.

    Сколько угодно в любом сочетании. Недавно ссылку давал. Лет 10 назат хороший знакомый попросил курсовую сделать родственнику. Справка по F1.
    https://cloud.mail.ru/public/4JqA/eZAgnyy3g
  • Inovet © (01.12.16 02:57) [14]
    (a+b)*(c+d)*(x+y)
    Какой ты вредный, зависла на твоём примере.:) Надо будет найти косяк.
  • kilkennycat © (01.12.16 12:28) [15]

    > Inovet ©   (01.12.16 02:57) [14]

    это сказывается работа бета-тестером в прошлом :)
  • Inovet © (01.12.16 19:00) [16]
    > [15] kilkennycat ©   (01.12.16 12:28)
    > это сказывается работа бета-тестером в прошлом :)

    Что интересно, студент курсовой сдал.:) Видать, ни он сам, ни преподаватели не тестировали. Я поправил, надеюсь. Можешь тестировать.:)
    https://cloud.mail.ru/public/JiCh/djypzF2QX

    В общем, не столько это сложно, сколько кропотливо. Для нормальной программы я бы студенчиские подходы не стал применять, сделал бы более универсально и не на коленке, а так всё только в рамках задания и на голом Си++, ну кроме самой формы.
  • kilkennycat © (01.12.16 19:46) [17]

    >  Можешь тестировать.:)

    404 :))
  • Inovet © (01.12.16 19:55) [18]
    > [17] kilkennycat ©   (01.12.16 19:46)
    > 404 :))

    https://cloud.mail.ru/public/KuDd/LQxHX2PsX
  • kilkennycat © (01.12.16 20:05) [19]
    (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
    Выражения тождественно неравны.
  • kilkennycat © (01.12.16 20:07) [20]
    ошибка плавающая. повторное внесение показало равенство
  • kilkennycat © (01.12.16 20:09) [21]
    ага, стабильно возникает,если сначала написать выражение 2
    (a+b)*(c+d)*(y+2x)
    сравнить, затем исправить на
    (a+b)*(c+d)*(y+2*x)
    сравниваем - ошибка.
  • Inovet © (01.12.16 22:04) [22]
    > [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 раз.
    Ладно, фиг с ним, развлёкся маленько.
  • Inovet © (01.12.16 22:11) [23]
  • Inovet © (01.12.16 22:19) [24]
    > [22] Inovet ©   (01.12.16 22:04)
    > t.Pars(memExpr1->Text + L"-(" + memExpr2->Text + L")");

    ну тут, конечно, ещё
    c_str()
    была.
  • kilkennycat © (01.12.16 22:34) [25]
    теперь:
    (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) выдает то равны, то неравны каждое сравнение
  • kilkennycat © (01.12.16 22:37) [26]

    > выдает то равны, то неравны каждое сравнение

    после второго сравнения. любого.
  • An a Student (02.12.16 01:17) [27]
    Как вы это делаете-то?
    Равны... Не равны... В принципе упрощает-то оно правильно или нет?

    По интерфейсу - Ctrl+A не работает, окно не растягивается, это дюже неудобно.
    А мне как этим пользоваться программно? Просто упростить оно может или нет?
    Мож в виде DLL или хоть из командной строки передавать ей данные?
  • kilkennycat © (02.12.16 02:09) [28]

    >  В принципе упрощает-то оно правильно или нет?

    в принципе правильно.
  • Inovet © (02.12.16 06:02) [29]
    > [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"
  • Inovet © (02.12.16 06:26) [30]
    > [25] kilkennycat ©   (01.12.16 22:34)
    > (a+b)*(c+d+d)*(y+2*x) и (a+b)*(c+d+d)*(y+x+x) выдает неравны.
    > изначально, независимо ни от чего

    Первое вообще неправильно, причём нестабильно. Что-то с вычислением констант, похоже. Ну, по хорошему, надо бы дальше отлаживать.
  • kilkennycat © (02.12.16 13:47) [31]

    > Inovet ©   (02.12.16 06:26) [30]
    > Ну, по хорошему, надо бы дальше отлаживать.

    да. и добавить знак деления,  а то 3 действия есть, а 4-го нет.
  • An a Student (02.12.16 16:18) [32]
    Нет, это просто самый "полный/очевидный" случай, таких будет мало.
    Для моего уровня говорю не так просто самому. По каким хоть принципам/алгоритмам это делается?
    Да и мне не надо исходников, просто что-то готовое, к чему можно обращаться из кода Делфи. Юнит/DLL или типа того.

    И модуль. И степень.

    P.S.
    Ссылка из [3] работает, уже думал грузить в TWebBrowser и парсить упрощённое, но оказалось оно некоторые переменные считает числами.
    Например вместо "e" ставит 2.7183, оно как бы ясно, но у меня это переменная.
 
Конференция "Основная" » Посоветуйте библиотеку для упрощения алгебраических выражений [D7, WinXP]
Есть новые Нет новых   [118667   +48][b:0][p:0.001]