Coding.net源碼倉庫地址:https://git.dev.tencent.com/Aha_Liang/myCalculator.git
測試步驟:
1.進入src文件夾
2.在命令行輸入javac -encoding utf-8 Main.java
3.回車再輸入java Main 50
4.回車,將會在根目錄下(與src同級)產生result.txt
目錄
一、需求分析
1.程序可從命令行接收一個輸入參數n,然後隨機產生n道加減乘除練習題。
2.每個數字在 0 和 100 之間,運算符在3個到5個之間。
3.每個練習題至少要包含2種運算符。
4.所出的練習題在運算過程中不得出現負數與非整數。
5.將學號與生成的n道練習題及其對應的正確答案輸出到文件“result.txt”中。
6.支持有括號的運算式,包括出題與求解正確答案。算式中存在的括號必須大於2個,且不得超過運算符的個數。
7.支持真分數的加減法,並且每個分數都化到最簡
二、功能設計
能夠根據用戶輸入的參數n隨機產生n道符合要求的練習題,自動算出答案,並將式子與答案以文檔的形式呈現。並實現附加功能:支持有括號的運算、支持真分數的加減運算。
三、設計實現
整個項目共設計了五個類:
Main類:主類,負責接收命令行的參數並啓動程序
CreateFile類:負責產生result.txt文件,並將學號和產生的練習題寫入文件
SimpleCalculator類:負責隨機產生一條帶括號的至少2種運算符四則運算的式子,且有3-5個運算符
ProperFraction類:負責產生真分數式子並計算答案
Calculator類:負責篩選運算過程中不產生負數和小數的式子,並計算答案
五個類之間的調用關係:
每個類中的重要函數:
SimpleCalculator類:
calculatorInteger():整數生成器
index(int operatorCount,int operatorTotal, Random random):產生運算符下標數組,並保證至少有2個不同的運算符
stitchingFormula(int operatorCount, int[] operatorNum, int[] operatorIndex):拼接式子
ProperFraction類:
properFraction():真分數生成器
greatFactor(int x,int y):求最大公因數,用於化簡
Calculator類:
NBL(String str):結合了調度場算法和逆波蘭表達式的求值,計算出式子的答案
calculate(int a, int b, String stmp):計算式子每一部分的運算,排除運算過程中出現小數和負數的式子
四、算法詳解
關於調度場算法和逆波蘭表達式(即後綴表達式)的求值
調度場算法的作用是將中綴表達式變爲後綴表達式,它需要一個隊列來裝後綴表達式和一個棧來裝符號。先從左到右遍歷中綴表達式的每個符號和數字,若是數字就入隊;若是符號,則判斷其與棧頂符號的優先級,若該符號是右括號或其優先級低於棧頂符號,則棧頂元素依次出棧並輸出進入隊列,並將當前符號進棧,一直到最終輸出後綴表達式。
逆波蘭表達式求值步驟(只需要一個棧):
1.先初始化一個空棧,開始遍歷後綴表達式。
2.如果字符是一個操作數,則令其入棧。
3.如果字符是個運算符,則彈出棧裏的兩個操作數(一定會有兩個數在棧裏,因爲是後綴表達式),進行運算,再把結 果入棧。
4.到後綴表達式末尾,從棧中彈出結果。
五、測試運行
進入src文件夾,在命令行輸入javac -encoding utf-8 Main.java 將類編譯成class文件,再輸入java Main 50運行class文件。
這裏先做一個非法輸入和越界測試,如輸入java Main e或java Main 1200:
再正常輸入如java Main 50,將會在根目錄下(與src同級)產生result.txt文件:
六、PSP
PSP2.1 |
任務內容 |
計劃共完成需要的時間(h) |
實際完成需要的時間(h) |
Planning |
計劃 |
27 |
35 |
· Estimate |
· 估計這個任務需要多少時間,並規劃大致工作步驟 |
27 |
35 |
Development |
開發 |
24 |
29 |
· Analysis |
· 需求分析 (包括學習新技術) |
6 |
8 |
· Design Spec |
· 生成設計文檔 |
0 |
0 |
· Design Review |
· 設計複審 (和同事審覈設計文檔) |
0 |
0 |
· Coding Standard |
· 代碼規範 (爲目前的開發制定合適的規範) |
0 |
0 |
· Design |
· 具體設計 |
2 |
3 |
· Coding |
· 具體編碼 |
6 |
11 |
· Code Review |
· 代碼複審 |
2 |
2 |
· Test |
· 測試(自我測試,修改代碼,提交修改) |
8 |
11 |
Reporting |
報告 |
3 |
6 |
· Test Report |
· 測試報告 |
2 |
5 |
· Size Measurement |
· 計算工作量 |
0.5 |
0.5 |
· Postmortem & Process Improvement Plan |
· 事後總結, 並提出過程改進計劃 |
0.5 |
0.5 |