感謝為了我們寫代碼瘋狂提需求的小學生家長!!!心累
快樂的二人組
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 | 三年級題目是否符合規範 | 是 |
六、總結
通過這次實驗,培養了我們團隊合作完成項目的能力。在遇到難題時,可以有懂得項目的人相互交流,從而提高解決問題的效率。同時,作業難度的提高,使得我們更加心有余而力不足,事實證明,我們的操作水平還是有所欠缺,有很大的提高潛力。
七、結對照片
感謝為了我們寫代碼瘋狂提需求的小學生家長!!!心累