Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > VB .NET > Как вычислить выражение записанное в виде строки |
Автор: lvvas 1.4.2009, 15:47 |
Числовой переменной можно присвоить значение арифметического выражения и результат вывести в текстовую строку например: Dim a As Decimal = (2 + 2) * 3 TextBox1.Text = a А как сделать так, чтобы строковые данные воспринимались как арифметическое выражение? То есть, например, типа так: TextBox1.Text = "(2 + 2) * 3" Dim a As Decimal =TextBox1.Text TextBox1.Text = a (но не работает и не должно, поскольку переменной типа Decimal пытаюсь присвоить строковое выражение) В общем, нужно чтобы вычислялось выражение, введённое в текстовую строку... Есть ли простые способы решения этой проблемы? |
Автор: diadiavova 1.4.2009, 15:59 |
Можно использовать готовые библиотеки, коих вполне достаточно даже среди оупенсорс-проектов Например: http://flee.codeplex.com/ или используй динамическую компиляцию. Например Так http://www.interface.ru/home.asp?artId=4703. |
Автор: -Mikle- 1.4.2009, 17:09 | ||||
Когда-то я таким способом делал. Имей ввиду, штука весьма противная, так как компиляция - процесс не быстрый уже по своему определению. Время выполнения составляло 100 мс, то есть 10 вычислений в секунду. Сложность выражения пркактически не влияла на скорость. Вот код на C#, если будет не понятно, попроси, переведем на VB.NET
Использование простое:
|
Автор: diadiavova 1.4.2009, 17:23 |
Чтобы было быстро надо собственный парсер писать, а такое решение вряд ли можно назвать простым. Кроме того: если надо производить много вычислений, то можно их все оформить в одну сборку и скомпилировать 1 раз. Хотя, в любом случае, я не агитирую за этот способ. ![]() ЗЫ В моей второй ссылке пример на васике, сам не проверял, но, как мне кажется я эту статью видел несколько лет назад на другом сайте, если это она, то всё работает. ЗЫ Можно использовать генератор парсеров, но тоже к простым этот способ не относится, тк грамматику прийдётся описывать. |
Автор: diadiavova 1.4.2009, 18:12 |
Вопрос был о простом способе. А большинство операций, даже если их нет в Net, то можно добавить, описав свои функции. Другое дело, если речь идёт о каком-нибудь очень специфическом синтаксисе, тогда конечно, стандартные компиляторы тут не помогут. |
Автор: source777 1.4.2009, 19:30 | ||
А простота к-л способа сильно зависит от того с какой целью понадобилось считать выражение в строке, зачастую динамическая компиляция далеко не самое простое решение данной задачи. |
Автор: diadiavova 1.4.2009, 20:45 | ||
Объясню, как выполняется то, о чём я написал. Для выполнения операции текст фактически вставляется в тело кода сборки. То есть: для того, чтобы вычислить строку 2+2*2 надо написать что-то в этом роде
Такой код компилится, далее создаётся экземпляр класса MyClass и у него вызывается метод GetValue. Если тебе надо добавить пару-тройку функций, то просто запихни их в этот класс и дело в шляпе. Что до выражения 3^2 ,то это синтаксис бейсика и если использовать его компилятор и формировать код на нём же, то всё будет нормуль. |
Автор: diadiavova 1.4.2009, 21:42 |
Выкладываю пример. Здесь можно выполнять операции в соответствии с синтаксисомвасика(включая степени), так же можно использовать все функции класса Math напрямую (то есть не Sysytem.Math.Sin, а просто Sin или sin), кроме того: я добавил свою функцию Factorial, которую тоже можно использовать в выражениях. |
Автор: lvvas 2.4.2009, 07:28 |
ОГРОМНЕЙШЕЕ всем спасибо. Сижу, разбираюсь... |
Автор: source777 2.4.2009, 15:20 | ||
И бейсик всё это проглотит? ужос какой...
|
Автор: diadiavova 2.4.2009, 15:28 | ||
Дело не в бейсике. Просто код посмотри, обрати внимание на инструкцию импорта(using по вашему ![]() Не знал, что ты ребёнок...извини ![]()
Какая рекурсия, ты вообще о чём? ![]() |
Автор: -Mikle- 2.4.2009, 15:46 | ||
и не только это ![]()
|
Автор: source777 2.4.2009, 20:26 | ||
Я посмотрел, потому и говорю, что ужос полный. И тут дело именно в бейсике! Я не про себя, а про lvvas и ему подобных, они ведь могут твой код воспринять всерьёз и не понять злобной шутки:
|
Автор: diadiavova 2.4.2009, 21:48 | ||||
Эта "злобная шутка" была всего лишь иллюстрацией вот этого
и адресована была лично тебе. И честно говоря мне и в голову не пришло, что кто-то может меня заподозрить в том, что я пытаюсь кого бы то ни было учить вычислять факториал(речь, как бы не нём была). |
Автор: source777 2.4.2009, 22:16 |
Такой метод может быть иллюстрацией только к тому как не надо ни в коем случае писать код... Но в целом тебе конечно удалось показать как расширить границы применимости данного метода за счёт нестрогого синтаксиса бейсика. |
Автор: diadiavova 2.4.2009, 23:25 | ||||
А как надо? Просто даже интересно, какую альтернативу ты предлагаешь. Писать свой парсер?
Строгость в бейсике - штука, вполне поддающаяся настройке. Просто он более гибок. |
Автор: -Mikle- 3.4.2009, 09:45 |
source777 и diadiavova, если будете продолжать, я отрежу кусочек темы и отправлю его вместе с вами в религиозные войны ![]() |
Автор: source777 3.4.2009, 11:09 |
Для вычисления факториала свой парсер писать не нужно, но твой метод вычисления факториала достоин помещения в кунсткамеру. 2-Mikle- Можно просто закрыть тему ![]() |
Автор: -Mikle- 3.4.2009, 11:39 |
А здравый смысл вас не остановит? Ок. Я подожду пока вы выскажетесь тут друг другу, а потом отправлю все это в мусорку... Закрывать не буду, так как тема может быть полезной... |
Автор: diadiavova 3.4.2009, 12:29 |
source777, Я не понимаю: мы что обсуждали факториалы? Ты название темы перечитай. И то, что я написал рассматривай в её контексте. Немного доработал свой пример, а то у людей действительно может сложиться впечатление, что всё получилось только из-за "нестрогого синтаксиса бейсика". В примере можно выбрать язык. Причём для шарпа два режима: в первом функции надо писать как они определены в классе System.Math (то есть с большой буквы), а во втором надо использовать нижний регистр. Кода получилось больше чем для бейсика, да и на совершенство он тоже не претендует, а только демонстрирует возможности динамической компиляции(при чём далеко не все). |
Автор: m08pvv 20.4.2009, 15:33 |
Недавно в универе задали такое задание... Сразу же вспомнил старую програмку, которую пришлось писать заново, глядя на картинку с хитрой структурой, а затем дебажить и добавлять функционал Итак, представляю всем желающим свое творение, которое всего 666 строк (с комментариями на английском в минимальном количестве) |
Автор: m08pvv 23.4.2009, 16:13 |
Заметил пару багов (связанных со сравнениями) Вот новая версия Подправил унарный минус (случайно наткнулся на то, что в порыве его туда добавить испортил простой минус...) вот новая версия (если кому надо) |
Автор: vladd 1.9.2015, 10:35 | ||||
Привет. Имею код
Такая ошибка
Как сделать правильно? В чём ошибка? |