Как решить математическое выражение на C++/CLI?
я не знаю как это сделать, подскажите как это сделать. Я знаю что в js есть команда eval()
которая все решит. В C++/CLI как быть? Мне Lua не надо, только на C++/CLI.
this->InputTextBox->Text
Хочу взять с this->InputTextBox->Text строку и превратить его в тип string:
String^ Matematic = gcnew String(InputTextBox->Text);
после этого мне надо его превратить в тип int, как это сделать? Я не знаю. потом решить математическое выражение или пример и сделать так что то типа:
this->InputTextBox->Text = result;
P.S (Было бы клево если на C++ eval() был как в Js ?).
Ответы (2 шт):
Надо начать с того, что eval() - это довольно небезопасная операция в JS. Можно начать с того, что если не проверить выражение, то можно внести в текстбокс вместо выражения текст программы, котрый модифицирует ту самую страницу, на которой вызывается eval().
Теперь о C++.
Еще раз повторю, проблема в том, что не все выражения - высчислимые. Например, могут быть выражения с нарушенным балансом скобок.
Кроме того, если что то типа
(1+4*25)*(6-14+2+30) - 65 +2*3
вычисляются, и всем более-менее понятно, что должно получиться в результате, то как высчислить
(2*a+1)(3*b-2)
Что в этом случае является ответом?
И как ограничены выражения - полиномами?
амая сложная часть задачи - это определение того, что выражение - правильное.
в общем случае понадобится либо построение AST, либо хотя бы проверка соответствия БНФ'у
Правда, если задача ограниченная - как в первом примере - то она решается наэлементарном уровне:
проверяем баланс скобок
начинаем вычислять при помощи стековой машины, учитывая приоритет операций. Это описано "алгоритмом сортировщика" еще у Дэйкстры.
в концк вычисления на вершине стека будет ответ.
Я не приводил ссылок, но по кллючевым словам Вы легко найдете все, что нужно.
Я нашел на английском stackoverflow ответ только на С#. Имеет такой вид:
string mystring = "3*(2+4)";
int result = EvaluateExpression(mystring);
Console.Writeln(result); // Outputs 18
Сделал на C++/CLI вот таким образом:
String^ CalcMatematic = InputTextBox->Text; // Берем текст с TextBox
Data::DataTable ^dt = gcnew DataTable();
auto res = dt->Compute(CalcMatematic, "");
this->InputTextBox->Text = res->ToString(); // в TextBox вносим результат.
P.S(Надеюсь кому то помог ?);