第一次結對做業

1、預估與實際

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 15 20
• Estimate • 估計這個任務須要多少時間 800 1000
Development 開發 600 600
• Analysis • 需求分析 (包括學習新技術) 30 60
• Design Spec • 生成設計文檔 20 30
• Design Review • 設計複審 10 30
• Coding Standard • 代碼規範 (爲目前的開發制定合適的規範) 10 10
• Design • 具體設計 30 40
• Coding • 具體編碼 400 500
• Code Review • 代碼複審 20 15
• Test • 測試(自我測試,修改代碼,提交修改) 60 45
Reporting 報告 60 60
• Test Repor • 測試報告 30 30
• Size Measurement • 計算工做量 20 15
• Postmortem & Process Improvement Plan • 過後總結, 並提出過程改進計劃 20 30
合計 1000

2、需求分析

  • 題號:數字 + 一對英文括號
  • 題目:數字、符號之間空一格
  • 題號與題目之間也須要加一空格,行末不須要加空格

3、設計

1. 設計思路

  • 先將數據與運算符隨機出來,而後隨機出括號位置,而後將括號內的數據運算出結果,而後代入算術式中,以此來消除掉括號
  • 而後寫出一個能夠運算無括號狀況下的四則運算式的函數,運算括號內的數據,以及最終結果

2. 實現方案

  • 準備工做:先在Github上建立倉庫,克隆到本地...
  • 技術關鍵點:如何實現無括號狀況下的四則運算

4、編碼

  • 首先我要解決的問題是,如何運算無括號的四則運算式
  • 我一樣只用優先級的方法,寫出Operation函數,先將* / 這種優先級較高的運算符運算,而後將運算過的符號與數值變爲null,而後調用去除null的函數,將null移動至數組最後一位
  • 而後剩下的只有加減法,依次運算既可得出結果
  • 而後咱們須要考慮括號因素,我打算先隨機出括號的位置,與括號中的符號的數量,而後將括號內的數值與符號存入另外一個數組,而後通過Operation函數運算,得出answer,而後將這些運算過的數值符號賦值null,調用removenull函數去除null
  • 而後我將已經去除括號的運算式再次使用Operation函數運算出結果
  • 如今咱們將數值與符號存入咱們事先準備好的函數,而後將括號根據咱們隨機的位置 符號數量,添加進數組裏面,最終便可輸出數組

1. 調試日誌

  • 編碼過程當中無數次遇到數組越界,空指針等現象,爲了解決這種現象,我將數組輸出的哪個數單獨println出來,觀察是否越界,而後進行修改算法。

2. 關鍵代碼

public static double Operation(String[] OpeMarkStrNumber, String[] OpeNumber) {            //首先遍歷一遍存儲運算符的數組,尋找到* /這種優先級較高的運算符,運算出結果,而後將運算過的符號與數值改成null,而後使用去除null的函數,去掉null數據
        while(true) {
            int PMAmount = 0;
            
            for(int i = 0; i < OpeMarkStrNumber.length-1; i++) {
                
                if(OpeMarkStrNumber[i] == "*") {
                    
                    double ans = Double.parseDouble(OpeNumber[i]) * Double.parseDouble(OpeNumber[i+1]);
                    
                    OpeNumber[i] = String.valueOf(ans);
                    OpeNumber[i+1] = null;
                    OpeMarkStrNumber[i] = null;
                    OpeNumber = RemoveNull(OpeNumber);
                    OpeMarkStrNumber = RemoveNull(OpeMarkStrNumber);
                    
                    PMAmount++;
                    break;
                    
                }else if(OpeMarkStrNumber[i] == "/") {
                    
                    double ans = Double.parseDouble(OpeNumber[i]) / Double.parseDouble(OpeNumber[i+1]);
                    OpeNumber[i] = String.valueOf(ans);
                    OpeNumber[i+1] = null;
                    OpeMarkStrNumber[i] = null;
                    OpeNumber = RemoveNull(OpeNumber);
                    OpeMarkStrNumber = RemoveNull(OpeMarkStrNumber);
                    PMAmount++;
                    break;
                }
            }
            
            if(PMAmount == 0) {
                break;
            }
        }
        return PlusMinus(OpeMarkStrNumber, OpeNumber);
    }
    
    public static double PlusMinus(String[] OpeMarkStrNumber, String[] OpeNumber) {       //當乘除法被消除完以後,能夠依次運算加減法,最終得出結果

        int PMmarkNo = 0;
        double ans = Double.parseDouble(OpeNumber[0]) ;
        while(true) {
            if(OpeMarkStrNumber[PMmarkNo] == "+") {
                ans = ans + Double.parseDouble(OpeNumber[PMmarkNo+1]);
                PMmarkNo++;
            }else if(OpeMarkStrNumber[PMmarkNo] == "-"){
                ans = ans - Double.parseDouble(OpeNumber[PMmarkNo+1]);
                PMmarkNo++;
            }else if(OpeMarkStrNumber[PMmarkNo] == null){
                return ans;
            }
        }
    }
    
    
    public static String[] RemoveNull(String[] target) {     //去除null 函數,將數組中的null移動至數組後面
        for(int i = 0; i < target.length; i++) {
            if(target[i] == null) {
                for(int j = i; j < target.length; j++) {
                    if(j != target.length-1) {
                        target[j] = target[j+1];
                    }else {
                        target[j] = null;
                    }
                }
            }
        }
        return target;
    }

這一段代碼主要實現了無括號狀況下的四則運算,可使用這段代碼將一個括號內的數據運算出結果,使得這個運算式去掉括號,而後在講無括號的運算式放進這個函數裏面就可運算出結果。算法

3. 代碼規範

  • 第一條:不容許任何魔法值(即未經預先定義的常量)直接出如今代碼中。
  • 第二條:大括號的使用約定。若是是大括號內爲空,則簡介地寫成{}便可,不須要換行;若是是非空代碼塊則:左大括號前不換行。左大括號後換行。右大括號前換行。右大括號後還有 else 等代碼則不換行;表示終止的右大括號後必須換行。
  • 第三條:左小括號和字符之間不出現空格;一樣的,有小括號和字符之間也不出現空格。
  • 第四條:在 if/else/for/while/do 語句中必須使用大括號。
  • 第五條:任何二目、三木運算符的左右兩邊都須要加一個空格。
  • 第六條:單行字符數限制不超過120個,超出須要換行,換行時遵循以下原則:第二行相對第一行縮進 4 個空格,從第三行開始,再也不繼續縮進,參考示例。運算符與下文一塊兒換行。方法調用的點符號與下文一塊兒換行。方法調用時,多個參數,須要換行時,在逗號後進行。

5、測試

  • 輸入5 3
  • 輸出
  • (1)10*(17-7)=
  • (2)18*9/3=
  • (3)16*3-2-10=
  • (4)20/(16-15)=
  • (5)20-16-18/9=
  • ------------------標準答案------------------
  • (1)10*(17-7)=100.0
  • (2)18*9/3=54.0
  • (3)16*3-2-10=36.0
  • (4)20/(16-15)=20.0
  • (5)20-16-18/9=2.0

6、總結

  • 我這一個做業學到的最重要的一點是將代碼的每一項功能都做爲一個函數寫,這樣能夠很是方便新建立一個class而後進行測試,這樣能夠輕鬆控制輸入的數據,能夠考慮各類極端狀況,並且這樣調試也有利於方便觀察,不容易亂。
相關文章
相關標籤/搜索