對對對
211606375 牛振乾
211606351 曾茜
一、預估與實際
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
• Estimate | • 估計這個任務需要多少時間 | 40 | |
Development | 開發 | 900 | 1000 |
• Analysis | • 需求分析 (包括學習新技術) | 60 | 100 |
• Design Spec | • 生成設計文檔 | 90 | |
• Design Review | • 設計複審 | ||
• Coding Standard | • 代碼規範 (為目前的開發制定合适的規範) | 20 | 30 |
• Design | • 具體設計 | 200 | 230 |
• Coding | • 具體編碼 | 400 | |
• Code Review | • 代碼複審 | ||
• Test | • 測試(自我測試,修改代碼,送出修改) | ||
Reporting | 報告 | ||
• Test Repor | • 測試報告 | ||
• Size Measurement | • 計算工作量 | ||
• Postmortem & Process Improvement Plan | • 事後總結, 并提出過程改進計劃 | ||
合計 | 1130 |
二、需求分析
我通過百度的方式了解到,國小三年級數學有如下的幾個特點:
- 有混合運算
- 可以有括号的出現
經過分析,我認為,這個程式應當:
- 減法運算的結果不能有負數
- 除法運算除數不能為0,不能有餘數
- 運算符在2~4個
- 可以有括号
三、設計
1. 設計思路
說明你如何設計這個程式
類圖
中綴轉字尾程式流程圖(好難啊這個)

2. 實作方案
中綴表達式轉換為字尾表達式
你需要設定一個棧SOP,和一個線性表 L 。SOP用于臨時存儲運算符和分界符( ,L用于存儲字尾表達式。
周遊原始表達式中的每一個表達式元素
(1)如果是操作數,則直接追加到 L中。隻有 運算符 或者 分界符( 才可以存放到 棧SOP中
(2)如果是分界符
Ⅰ 如果是左括号 ( , 則 直接壓入SOP,等待下一個最近的 右括号 與之配對。
Ⅱ 如果是右括号),則說明有一對括号已經配對(在表達式輸入無誤的情況下)。不将它壓棧,丢棄它,然後從SOP中出棧,得到元素e,将e依次追加到L裡。一直循環,直到出棧元素e 是 左括号 ( ,同樣丢棄他。
(3)如果是運算符(用op1表示)
Ⅰ如果SOP棧頂元素(用op2表示) 不是運算符,則二者沒有可比性,則直接将此運算符op1壓棧。 例如棧頂是左括号 ( ,或者棧為空。
Ⅱ 如果SOP棧頂元素(用op2表示) 是運算符 ,則比較op1和 op2的優先級。如果op1 > op2 ,則直接将此運算符op1壓棧。
如果不滿足op1 > op2,則将op2出棧,并追加到L,重複步驟3。
也就是說,如果在SOP棧中,有2個相鄰的元素都是運算符,則他們必須滿足:下層運算符的優先級一定小于上層元素的優先級,才能相鄰。
最後,如果SOP中還有元素,則依次彈出追加到L後,就得到了字尾表達式。
摘抄自【算法】表達式求值--逆波蘭算法介紹
四、編碼
請說明你如何按照設計思路進行編碼,并記錄你在開發中遇到的問題,與解決過程
1. 調試日志
記錄編碼調試的日志,請記錄下開發過程中的 debug 曆程
比如:
- 将代碼全部設為靜态私有變量,友善使用
- 在逆波蘭方法中要設立優先級。
2. 關鍵代碼
private static String ReversePolish (String[] strArr){
String str = "+-*/";
Stack<String> stack = new Stack<String>();
//周遊數組中的每一個元素
for(String s : strArr){
//如果是數字,放入棧中
if(!str.contains(s)){
stack.push(s);
}
else{
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
switch(s){
case "+" :
stack.push(String.valueOf(a+b));
break;
case "-" :
stack.push(String.valueOf(a-b));
break ;
case "*" :
stack.push(String.valueOf(a*b));
break;
case "/" :
stack.push(String.valueOf(a/b));
break ;
}
}
}
return stack.pop();
}```
### 3. 代碼規範
- 減少代碼嵌套層次
- 盡量不用參數來帶回方法運算結果
- 避免變量的定義與上一層作用域的變量同名
- 避免使用類似的名字,或者僅僅是大小寫不同的名字
- 循環計數器 通常采用字母 i,j,k 或者 counter 都可以接受。
## 五、測試
測試的輸出結果

## 六、總結
結對作業确實能從一定程度上提高了我們完成作業的效率,但是從另一方面看起來又有新的問題出現。比如兩個人的意見出現分叉,兩個人都不會寫某個方法等等。由于我們是男女生混合,并沒有很多的時間當面讨論,更多情況隻能通過語音在qq上截圖交流,是以沒有結對工作照的我們隻能挂上語音截圖了,個人感覺這并不是很影響我們的溝通。還有令人頭疼的問題就是,之前的沒學清楚又有新的東西要開始看,新的資料一份接着一份...加上其他課程的作業,有的時候真的會煩躁靜不下心。和隊友的配合還是要多磨合,還要花時間去适應這種學習方式。
