2016012077+小學四則運算練習軟件項目報告
Coding.net原碼倉庫地址:https://git.coding.net/gemyty/operation.git
1.需求分析
(1)、程序可接收一個輸入參數n,然後隨機產生n道加減乘除(分別使用符號+-*÷來表示)練習題,每個數字在 0 和 100 之間,運算符在3個到5個之間。
(2)、每個練習題至少要包含2種運算符,並且練習題在運算過程中不得出現負數與非整數。
2.功能設計
(1)、基本功能:
①程序接收參數n,並對n的合法性作出判斷,若出現錯誤則提示。
②程序能自動生成n個四則運算式,並計算出結果。
③運算式會展現在txt中。
3.設計實現
(1)、PrintStream ps = new PrintStream("../result.txt");打印到result.txt文件
(2)private static Stack<String> stack = new Stack<String>();生成棧放入
(3)private static String[] operator = { "+", "-", "*", "/" };生成運算符
4.算法詳解
我用了棧的方法調度。
(1)首先,將中綴表達式改成後綴表達式,從左到右遍歷中綴表達式的每一個數字和運算符。
①如果數字就輸出(即存入後綴表達式);
②如果是右括號,則彈出左括號之前的運算符;
③如果優先級低於棧頂運算符,則彈出棧頂運算符,並將當前運算符進棧。
遍歷結束後,將棧則剩余運算符彈出。
(2)後綴表達式計算結果
從左到右遍歷後綴表達式,遇到數字就進棧,遇到符號,就將棧頂的兩個數字出棧運算,運算結果進棧,直到獲得最終結果,如下
private static String inffixToSuffix(String expression) { stack.clear(); StringBuilder inffix = new StringBuilder(expression); StringBuilder suffix = new StringBuilder(); String element = ""; String tmp = ""; while (inffix.length() > 0) { element = popNextElement(inffix); if (isNum(element)) { // 是數字則輸出 suffix.append(element).append(" "); } else if (")".equals(element)) { // 右括號則將左括號之前的內容全彈出 tmp = stack.pop(); while (!"(".equals(tmp)) { suffix.append(tmp).append(" "); tmp = stack.pop(); } } else if ("(".equals(element) || priority.get(element) >= priority.get(getTopOperator())) { stack.push(element); } else { // 優先級小於棧頂運算符,則彈出 tmp = stack.pop(); suffix.append(tmp).append(" ").append(element).append(" "); } } // 把棧中剩余運算符都彈出 while (stack.size() > 0) { suffix.append(stack.pop()).append(" "); } return suffix.toString(); } private static String suffixToValue(String expression) { String[] suffix = expression.split(" "); stack.clear(); double num1 = 0, num2 = 0; String tmp = ""; for (int i = 0; i < suffix.length; i++) { if (isNum(suffix[i])) { // 如果是數字 stack.push(suffix[i]); } else { // 如果是操作符 num2 = Double.parseDouble(stack.pop()); num1 = Double.parseDouble(stack.pop()); tmp = calculate1(num1, num2, suffix[i]); if (ERROR_ZERO.equals(tmp)) { throw new ArithmeticException("被除數不能為0"); } else { stack.push(tmp); } } } return stack.pop(); }
5.測試運行
你的程序必須是可運行的,請展示程序的運行截圖,包括題目要求實現功能對應的運行截圖。這些截圖說明你的程序確實完成了項目需求,如果程序實現了擴展需求,也請大方秀出來。
6.粘貼自己覺得比較獨特的或滿意的代碼片段
通過此方法判斷運算符的優先級
private static Map<String, Integer> priority = new HashMap<String, Integer>(); private static Map<String, String> replace = new HashMap<String, String>(); static { priority.put("*", 2); priority.put("/", 2); priority.put("+", 1); priority.put("-", 1); priority.put("", -1); }
7.總結
因為自己的能力不足,所以做這個項目的時候有非常多的困難,在這個過程中也收獲了許多,做的時候開始非常迷茫不知從哪裏開始,後來看了些資料例子博客什麽的,有了一點思緒,然後清理了思路,開始寫,寫的時候有很多錯誤,一直在修修改改,有時候覺得寫對了,但還是有報錯,有時候查了些資料解決了,有的還是不知怎麽弄得只有重新寫過。經過這次,實際感受到了做計劃的重要性,一定要有清晰思路後再著手,然後java必須要自己私下加速努力了,有想法但是寫不出來更是惱火。
8.展示PSP
代碼編寫用了許多時間,修改更是用了許多許多時間, 只有反思自己的代碼能力,非常有待加強。然後計劃也應清晰。
---恢復內容結束---
2016012077+小學四則運算練習軟件項目報告