1. 程式人生 > >2016012077+小學四則運算練習軟件項目報告

2016012077+小學四則運算練習軟件項目報告

tst 表達式計算 獲得 () 練習題 自動生成 ger blog 開始

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+小學四則運算練習軟件項目報告