計算器第二步-------計算(+ - * /)
項目源文件地址:Calculator
項目信息:
-
項目名稱:Calculator
-
項目版本:1.1
-
項目實現:
*對四則運算表達式進行拆解 *對拆解后的表達式進行簡單的錯誤判定 *對正確的表達式進行計算並輸出結果
具體實現
-
對表達式進行拆解
* 對操作符與數字進行區分,尤其是負號和減號的處理要進行特判。再把拆分后的操作符傳入隊列儲存。 特判處理代碼詳見: [scan.cpp](https://github.com/Mystarset/object-oriented/blob/master/Calculator/scan.cpp)
-
對拆解后的表達式進行簡單的錯誤判定
- 對長度大於10的數字報錯
- 對括號不匹配的算術表達進行報錯(用棧進行判斷)
-
對算術表達式進行計算
-
對原算術表達式加入兩個#號,用於判斷表達式是否計算結束
-
用一個OprRelation數組來判斷操作符與操作符之間的優先級大小關系
-
用兩個棧一個儲存操作符,另一個儲存數字 (用 sstream 函數庫把字符轉成數字)
-
對棧頂操作符和當前遇到的操作符進行優先級大小判斷
- ‘<’ 把當前操作符入棧
- ‘=’ 說明匹配括號,操作符棧頂元素出棧
- ‘>' 取出操作符棧頂元素,以及數字棧的兩個元素,進行計算。
-
完成項目的過程
- 這次的代碼修改整體並沒有遇到什么困難,大部分東西網絡上都可以輕松查到,自己加以理解就可以了。
- 我糾結比較久的是負號和減號的處理,我在特判出了負數之后,發現“-()”這種形式的式子還是會存在問題,於是我就在數字棧一開始先入棧了一個0元素以防止出現這種情況時式子計算出錯。
- 關於泡犇犇(鄭浩暉)在評論的8樓給出的bug,我查看之后發現是負號的處理出現了問題,"()-10"這樣的式子之前的代碼我會把-和10連在一起看成一個負數,經過修改后把他們分開了。
- 本來只是想考慮比較正常的表達式的。。但是在泡犇犇的帶領下,我還是決定多打些代碼去處理一些特殊的表達式,於是我就新建了一個Pretreatment的類去專門對一個表達式的格式進行轉換,轉成我的計算方法能夠接受的表達式。從而使我的代碼能夠成功計算出評論中泡犇犇給出的式子。
- 當然我的代碼應該還有BUG,歡迎大家來找出BUG。(尤其歡迎泡犇犇)