1. 程式人生 > >感謝為了我們寫代碼瘋狂提需求的小學生家長!!!心累

感謝為了我們寫代碼瘋狂提需求的小學生家長!!!心累

alt 日誌 pla val 代碼規範 person 擴展 解決問題 輸出

快樂的二人組

211506368霍金池211606359戴俊涵

一、預估與實際

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

二、需求分析

我通過萬能的度娘了解到,小學一年級數學有如下的幾個特點:

  • 特點1
    都是正整數,範圍在0-100以內
  • 特點2
    乘除應該滿足乘法表且不能有余數
  • 特點3
    小學三年級四則混合運算包括隨機的括號產生
    經過分析,我認為,這個程序應當:

  • 還要判斷輸入的不是正常數的報錯情況
  • 得數不能有小數
  • 小學二年級是10以內的乘法口訣表的乘除法
  • 小學三年級的運算需要判斷符號優先級

三、設計

1. 設計思路

  • 首先輸入參數判斷年級還有題數,判斷參數的輸入是否符合題目要求
  • 隨機生成符號,並且當出現負數小數時舍去的情況
  • 四則運算方法,以及分母為0的情況等
  • out.txt文本的建立和寫入

2. 實現方案

寫出具體實現的步驟

  • 準備工作:先在Github上創建倉庫,然後fork,clone到本地並且下載git創建文件等
  • 技術關鍵點:關於文本創建的一系列方法,清空文本的數據方法,以及判斷是一年級還是二年級的方法
  • 對於三年級括號的添加運算
  • 對於優先級的判斷為:輸出:如果第二位符號是乘除法 要做特殊處理,即第一運算符號左右的數字前後加上括號,運算:

    四、編碼

  • 掃描鍵盤輸入
  • 創建文件
  • 判斷題目數量範圍是否正確是否符合
  • 定義四則運算方法
  • 判斷文件創建是否異常

1. 調試日誌

結果出現小數,然後我們直接調整為整數
題目中出現負數,沒有想到解決辦法,我們在隨機數中定義了範圍,結果不起作用
優先級出現問題,排版有點亂,找了一會改好的

2. 關鍵代碼

...
*/
private static String[][] buildQuestion(int count, int grade){
//運算符號範圍
int operate = 0;
//如果題目數量為負數
if(count < 0){
count = 1;
}
//如果年級為負數
if(grade <= 1){
operate = 0;
}else if(grade == 2){
operate = 2;
}else{
operate = 3;
}
//基數
int limited = 149 - grade / 25;
//隨機數工具
Random random = new Random();

          int firstNum = 0;         
          int secondNum = 0;            
          int  thirdNum = 0;            

           int firstOperate = 0;        
           int  secondOperate = 0;      

           int result = 0;          


           //二維數組, 其第二維度 依次存放的是  數字、運算、數字、運算、數字、結果
           String[][] titleArr = new String[count][6];
           for (String[] arr : titleArr) {
        //第一位運算數字
        firstNum = random.nextInt(99) + 1;
        //第二位運算數字
        secondNum = random.nextInt(99) + 1;
        //第三位運算數字
        thirdNum = random.nextInt(99) + 1;

        //第一位符號 0:+ 1:- 2:× 3:÷ 
        firstOperate = random.nextInt(4);
        //第二位符號 0:+ 1:- 2:× 3:÷ 4:四則運算
        secondOperate = random.nextInt(2) + operate;
        if(grade == 3){
            secondOperate = 4;
        }

        switch(secondOperate){
        case 0:
            //加法
            firstOperate = secondOperate;
            arr[firstOperate_index] = paraseOperateStr(firstOperate);
            arr[firstNum_index] = String.valueOf(firstNum);
            arr[thirdNum_index] = String.valueOf(secondNum);
            arr[result_index] = calculate(firstNum, secondNum, firstOperate);
            break;

        case 1:
            //減法
            firstOperate = secondOperate;
            arr[firstOperate_index] = paraseOperateStr(firstOperate);
            arr[firstNum_index] = String.valueOf(firstNum);
            arr[secondNum_index] = String.valueOf(secondNum);
            arr[result_index] = calculate(firstNum, secondNum, firstOperate);
            break;

        case 2:
            //乘法
            firstOperate = secondOperate;
            arr[firstOperate_index] = paraseOperateStr(firstOperate);
            arr[firstNum_index] = String.valueOf(firstNum);
            arr[secondNum_index] = String.valueOf(secondNum);
            arr[result_index] = calculate(firstNum, secondNum, firstOperate);
            break;

        case 3:
            //除法
            firstOperate = secondOperate;
            arr[firstOperate_index] = paraseOperateStr(firstOperate);
            //判斷分母不能為0,如果是0,則重新取值
            while(secondNum == 0){
                secondNum = random.nextInt(limited) + 1;
            }
            //余數
            int remainder = (firstNum % secondNum);
            if(remainder == 0){
                arr[result_index] = calculate(firstNum, secondNum, firstOperate);
            }else{
                arr[result_index] = calculate(firstNum, secondNum, firstOperate) + "..." + String.valueOf(remainder);
            }
            arr[firstNum_index] = String.valueOf(firstNum);
            arr[secondNum_index] = String.valueOf(secondNum);
            break;

        case 4:
            //運算符重新取值
            secondOperate = random.nextInt(4);
            //如果第一個符號的優先相等或高,則不用做括號處理
            if(compareOperate(firstOperate, secondOperate) >= 0){
                //如果第一位符號是除法 要做特殊處理
                if(firstOperate == 3){
                    while((firstNum % secondNum) != 0 || result == 0){
                        firstNum = random.nextInt(limited);
                        //防止除數為0
                        secondNum = random.nextInt(limited) + 1;
                        result = firstNum / secondNum;
                    }
                    result = firstNum / secondNum;
                    //第二位是乘法和除法
                    if(secondOperate == 3 || secondOperate == 2){
                        //如果第二位符號是除法 要做特殊處理
                        if(secondOperate == 3){
                            while((result % thirdNum)!=0 || result/thirdNum==0){
                                thirdNum = random.nextInt(limited) + 1;
                            }
                        }
                        //填充數據
                        arr[secondNum_index] = String.valueOf(secondNum);
                        arr[thirdNum_index] = String.valueOf(thirdNum);
                        
                        arr[result_index] = calculate(result, thirdNum, secondOperate);
                    }else{
                        //加法和減法的操作處理
                        result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
                        //逆推
                        int temp = random.nextInt(20);
                        firstNum = temp * result;
                        arr[secondNum_index] = "( " + String.valueOf(secondNum);
                        arr[thirdNum_index] = String.valueOf(thirdNum) + " )";
                        arr[result_index] = String.valueOf(temp);
                    }
                }else{
                    result = Integer.valueOf(calculate(firstNum, secondNum, firstOperate));
                    //填充數據
                    arr[secondNum_index] = String.valueOf(secondNum);
                    arr[thirdNum_index] = String.valueOf(thirdNum);
                    arr[result_index] = calculate(result, thirdNum, secondOperate);
                }
                arr[firstNum_index] = String.valueOf(firstNum);
                arr[firstOperate_index] = paraseOperateStr(firstOperate);
                arr[secondOperate_index] = paraseOperateStr(secondOperate);
            }else{
                //優先級低的處理,既加括號
                result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
                if(firstOperate == 3){
                    //如果此時result等於0,則重新取值
                    while(result == 0){
                        secondNum = random.nextInt(limited);
                        //防止出現除數為0的情況
                        thirdNum = random.nextInt(limited) +1;
                        result = Integer.valueOf(calculate(secondNum, thirdNum, secondOperate));
                    }
                    //此時除數可能很大,所以應該逆推
                    int temp = random.nextInt(20);
                    
                    arr[firstNum_index] = calculate(result, temp, 2);
                    arr[result_index] = String.valueOf(temp);
                }else{
                    if(secondNum == 3){
                        while(secondNum % thirdNum !=0){
                            secondNum = random.nextInt(limited) + 1;
                            thirdNum = random.nextInt(limited) + 1;
                        }
                    }else{
                        arr[firstNum_index] = String.valueOf(firstNum);
                        arr[result_index] = calculate(firstNum, result, firstOperate);
                    }
                }
                arr[secondNum_index] = String.valueOf(secondNum);
                arr[thirdNum_index] = String.valueOf(thirdNum);
                arr[firstOperate_index] = paraseOperateStr(firstOperate);
                arr[secondOperate_index] = paraseOperateStr(secondOperate);
            }
            break;
        }

...

3. 代碼規範

請給出本次實驗使用的代碼規範:

1.左大括號前不換行,後換行,右括號前換行。
2.源代碼文件以文件內容中的最頂層的Java類命名,而且大小寫敏感,文件擴展名為 .java,同時,文件的編碼格式統一為UTF-8。

五、測試

輸入 輸出 是否符合要求
100,3 題目數量是否正確
100,1 一年級題目是否符合規範
100,2 二年級題目是否符合規範
100,3 三年級題目是否符合規範

六、總結

通過這次實驗,培養了我們團隊合作完成項目的能力。在遇到難題時,可以有懂得項目的人相互交流,從而提高解決問題的效率。同時,作業難度的提高,使得我們更加心有余而力不足,事實證明,我們的操作水平還是有所欠缺,有很大的提高潛力。

七、結對照片

技術分享圖片

感謝為了我們寫代碼瘋狂提需求的小學生家長!!!心累