Analisar Expressão Matemática

Existe uma maneira fácil de analisar uma expressão matemática simples representada como uma string como (x + (2 * x) / (1-x)), fornecer um valor para x e obter um resultado?

Eu olhei para o VSAEngine por vários exemplos on-line, no entanto, estou recebendo um aviso de que este assembly foi preterido e não usá-lo.

Se fizer alguma diferença, estou usando o .NET 4.0.

Você pode tentar usar DataTable.Compute .

Um relacionado é DataColumn.Expression .

Também confira: Fazendo matemática em vb.net como Eval em javascript

Nota: eu não usei isso sozinho.

Exorto a caucanvas contra a escolha de um avaliador de expressão genérico existente sobre um avaliador matemático criado especificamente. A razão para isso é que os avaliadores de expressão não estão limitados apenas a matemática. Um indivíduo inteligente poderia usar isso para criar uma instância de qualquer tipo na estrutura e chamar qualquer método do tipo, e isso permitiria que ele fizesse algumas coisas decididamente indesejáveis. Por exemplo: new System.Net.WebClient().DownloadFile("illegalchildpornurl", "C:\openme.gif") irá avaliar muito bem na maioria deles, e fazer exatamente o que parece que seria (e fazer de você um criminoso ao mesmo tempo).

Isso não significa não procurar por algo que já está escrito. Significa apenas ter cuidado. Você quer um que faça matemática e apenas matemática. A maior parte do que já está lá fora não é tão exigente.

Eu estava usando recentemente mXparser, que é uma biblioteca de analisador de matemática. Ele oferece muita flexibilidade, como variables, funções, constantes e operadores. Você encontrará abaixo alguns exemplos de uso:

Exemplo 1 – fórmula simples

 Expression e = new Expression("1 + pi"); double v = e.calculate(); 

Exemplo 2 – fórmula com variables, funções, etc.

 Argument x = new Argument("x = 2"); Constant a = new Constant("a = sin(10)"); Function f = new Function("f(t) = t^2"); Expression e = new Expression("2*x + a - f(10)", x, a, f); double v = e.calculate(); 

https://mxparser.codeplex.com/

http://mathparser.org/

Cumprimentos

Eu também daria uma olhada no Jace ( https://github.com/pieterderycke/Jace ). O Jace é um analisador matemático de alto desempenho e mecanismo de cálculo que suporta todos os tipos .NET (.NET 4.x, Windows Phone, Windows Store, etc.). Jace também está disponível no NuGet: https://www.nuget.org/packages/Jace

Aqui está uma maneira de fazer isso. Este código está escrito em Java. Observe que ele não lida com números negativos no momento, mas você pode adicionar isso.

 public class ExpressionParser { public double eval(String exp, Map vars){ int bracketCounter = 0; int operatorIndex = -1; for(int i=0; i 

}

Você precisa importar java.util.Map.

Aqui está como eu uso este código:

  ExpressionParser p = new ExpressionParser(); Map vars = new HashMap(); vars.put("x", 2.50); System.out.println(p.eval(" 5 + 6 * x - 1", vars)); 

Outra opção que você pode querer examinar é a funcionalidade de avaliação de expressões do Spring.NET Framework. Pode fazer muito mais do que matemática também.

No entanto, todo o Spring.NET Framework pode ser um pouco exagerado para as suas necessidades se você não precisar do restante da funcionalidade.

Relacionado: Analisador de expressão de equação com precedência .

Como eu respondi neste tópico ( Best Free C # Math Parser usando variables, funções definidas pelo usuário, operadores customizados ), você pode usar o Mathos Parser , que você pode simplesmente colar em seu código-fonte.

  Mathos.Parser.MathParser parser = new Mathos.Parser.MathParser(); string expr = "(x+(2*x)/(1-x))"; // the expression decimal result = 0; // the storage of the result parser.LocalVariables.Add("x", 41); // 41 is the value of x result = parser.Parse(expr); // parsing Console.WriteLine(result); // 38.95 

Eu recomendo que você use o MEEL para isso.

 // parse string to IExpression (symbolic type) IExpression expression = BaseExpression.Parse("(x+(2*x)/(1-x))"); // create your own collection for attributes var attributes = new MathAttributeCollection(); // create local variable named "x" with value 5 var attributeX = new ScalarAttrInt("x") {Value = new ScalarConstInt(5)}; attributes.Add(attributeX); // execute math expression where x=5 var result = expression.Execute(attributes); MessageBox.Show(result.GetText()); // result: 2.5