Разбор и расширение алгебраических уравнений с переменными с использованием VBA - PullRequest
0 голосов
/ 24 декабря 2018

Я работаю над сценарием VBA, который анализирует строку ввода пользователя для последующей оценки.Мне удалось объяснить это следующим образом, где буквы - это переменные, которые содержат строки, числа или другие функции для оценки позже.Они сравниваются в операторах AND / OR, которые имеют неопределенные переменные, поэтому я не могу просто оценить их заранее.Таким образом, я упростил это:

( ( [$$FIELD_1] [$$REL_GREATER_THAN] [$$FUNC_ROUND_OPEN] 6000.25 
[$$FUNC_ROUND_CLOSE] AND [$$FIELD_1] [$$REL_LESS_THAN] [$$FUNC_ABS_OPEN] 
[$$FUNC_FLOOR_OPEN] - 7000.99 [$$FUNC_FLOOR_CLOSE] [$$FUNC_ABS_CLOSE] OR 
[$$FIELD_1] [$$REL_LESS_THAN] [$$FIELD_3] ^ 2 + 8 ) AND ( [$$STRING_1] & 
[$$STRING_2] & [$$STRING_3] [$$REL_NOT_EQUAL] [$$FIELD_5] & [$$STRING_4] & 
[$$FIELD_4] ) ) OR [$$FIELD_6] [$$REL_EQUAL] [$$STRING_5]

, заменив логические переменные, а я заменил И на умножение, ИЛИ на сложение:

( ( A * B + C ) * ( D ) ) + E

Теперь мне нужно сделать следующее:расширить это с помощью дистрибутивного свойства алгебры.Результат будет выглядеть примерно так:

A*B*D + C*D + E

, в который я затем смогу начать подстановку значений обратно.

Порядок, в котором находятся термины, на самом деле не имеет значения, его просто нужно сгруппироватьв умножение или сложение.Это стало гораздо более сложной проблемой, чем я думал вначале, потому что мне нужно, чтобы он был достаточно устойчивым для работы с другими уравнениями, а не только с одним конкретным примером.

Я искал что-то встроенное в VBA, способное сделать этоестественно, но я еще ничего не нашел.Это аналогичный вопрос, но для Java и C: Разбор нестандартной формы в стандартную форму в java .К сожалению, единственный ответ там по сути сводился к «просто разбери его» ... с этой частью мне нужна помощь.

Как я могу программно определить эти дистрибутивные расширения?Есть ли алгоритм для этого?

1 Ответ

0 голосов
/ 24 декабря 2018

при условии, что у вас есть строка с вашим уравнением

equation = "( ( 2 * 3 + 2.5 ) * ( -2.5 ) ) + 1.9"

вы можете Evaluate это

MsgBox equation & " = " & Evaluate(Replace(equation, ",", "."))

, где Replace, чтобы убедиться, что у вас есть точка какдесятичный разделитель

вот рабочий фрагмент, где я использовал Dictionary для отслеживания именных переменных и их значения:

Dim equation As String
equation = "( ( A * B + C ) * ( D ) ) + E"

Dim varDict As Scripting.Dictionary
Set varDict = New Scripting.Dictionary

With varDict
    .Add "A", 2#    ' assigning variable "A" the value 2.0
    .Add "B", 3     ' assigning variable "B" the value 3.0
    .Add "C", 2.5   ' assigning variable "C" the value 2.5
    .Add "D", -2.5  ' assigning variable "D" the value -2.5
    .Add "E", 1.9   ' assigning variable "E" the value 1.9
End With

Dim key As Variant
For Each key In varDict ' loop all variables
    equation = Replace(Replace(equation, key, varDict(key)), ",", ".") ' replace each variable name within 'equation' string with its corresponding value, and make sure you use dots for decimal separator
Next

MsgBox equation & " = " & Evaluate(equation) ' show the result
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...