四則運算器(帶括號和分數)的Java實現


一 psp 表格

PSP2.1 Personal Software Process Stages 預估耗時(分鍾) 實際耗時(分鍾)
Planning 計划 10 8
· Estimate · 估計這個任務需要多少時間 10 8
Development 開發 655 785
· Analysis · 需求分析 (包括學習新技術) 30 35
· Design Spec · 生成設計文檔 30 60
· Design Review · 設計復審 (和同事審核設計文檔) 10 15
· Coding Standard · 代碼規范 (為目前的開發制定合適的規范) 5 5
· Design · 具體設計 40 60
· Coding · 具體編碼 5h*60 12h*60
· Code Review · 代碼復審 1h*60 1.5h*60
· Test · 測試(自我測試,修改代碼,提交修改) 3h*60 2h*60
Reporting 報告 290 330
· Test Report · 測試報告+博客 4h*60 4.5h*60
· Size Measurement · 計算工作量 10 10
· Postmortem & Process Improvement Plan · 事后總結, 並提出過程改進計划 40 50
合計 955 1123

二 項目要求

1.小學四則運算題目,結果不能出現負數

2.支持真分數運算

3.支持帶括號的多元復合運算

4.批量生成,可選擇運算符,可選擇數字范圍,可選擇數字個數

三 解題思路

   1.列出隨機的四則運算表達式 (表達式添加有意義的括號)
   2.根據表達式得出正確結果 
   3.關於真分數,可以在最后把÷轉換成/

四 解決

1. 生成表達式

1. 如何添加有意義括號(如何判斷有意義?)
2. 分母為0無意義

參考
https://github.com/wapleeeeee/Arithmetic-operation/blob/master/homework2.py
https://blog.csdn.net/weixin_30822451/article/details/98153506
​ 坑1:使用String的超過10的話 10被當作兩個字符,插入括號時候出問題
​ 坑2: 1/2/3 這種式子的出現

2.計算表達式

1. 如何支持真分數運算?
2. 中綴表達式 轉 后綴表達式 
3. 計算表達式 (數據結構的使用)

參考
https://github.com/kiprobinson/BigFraction
https://www.cnblogs.com/menglong1108/p/11619896.html
https://zhuanlan.zhihu.com/p/150684393
真分數出現 55/1 需要對/1進行去除

        String answer = stack.pop();
        if (answer.substring(answer.length()-2).equals("/1")){
            return answer.substring(0,answer.length()-2);

五 具體程序設計

1.總體設計

2.具體程序設計

1.Equation類

  類Equation用於保存每一個表達式的屬性

成員變量

變量名 類型 功能
equz String 中綴表達式
equh String 后綴表達式
answer String 表達式值

成員方法

函數名 輸入 輸出 依賴函數 功能
setEquz String equ 自定義中綴表達式
setEquh String equ 自定義后綴表達式
getEquzAnswer String equ String answer 計算中綴表達式值
getEquhAnswer String equ String answer 計算后綴表達式值

2.Utils類

  類Utils用於生成表達式已經計算表達式,添加括號等功能

成員變量

變量名 類型 功能
op list 保存運算符

成員方法

函數名 輸入 輸出 依賴函數 功能
getRglEquation int num,start,end String equ 生成無括號表達式
insertBracke String equ String equ 為無括號表達式插入括號
epuToList String equ List equ 表達式轉換為列表
getBrcEquation int num,start,end String equ insertBracke 生成有括號表達式
parseSuffixExpressionList List equ List equ 中綴轉后綴
calculat List equ String answer BigFraction 計算表達式的值

六 重點代碼說明

運行結果

七 單元測試

1.測試函數均通過

2.具體測試

1. getRglEquation函數

測試函數如下 獲取無括號表達式

    public void getRglEquation() {
        int num; // 隨機2-7個數字生成
        int start = 1;
        int end = 9;
        String str;
        for (int i = 0; i < 1000000; i++) {
            num = (int) (Math.random() * 5) + 2;
            str = utils.getRglEquation(num, start, end);
        }
    }

測試了100W次隨機生成的不帶括號字符串,用時500ms。

2. getBrcEquation函數

測試函數如下 獲取有括號表達式

    public void getBrcEquation() {
        int num; // 隨機2-7個數字生成
        int start = 1;
        int end = 9;
        String str;
        for (int i = 0; i < 1000000; i++) {
            num = (int) (Math.random() * 5) + 2;
            str = utils.getBrcEquation(num, start, end);
        }
    }

測試了100W次隨機生成的帶括號字符串,用時777ms。

3. calculate函數

測試函數如下 計算后綴表達式

    public void calculate() {
        int num; // 隨機2-7個數字生成
        int start = 1;
        int end = 9;
        String str;
        for (int i = 0; i < 1000000; i++) {
            num = (int) (Math.random() * 5) + 2;
            str = utils.getBrcEquation(num, start, end);
            List list1 = utils.epuToList(str);
            List list2 = utils.parseSuffixExpressionList(list1);
            String answer = utils.calculate(list2);
        }
    }

測試了100W次隨機生成的帶括號字符串,用時7s。

八 效能分析與改進

九 代碼更新

坑1: list toString 會把[] 空格 ,算進字符串
解決:添加一個方法去除 listToString中的[],空格

    public String toSimpleStr(List<String> equ) {
        return equ.toString().replaceAll("(?:\\[|,|null|\\]| +)", "");
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM