c#動態編譯計算表示式的值,是通過system.codedom.compiler命名空間下的相關類來實現的。其步驟大致為:
1.將表示式包裝成為可編譯的c#**
2.使用反射呼叫上一步編譯的**。
示例如下:在介面上放乙個textbox,用來輸入表示式;放乙個按鈕,用來相應使用者點選,以進行表示式的計算;在另外乙個textbox中顯示計算結果。對應的xaml**如下:
<window
x:class
="samplecodedemo.mainwindow"
xmlns
=""xmlns:x
=""title
="mainwindow"
height
="403"
width
="663"
loaded
="window_loaded"
>
<
grid
>
<
textbox
height
="87"
horizontalalignment
="left"
margin
="12,12,0,0"
name
="txtexpression"
verticalalignment
="top"
width
="617"
="wrap"
/>
<
button
content
="計算"
height
="23"
horizontalalignment
="left"
margin
="554,114,0,0"
name
="btncalculate"
verticalalignment
="top"
width
="75"
click
="btncalculate_click"
/>
<
textbox
height
="48"
horizontalalignment
="left"
margin
="12,157,0,0"
name
="txtresult"
verticalalignment
="top"
width
="617"
isenabled
="false"
="wrap"
/>
grid
>
window
>
在後台**中,首先新增一下引用:
usingmicrosoft.csharp;
using
system.codedom.compiler;
using system.reflection;
剩餘的**如下:
privatevoid window_loaded(object
sender, routedeventargs e)
private
void btncalculate_click(object
sender, routedeventargs e)
catch
(exception ex)
}private
object compliercode(string
expression)
private
string wrapexpression(string
expression)
"");
public static datetime end_dt = convert.todatetime("""");
public static datetime current_dt = datetime.now;
public static object calculate();}
}";
return code.replace("
", expression);
}
簡單的說明一下,wrapexpression方法用來包裝表示式,使其可以被**編譯器編譯通過。compliercode方法用來編譯,並通過反射執行**。其它是兩個事件的處理方法,無需多說。
在上面的示例中可以實現動態計算符合c#語法的數學表示式計算。
計算表示式值
試題描述 字尾表示式是指運算子放在兩個運算物件之後,所有計算按運算子出現的順序,嚴格地從左到右進行。注意每個運算元之後都緊跟著乙個 如 3 5 2 7對應的字尾表示式為3.5.2.7.輸入乙個字尾表示式,求表示式的值。注意本題中只出現 三種運算子。輸入一行,乙個字尾表示式。輸出一行,乙個整數,表示字...
計算表示式值(字尾表示式) 棧
處理表示式主要是對優先順序以及括號的判斷 1.運算子棧頂的優先順序小於加入的時,需要將所有的不評級的取出並計算,2.當遇到 時,需要括號內的運算全部處理 2.其他情況全部加入運算子棧和資料棧 include include include using namespace std typedef lo...
計算該表示式值
問題描述 輸入乙個只包含個位數字的簡單四則運算表示式字串,計算該表示式的值注 1 表示式只含 四則運算符,不含括號 2 表示式數值只包含個位整數 0 9 且不會出現0作為除數的情況 3 要考慮加減乘除按通常四則運算規定的計算優先順序 4 除法用整數除法,即僅保留除法運算結果的整數部分。比如8 3 2...