2010-10-19 12 views
7

क्या एक स्ट्रिंग के रूप में प्रतिनिधित्व की गई सरल गणित अभिव्यक्ति को पार्स करने का कोई आसान तरीका है (x + (2 * x)/(1-x)), x के लिए मान प्रदान करें, और परिणाम प्राप्त करें?पार्स मैथ एक्सप्रेशन

मैंने कई ऑनलाइन उदाहरणों के अनुसार VSAEngine को देखा, हालांकि, मुझे चेतावनी मिल रही है कि इस असेंबली को हटा दिया गया है और इसका उपयोग नहीं किया गया है।

यदि यह कोई अंतर बनाता है, तो मैं .NET 4.0 का उपयोग कर रहा हूं।

+0

मैं यहाँ इस समस्या के लिए पूर्ण स्रोत तैनात: http://stackoverflow.com/questions/174664/operators-as-strings की [है –

+0

संभव डुप्लिकेट

यहाँ कैसे मैं इस कोड का उपयोग है .NET में रनटाइम पर नए कोड को संकलित और निष्पादित करना संभव है?] (http://stackoverflow.com/questions/234217/is-it-possible-to-compile-and-execute-new-code-at-runtime- इन-नेट) – nawfal

+0

संभावित डुप्लिकेट [क्या .NET में स्ट्रिंग गणित मूल्यांकनकर्ता है?] (http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net) –

उत्तर

5

आप DataTable.Compute का उपयोग करने का प्रयास कर सकते हैं।

संबंधित एक DataColumn.Expression है।

इसके अलावा बाहर की जाँच: Doing math in vb.net like Eval in javascript

नोट: मैं इन अपने आप उपयोग नहीं किया है।

+0

चूंकि मैं कोई ट्रिग गणना नहीं कर रहा था (बस सरल गणित), DataTable.Compute विकल्प लागू करने के लिए सबसे आसान था। – Brandon

1

एक अन्य विकल्प जिसे आप देखना चाहते हैं वह Spring.NET Framework की expression evaluation कार्यक्षमता है। यह गणित से भी बहुत कुछ कर सकता है।

हालांकि, अगर आपको बाकी कार्यक्षमता की आवश्यकता नहीं है तो संपूर्ण स्प्रिंग.NET फ्रेमवर्क आपकी आवश्यकताओं के लिए थोड़ा अधिक हो सकता है।

10

मैं एक उद्देश्य-निर्मित गणित मूल्यांकनकर्ता पर मौजूदा जेनेरिक अभिव्यक्ति मूल्यांकनकर्ता चुनने के खिलाफ सावधानी बरतता हूं। इसका कारण यह है कि अभिव्यक्ति मूल्यांकनकर्ता केवल गणित तक ही सीमित नहीं हैं। एक चालाक व्यक्ति फ्रेमवर्क में किसी भी प्रकार का उदाहरण बनाने और इस प्रकार की किसी भी विधि को कॉल करने के लिए इसका उपयोग कर सकता है, और इससे उसे कुछ निश्चित रूप से अवांछित चीजें करने की अनुमति मिल जाएगी। उदाहरण के लिए: new System.Net.WebClient().DownloadFile("illegalchildpornurl", "C:\openme.gif") उनमें से अधिकांश में ठीक से मूल्यांकन करेगा, और ऐसा लगता है कि यह कैसा लगता है (और आपको एक ही समय में एक फेलन बनाता है)।

इसका मतलब यह नहीं है कि पहले से लिखे गए कुछ की तलाश न करें। इसका मतलब सिर्फ सावधान रहना है। आप गणित करते हैं, और केवल गणित चाहते हैं। जो कुछ भी पहले से बाहर है, वह पिक नहीं है।

0

जैसा कि मैंने इस धागे (Best Free C# Math Parser using variables, user defined functions, custom operators) में उत्तर दिया है, आप Mathos Parser का उपयोग कर सकते हैं, जिसे आप आसानी से अपने स्रोत कोड में पेस्ट कर सकते हैं।

 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

दुर्भाग्यवश यह प्रोजेक्ट को कोडप्लेक्स में होस्ट किया गया है, जो बंद हो रहा है। मैं अभी कोडप्लेक्स में स्रोत को देखने के लिए प्रबंधन नहीं कर सकता। यह अच्छा होगा अगर परियोजना को गीथूब या बिटबकेट या इसी तरह से पुनर्स्थापित किया जा सके। –

+0

@ निकोस्टर, कृपया https://github.com/MathosProject/Mathos-Parser पर एक नज़र डालें। Https://github.com/MathosProject पर इसके अन्य संस्करण भी हैं। – Artem

3

मैं भी जेस (https://github.com/pieterderycke/Jace) पर एक नज़र होगा। जेस एक उच्च प्रदर्शन गणित पार्सर और गणना इंजन है जो सभी .NET स्वादों (.NET 4.x, विंडोज फोन, विंडोज स्टोर, ...) का समर्थन करता है। जेस NuGet के माध्यम से भी उपलब्ध है: https://www.nuget.org/packages/Jace

0

मैं आपको इसके लिए 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

मैं हाल ही में एमएक्सपार्सर का उपयोग कर रहा था, जो एक गणित पार्सर लाइब्रेरी है। यह आपको बहुत लचीलापन देता है, जैसे चर, कार्य, स्थिरांक, ऑपरेटरों। - सरल सूत्र

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

उदाहरण 2 - साथ सूत्र चर, कार्य, आदि

उदाहरण 1: आप कुछ उपयोग के उदाहरण नीचे मिलेगा

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/

सादर

0

यहाँ एक तरह से यह करने के लिए है। यह कोड जावा में लिखा गया है। ध्यान दें कि यह अभी नकारात्मक संख्याओं को संभाल नहीं करता है, लेकिन आप इसे जोड़ सकते हैं।

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; 
} 

}

आप java.util.Map आयात करने के लिए की जरूरत है।

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)); 
संबंधित मुद्दे