2010-10-19 20 views
7

Esiste un modo semplice per analizzare un'espressione matematica semplice rappresentata come una stringa come (x + (2 * x)/(1-x)), fornire un valore per x e ottenere un risultato?Espressione matematica Parse

Ho esaminato il VSAEngine per diversi esempi online, tuttavia, sto ricevendo un avviso che questo assembly è stato deprecato e non usarlo.

Se fa qualche differenza, sto usando .NET 4.0.

+0

ho postato sorgente completo per questo problema qui: http://stackoverflow.com/questions/174664/operators-as-strings –

+0

possibile duplicato di [Is è possibile compilare ed eseguire il nuovo codice in runtime in .NET?] (http://stackoverflow.com/questions/234217/is-it-possible-to-compile-and-execute-new-code-at-runtime- in-net) – nawfal

+0

possibile duplicato di [Esiste un valutatore di matematica delle stringhe in .NET?] (http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net) –

risposta

1

Un'altra opzione che si desidera esaminare è la funzionalità expression evaluation di Spring.NET Framework. Può fare molto di più della matematica, anche.

Tuttavia, l'intero framework Spring.NET potrebbe essere un po 'eccessivo per le proprie esigenze se non si richiede il resto della funzionalità.

10

Esorto a non scegliere un valutatore di espressioni generiche esistente su un programma di valutazione matematica appositamente creato. La ragione di ciò è che i valutatori di espressioni non si limitano solo alla matematica. Un individuo intelligente potrebbe usarlo per creare un'istanza di qualsiasi tipo nel framework e chiamare qualsiasi metodo sul tipo, e questo gli permetterebbe di fare alcune cose decisamente sgradite. Ad esempio: new System.Net.WebClient().DownloadFile("illegalchildpornurl", "C:\openme.gif") valuterà proprio bene nella maggior parte di quelli, e fa solo quello che sembra (e ti rende un criminale allo stesso tempo).

Questo non significa che non cercare qualcosa che è già stato scritto. Significa solo stare attenti. Ne vuoi uno che faccia matematica, e solo matematica. La maggior parte di ciò che è già là fuori non è così schizzinoso.

0

Come ho risposto in questa discussione (Best Free C# Math Parser using variables, user defined functions, custom operators), è possibile utilizzare Mathos Parser, che è possibile semplicemente incollare nel codice sorgente.

 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 
+0

Sfortunatamente questo progetto è ospitato presso Codeplex, che sta chiudendo. Non riesco nemmeno a dare un'occhiata alla sorgente di Codeplex adesso. Sarebbe bello se il progetto potesse essere ripubblicato su Github o Bitbucket o simili. –

+0

@NicFoster, si prega di dare un'occhiata a https://github.com/MathosProject/Mathos-Parser. Ci sono anche altre versioni di esso su https://github.com/MathosProject. – Artem

0

Per questo consiglio di utilizzare MEEL.

// 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 
5

Recentemente ho utilizzato mXparser, che è una libreria di parser matematico. Ti dà molta flessibilità, come variabili, funzioni, costanti, operatori. Qui di seguito troverete alcuni esempi di utilizzo:

Esempio 1 - semplice formula

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

Esempio 2 - formula con le variabili, funzioni, ecc

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/

migliori saluti

0

Ecco un modo per farlo. Questo codice è scritto in Java. Nota che adesso non gestisce i numeri negativi, ma puoi aggiungerlo.

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

    for(int i=0; i<exp.length(); i++){ 
     char c = exp.charAt(i); 
     if(c == '(') bracketCounter++; 
     else if(c == ')') bracketCounter--; 
     else if((c == '+' || c == '-') && bracketCounter == 0){ 
      operatorIndex = i; 
      break; 
     } 
     else if((c == '*' || c == '/') && bracketCounter == 0 && operatorIndex < 0){ 
      operatorIndex = i; 
     } 
    } 
    if(operatorIndex < 0){ 
     exp = exp.trim(); 
     if(exp.charAt(0) == '(' && exp.charAt(exp.length()-1) == ')') 
      return eval(exp.substring(1, exp.length()-1), vars); 
     else if(vars.containsKey(exp)) 
      return vars.get(exp); 
     else 
      return Double.parseDouble(exp); 
    } 
    else{ 
     switch(exp.charAt(operatorIndex)){ 
      case '+': 
       return eval(exp.substring(0, operatorIndex), vars) + eval(exp.substring(operatorIndex+1), vars); 
      case '-': 
       return eval(exp.substring(0, operatorIndex), vars) - eval(exp.substring(operatorIndex+1), vars); 
      case '*': 
       return eval(exp.substring(0, operatorIndex), vars) * eval(exp.substring(operatorIndex+1), vars); 
      case '/': 
       return eval(exp.substring(0, operatorIndex), vars)/eval(exp.substring(operatorIndex+1), vars); 
     } 
    } 
    return 0; 
} 

}

è necessario importare java.util.Map.

Ecco come io uso questo codice:

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