一 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|\\]| +)", "");
}
