1. 程式人生 > >小學四則運算“軟件”之初版

小學四則運算“軟件”之初版

res plan ntop 每次 修改 需要 www. sets for

作業要求地址:http://www.cnblogs.com/xiangxuer/p/9695909.html

github地址:https://github.com/1627851906/sizeyunsuan

1.個人軟件過程耗時估計與統計表

PSP2.1 Personal Software Process Stages predicted(h) actual(h)
· Planning 計劃 1 1
· Estimate 估計這個任務需要多少時間 8 10
· Development 開發 7 7
· Analysis 需求分析 (包括學習新技術) 1 0.5
· Design Spec 生成設計文檔 1 1
· Design Review 設計復審 1 2
· Coding Standard 代碼規範 1 1
· Design 具體設計 1 2
· Coding 具體編碼 6 6
· Code Review 代碼復審 7 9
· Test 測試(自我測試,修改代碼,提交修改) 1 0.5
· Reporting 報告 1 1
· 測試報告 0.5 0.5
· 計算工作量 0.5 0.5
· 並提出過程改進計劃 0.5 0.5

2.構思

因為是用java寫的,所以想到用已經存在的Stack類來存放操作數和操作符,定義了兩個Stack,一個存放Float類型,一個存放Character類型,用戶決定出題數,但是每道題的操作數是隨機出的,在這裏寫死了生成操作符的數目1~N,後期可以修改,只不過不想生成太長的式子,操作數就是操作符數目加一,後面如果出現乘號或除號後面出現加號或者減號,則添加括號,括號也壓進操作符棧。然後事先定義一個算術符優先級表,進入一個循環,每次比較棧頂和次棧頂兩個操作符的優先級,有‘<’, ‘>‘, ‘=‘,然後進行壓棧入棧操作,最後操作符棧只剩下一個等於號並且操作數棧只剩一個操作數,即為整個式子答案。

3.設計

3.1、算術符優先級表

1  private static char[] signArray = new char[]{‘+‘, ‘-‘, ‘ב, ‘÷‘, ‘(‘, ‘)‘, ‘=‘};
2     private static char[][] signPriority = new char[][]{{‘>‘, ‘>‘, ‘<‘, ‘<‘, ‘<‘, ‘>‘, ‘>‘},
3             {‘>‘, ‘>‘, ‘<‘, ‘<‘,‘<‘, ‘>‘, ‘>‘}, {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘, ‘>‘}, {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘<‘, ‘>‘, ‘>‘},
4 {‘<‘, ‘<‘, ‘<‘, ‘<‘,‘<‘, ‘=‘, ‘ ‘}, {‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘>‘, ‘ ‘}};

3.2、計算式子答案方法

private static Float getResult(Stack<Float> operatedNumber, Stack<Character> operatedSign) {
        int count = 0, flag=1;
        Stack<Float> tempNumber = new Stack<Float>();
        Stack<Character> tempSign = new Stack<Character>();
        Float newData = null, numberTop = null, numberNext = null, numberNextNext = null;
        Character signTop = null, signNext = null;
        while (operatedNumber.size() != 1 && operatedSign.size() != 1) {
            switch (signPriority[getPosition(operatedSign.get(operatedSign.size() - 1))][getPosition(operatedSign.get(operatedSign.size() - 2))]) {
                case ‘>‘:
                    numberTop = operatedNumber.pop();
                    numberNext = operatedNumber.pop();
                    signTop = operatedSign.pop();
                    newData = calculate(numberTop, signTop, numberNext);
                    operatedNumber.push(newData);
                    break;
                case ‘<‘:
                    numberTop = operatedNumber.pop();
                    numberNext = operatedNumber.pop();
                    numberNextNext = operatedNumber.pop();
                    signTop = operatedSign.pop();
                    signNext = operatedSign.pop();
                    if (!operatedSign.isEmpty()&& (signNext == ‘(‘ || operatedSign.get(operatedSign.size()-1)==‘(‘)) {
                        if (operatedSign.get(operatedSign.size()-1)==‘(‘) {
                            operatedSign.pop();
                            operatedNumber.push(numberNextNext);
                            flag=0;
                        }
                        else {
                            operatedNumber.add(numberNextNext);
                            operatedNumber.add(numberNext);
                        }
                        while(operatedSign.get(operatedSign.size()-1)!=‘)‘) {
                            tempSign.add(operatedSign.pop());
                            count++;
                        }
                        tempSign.push(‘=‘);
                        for (int i =0; i<count+1; i++) {
                            tempNumber.add(operatedNumber.pop());
                        }
                        tempNumber = setNumberReserve(tempNumber);
                        tempSign = setSignReserve(tempSign);
                        if (flag==1) {
                            newData = calculate(numberTop, signTop, getResult(tempNumber,tempSign));
                            operatedNumber.push(newData);
                        }
                        else {
                            newData = calculate(numberNext, signNext, getResult(tempNumber,tempSign));
                            operatedNumber.push(newData);
                            operatedNumber.push(numberTop);
                            operatedSign.push(signTop);
                        }
                    }
                    else {
                        newData = calculate(numberNext, signNext, numberNextNext);
                        operatedSign.push(signTop);
                        operatedNumber.push(newData);
                        operatedNumber.push(numberTop);
                    }
                    break;
                case ‘=‘:
                    operatedSign.pop();
                    operatedSign.pop();
                    break;
                default:
                    break;
            }
        }
        return operatedNumber.get(0);
    }

  

4.遇到的問題

1.某些式子算出的答案會出現負數,不符合題目要求;

解決方法;1.重新生成一個不是負數的式子,方法不太好,但是比較簡單。2.避免減法出現的負數,但是由於是先生成式子,在進行計算,有一些比較長的式子,如100÷50+3-2等之類的的式子,避免負數的出現比較麻煩,因為負數不是直接因為3-2生成的。

2.計算結果的答案不正確;

入棧出棧沒設計好,邏輯不夠清晰,經過代碼調試,解決問題。

3.生成分數的控制

分數約分問題,有點麻煩,暫時沒解決。

小學四則運算“軟件”之初版