天天看點

作業2

對對對

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

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 都可以接受。


## 五、測試

測試的輸出結果
![](https://img2018.cnblogs.com/blog/1472315/201809/1472315-20180918233748535-785905893.png)


## 六、總結

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