2012-02-27 108 views
1

我試着做一個代碼來計算用戶輸入的公式的值。也就是說,如果用戶輸入「10 + 5」,程序將打印出「總和爲15」等等。起初,我認爲這是一件容易的事,但如果意識到只是使用scanf orsth不會做到這一點。然後我搞砸了數組和循環來查看循環是否在輸入中遇到「 - 」或「+」符號,然後將該字符保存在「 - 」或「+」之前,然後計算它,但是我無法做到這一點工作。 你能否請我帶着正確的方向來完成這項工作。 非常感謝!計算輸入。

+1

表達式求值通常要進行改變它們通過將中綴符號(例如,a + b)轉換爲後綴符號(例如,ab +),然後對其進行評估。這對初學者來說有點微不足道,但一旦你明白了,這很容易。 – vaisakh 2012-02-27 17:14:15

回答

2

這可能非常複雜,特別是當您達到運算符優先級並且您需要正確計算時,例如2 + 5 * 6,需要將其視爲2 + (5 * 6)。解決這個問題的正確方法是構建表達式樹(就像編譯器一樣)。例如

+ 
/\ 
2 * 
/\ 
    5 6 

通過創建二叉樹做到這一點。每個節點都有一個操作和(最多)兩個子節點。然後通過遍歷表達式樹來評估表達式。

+0

謝謝你的回答。我試圖谷歌它的更多信息,因爲即時通訊只是一個初學者,並不完全明白該怎麼做。 – geekkid 2012-02-27 17:21:42

+0

@vaisakh提到的首先查詢中綴,前綴和後綴符號以及如何從一個轉換到另一個;使用後綴/前綴符號進行評估確實更容易,因爲您可以免費獲得運算符優先級 – scibuff 2012-02-27 17:23:16

2

你要做的是解析算術表達式,然後評估它們。互聯網上有很多東西,所以,因爲這是你的功課,我會把你留給谷歌。你的第一個想法,這很容易做,可能是一個天真的想法,但如果你沒有太過雄心勃勃,這不是一個非常困難的問題。

+0

謝謝你的回覆。我搜索了它,但在搜索10分鐘後沒有找到任何答案。這可能是因爲我真的不知道程序員的終端和使用的技術語言,所以我的搜索非常簡單,並且不是很具體。 順便說一句,這不是我的家庭作業,我只是這樣標記它,因爲在這個論壇的人以前告訴我,我應該把這些問題作爲家庭作業:d。 謝謝。我嘗試在網絡中搜索解析算術表達式,並查看我能找到的內容。 – geekkid 2012-02-27 17:18:44

+0

看看這裏http://stackoverflow.com/questions/4589951/parsing-an-arithmetic-expression-and-building-a-tree-from-it-in-java – scibuff 2012-02-27 17:26:42

1

這可能有點頭大,但你可以做的是使用c和詞法分析器的語法引擎。

我相信,它被稱爲「野牛」和「函數yylex」

從我記得在學校裏,它是我們如何讓我們的Pascal編譯器。

http://en.wikipedia.org/wiki/GNU_bison

創建一棵樹後。您可以分析子樹,然後根節點將成爲子樹的總和。

0

這些可能是你可能要考慮

  • 使用函數getline()或與fgets()獲得輸入
  • 從頭開始
  • 在字符串做兩遍,使用一些步驟一個隊列爲操作員,另一個爲操作數(數字)
  • 第一遍過程中,您到達*或/,讀取下一個數字,對下一個數字和您讀取的數字執行操作,並將結果插入隊列
  • 也第一遍期間,如果你讀+或 - ,默默地推動運營商和操作數到它們各自的隊列
  • 第二階段手柄+期間-...使用隊列會幫助你妥善處理連續弊例如4-3-3

這些都不是確切的步驟,但它是一個啓發式值得探討 - 試圖通過這些工作,根據什麼對你有意義等