2011-10-05 132 views
3

我想評估用戶在文本框中輸入的數學表達式。我已經這樣做了迄今解決數學表達式

string equation, finalString; 
equation = textBox1.Text; 
StringBuilder stringEvaluate = new StringBuilder(equation); 
stringEvaluate.Replace("sin", "math.sin"); 
stringEvaluate.Replace("cos", "math.cos"); 
stringEvaluate.Replace("tan", "math.tan"); 
stringEvaluate.Replace("log", "math.log10"); 
stringEvaluate.Replace("e^", "math.exp"); 
finalString = stringEvaluate.ToString(); 
StringBuilder replaceI = new StringBuilder(finalString); 
replaceI.Replace("x", "i"); 

double a; 
for (int i = 0; i<5 ; i++) 
{ 
    a = double.Parse(finalStringI); 
    if(a<0) 
    break; 
} 

當我運行該程序它給出了一個錯誤"Input string was not in a correct format."並突出a=double.Parse(finalStringI);

我使用預先定義的表達式A = I * math.log10(I)-1.2和它作品,但是當我在文本框中輸入相同的東西時,它不會。 我做了一些搜索,它提出了一些在運行時編譯代碼的方法。

任何想法如何做到這一點? 我是一個絕對的初學者。 感謝:)

+1

有沒有在框架中任一公用事業你正在嘗試做的,以評估任意表達式字符串。實際解析字符串並編寫邏輯來執行評估會更好。正如你現在所做的那樣,沒有簡單的方法去做你想做的事情。 –

+1

@JeffMercado:說「框架中沒有東西」總是很危險,因爲它很容易出錯。碰巧你是。 –

回答

2

該問題在您的stringEvaluate StringBuilder中。當用「math.sin」替換「sin」時,stringEvaluate內的內容仍然是一個字符串。你有正確的想法,但你得到的錯誤是因爲這個事實。

Math.sinMath類中的一種方法,因此無法像調用​​時那樣對其進行操作。

這將是一個相當大的承諾實現你的目標,但我會去這樣理解:

  1. 創建一個類(也許稱之爲表達式)。
  2. Expression類的成員可能包含操作符和操作數的列表,也可能是一個稱爲solution的雙精度元素。
  3. 將此類傳遞給實例化的字符串,並使用StringBuilder類將其拆分。例如,如果遇到「罪」,將Math.sin添加到運算符集合(我將使用類型對象)。
  4. 上述字符串中的每個運算符和操作數應該放在兩個集合中。
  5. 創建一個方法來相應地評估操作數和操作數集合中的元素。這可能會對超過2個操作員的複雜計算變得粘滯,因爲您必須實施PEMDAS-esque算法來重新排序集合以服從操作順序(從而實現正確的解決方案)。

希望這有助於:)

0

.Parse方法(Int.Parsedouble.Parse等)將採取一個字符串,如 「25」 或 「3.141」,並將其轉換爲匹配值類型(INT 25,或雙3.141)。他們不會評估數學表達式!

您幾乎必須編寫自己的文本分析器和分析樹評估器,或者探索運行時代碼生成或MSIL代碼發射。

Q & StackOverflow的格式答案都不在。

0

您可以使用該框架包含的用於JScript.NET代碼的eval函數。

更多細節:http://odetocode.com/code/80.aspx

或者,如果你不害怕使用類標記爲「過時」,它真的很容易:

static string EvalExpression(string s) 
{ 
    return Microsoft.JScript.Eval.JScriptEvaluate(s, null, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()).ToString(); 
} 

例如,輸入"Math.cos(Math.PI/3)"其結果是"0.5"(這是60度的正確餘弦)