2013-04-30 58 views
0

我想從兩個或多個數字和字符運算符創建和表達。確切的情況是,我有兩個數字例如。使用數字和字符運算符創建表達式

float a = 10.1, b = 10.2; 

和字符操作

char ch = '+'; 

現在我必須創建一個看起來像

float c = 10.1 '+' 10.2; 

即我想申請在char變量「通道」中提到的運算符的表達式我有兩個浮點數之間。所以在這種情況下,字符是'+',所以我想要創建表達式,其中浮點值將被添加,如果' - '然後減法等等。所有的值實際上將由用戶提供,所以想要創建表達式並執行操作。

現在我想到的一個解決方案是爲不同的操作員設置開關盒,並且可以做到這一點。另一種是如下:

float a = 10.1, b = 20.3; 
    char ch = '+'; 
    string result = ""; 
    ostringstream os; 
    os << a; 
    result += os.str(); 
    os.str(""); 
    os << b; 
    result += ch + os.str(); 

現在我寫上面的片段,這樣我可以基於用戶輸入產生表達和比返回表達,以便它可以在另一個過程來評估它。

我不確定這是可能的。我的意思是開關櫃解決方案似乎很好,我在這裏評估表達式並返回輸出值,但只是想知道是否有方法將表達式返回給另一個函數,然後在那裏評估它? 在tcl腳本語言中,我們有一個命令「expr」,它執行相同的工作,所以想知道我們是否有能力在C++中做同樣的事情。任何幫助,將不勝感激。

+1

無關,但創建該字符串的代碼是非常複雜的。這裏有三行相同的代碼:'ostringstream os; os << a << ch << b;字符串結果= os.str();' – 2013-04-30 18:06:03

+0

謝謝康拉德,我剛剛從網上的例子複製代碼來獲得決議。沒有做任何代碼優化來滿足我的期望。很長的時間限制你知道:D – 2013-04-30 18:11:41

回答

0

我覺得你的問題的關鍵是在考慮expression作爲一個對象。你正在使用C++,一些人認爲這是一種面向對象的編程語言,對嗎? :)考慮編寫一個跟在Composite Pattern後面的class Expression。一個Expression可能只是一個簡單的值:

Expression(10.1) 

它也可以代表增加了兩個下屬Expression S:

Expression(Expression(10.1) + Expression(20.3)) 

或者給你一個進一步的暗示:

Expression('+', Expression(10.1), Expression(20.3)) 

使Expression保留表達式的運算符和操作數,而不實際評估它。然後你可以自由地在程序中的一個地方構建它,然後將它傳遞到另一個地方以真正評估它。

0

C++有豐富的表達式解析庫。雖然我自己沒有使用過它們,但我已經聽到了關於muParser的好消息。

0

假設這是另一項任務/功課,你不追求全功能的表達式解析器,這裏是解決方案,因爲它可以作爲簡單:

#include <iostream> 
#include <sstream> 

using std::stringstream; 
using std::cout; 
using std::endl; 

float compute(float a, float b, char op) { 
    switch(op) { 
    case '+': 
     return a + b; 
    case '-': 
     return a - b; 

    // You may add more operations in the similar way. 

    default: 
     cout << "Operation is not supported." << endl; 
    } 

    return 0; 
} 

int main() { 
    // These guys are here to simulate user input. 
    float input_a = 10.1; 
    float input_b = 20.3; 
    char input_op = '+'; 

    stringstream ss; 

    ss << input_a << input_op << input_b; 

    // If you really make it interactive, then the program actually starts here. 
    float a; 
    float b; 
    char op; 

    // You simply read operands and operator from some input stream, 
    // which in case of interactive program could be `std::cin`. 
    ss >> a; 
    ss >> op; 
    ss >> b; 

    // Print the result of computation. 
    cout << compute(a, b, op) << endl; 
} 

如果要處理更復雜的情況下,如嵌套表達式的評估,可能包括括號功能,那麼我建議你閱讀經典的前4章。我花了大約1-2周的時間才能夠爲ANSI C編寫LR解析器,這比您的問題要複雜得多。

你的任務非常簡單,可以用玩具上下文無關文法來描述,它甚至不需要LL解析器來處理。無論如何要了解,爲什麼和如何,我請你讀這本書。

+0

Haroogan,感謝您的答案,但我正在尋找一種方法來做到這一點,而不使用開關櫃。使用開關,我同意這將是最簡單的方式,這就是我在我的問題的細節也提到。但只要尋找類似於tcl腳本命令「expr」的東西,如果在C++中存在或可能。 – 2013-04-30 18:36:05

+1

你可以將'a','b'和'op'包裝成一個具有適當功能(類似@Richard Walters已經提出的)的'Expression'類。並在你的代碼中傳遞這個類的對象。然而,你必須認識到,在某些時候,當真正評估這個表達式的時候,你別無選擇,只能使用'switch' /'case'或類似的東西。 – 2013-04-30 18:44:33

+0

是的,這是正確的。我正在考慮這個問題,實際上我必須解析操作員來評估表達式,而切換案例是最簡單的方法。再次感謝Harrogan。感謝大家的建議。 – 2013-04-30 18:51:47

相關問題