201571030308/201571030328《小學生四則運算練習軟件》結對項目報告
一、項目源碼
https://github.com/ijinping/demo2
二、項目報告
1、需求分析
(1)由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分;
(2)題庫文件可采用實驗二的方式自動生成,也可以手工編輯生成,文本格式如下:
(3)程序為用戶提供三種進階四則運算練習功能選擇:百以內整數算式(必做)、帶括號算式、真分數算式練習;
(4)程序允許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,示例如下:
(5)程序記錄用戶答題結果,當程序退出再啟動的時候,可為用戶顯示最後一次測試的結果,並詢問用戶可否進行新一輪的測試;
(6)測試有計時功能,測試時動態顯示用戶開始答題後的消耗時間。
(7)程序人機交互界面是GUI界面(WEB頁面、APP頁面都可),界面支持中文簡體(必做)/中文繁體/英語,用戶可以進行語種選擇。
三.實現程度
因為小組基礎能力較差,只是初步實現了試題隨機生成,以及校驗功能,未能實現程序允許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,在此向老師做深刻檢討,會盡快努力補齊以前遺留知識問題。
四.程序流程圖
五.核心代碼展示
<界面設計>
public void init(){
setLayout(null);
setSize(450,630);
labRule.setText("規則:每組二十道題,每題5分,按ENTER鍵開始,小數保留2位");
labRule.setBounds(36, 10, 390, 72);
labRule.setFont(new Font("Dialog",Font.PLAIN,12));
getContentPane().add(labRule);
labA.setText("x");
labA.setBounds(36,82,36,36);
labA.setFont(new Font("Dialog",Font.PLAIN,24));
getContentPane().add(labA);
labOp.setText("+");
labOp.setFont(new Font("Dialog",Font.PLAIN,24));
labOp.setBounds(72, 82, 45, 36);
getContentPane().add(labOp);
labB.setText("y");
labB.setFont(new Font("Dialog",Font.PLAIN,24));
labB.setBounds(118, 82, 33, 36);
getContentPane().add(labB);
label5.setText("=");
label5.setFont(new Font("Dialog",Font.PLAIN,24));
label5.setBounds(168, 82, 24, 36);
getContentPane().add(label5);
labWarn.setFont(new Font("Dialog",Font.PLAIN,12));
labWarn.setBackground(Color.RED);
labWarn.setBounds(320, 82, 80, 36);
labWarn.setVisible(false);
getContentPane().add(labWarn);
labQues.setText("答題列表:");
labQues.setFont(new Font("Dialog",Font.PLAIN,12));
labQues.setBounds(36, 148, 100, 20);
getContentPane().add(labQues);
labResult.setText("分數統計:");
labResult.setFont(new Font("Dialog",Font.PLAIN,12));
labResult.setBounds(36,420,100,20);
labResult.setVisible(false);
getContentPane().add(labResult);
txtAnswer.setFont(new Font("Dialog",Font.PLAIN,24));
txtAnswer.setBounds(216, 82, 100, 36);
getContentPane().add(txtAnswer);
listDisp.setFont(new Font("Dialog",Font.PLAIN,16));
listDisp.setBounds(36, 174, 282, 230);
getContentPane().add(listDisp);
listScore.setFont(new Font("Dialog",Font.PLAIN,16));
listScore.setBounds(36,450,282,135);
MyKey myKey=new MyKey();// 答案輸入框,鍵盤按鍵監聽類
txtAnswer.addKeyListener(myKey);
}
<題目生成>
public void keyReleased(KeyEvent e) {
}
}
int a=0,b=0;
String op="";
double result=0;
DecimalFormat df=new DecimalFormat("#.00");
/**
* 出題方法
* @param e
*/
public void updateQuestion(ActionEvent e){
if(isFirst){
startTime=System.currentTimeMillis();
}
if(isOver==true){
listDisp.clear();
listScore.clear();
labResult.setVisible(false);
listScore.setVisible(false);
}
isOver=false;
a=(int)(Math.random()*9+1);
b=(int)(Math.random()*9+1);
int c=(int)(Math.random()*4);
switch (c) {
case 0:
op="+";
result=a+b;
break;
case 1:
op="-";
result=a-b;
break;
case 2:
op="*";
result=a*b;
break;
case 3:
op="/";
result=(a*1.0)/b;
//若兩個數除不盡,則按四舍五入保留2位小數
if(String.valueOf(result).length()>10){
result=Double.parseDouble(df.format((a*1.0)/b));
}
break;
}
labA.setText(String.valueOf(a));
labB.setText(String.valueOf(b));
labOp.setText(op);
label5.setText("=");
txtAnswer.setText("");
isFirst=false;
}
<判斷結果>
public void judge(ActionEvent e){
try{
double value=Double.parseDouble(txtAnswer.getText());
String resultStr=(total+1)+"、 "+a+op+b+"="+value;
if(value==result){
resultStr+=" \t正確";
right++;
score+=5;
}else{
resultStr+=" \t錯誤 正確答案:"+result;
error++;
}
listDisp.add(resultStr);
total++;
}catch(NumberFormatException ignored){
}
}
<統計分數>
public void scorePerformed(ActionEvent e){
isOver=true;
listScore.clear();
listScore.setVisible(true);
String exitStr="本次共答題"+total+"道";
listScore.add(exitStr);
listScore.add("累計用時:"+(System.currentTimeMillis()-startTime)/1000+"秒");
listScore.add("答對:"+right+"個");
listScore.add("答錯:"+error+"個");
listScore.add("得分:"+score+"分");
getContentPane().add(listScore);
score=0;
right=0;
error=0;
total=0;
}
<校驗輸入是否位數字>
public boolean isNumber(String numberStr){
boolean isNumber=true;
try{
Double.parseDouble(numberStr);
}catch(NumberFormatException e){
isNumber=false;
}
return isNumber;
}
六.程序運行
七.結對夥伴
八.此次結對作業的PSP
PSP2.1 | 任務內容 | 計劃完成的時間(min) | 實際完成需要的時間(min) |
---|---|---|---|
PLanning | 計劃 | 50 | 80 |
Estimate | 估計這個任務需要多少時間,並規劃大致工作步驟 | 40 | 60 |
Developmet | 開發 | 600 | 800 |
Analysis | 需求分析(包括學習新技術) | 30 | 40 |
Design Spec | 生成設計文檔 | 20 | 25 |
Design Revie | 設計復審(和同事審核設計文檔) | 20 | 30 |
Coding Standard | 代碼規範 | 120 | 240 |
Design | 具體設計 | 60 | 80 |
Coding | 具體編碼 | 300 | 420 |
Code Review | 代碼復審 | 30 | 40 |
Test | 測試(自我測試,修改代碼,提交修改) | 20 | 30 |
Reporting | 報告 | 30 | 40 |
Test Report | 測試報告 | 20 | 20 |
Size Measurement | 計算工作量 | 20 | 30 |
Postmortem & Process Improvement Plan | 事後總結,並提出過程改機計劃 | 40 | 45 |
九.對小夥伴的點評
我的夥伴不僅人長得帥,而且思維也非常敏捷,在遇到問題的時候總能題出建設性意見建議,和他合作很開心
十.結對編程真的能夠帶來1+1>2的效果嗎?通過這次結對編程,請談談你的感受和體會
通過此次結對實驗比起以往單個做實驗效率提高了許多,並且也充滿了許多樂趣,感覺編程也不是那麽枯燥的,而且遇到問題是,我們總能討論解決,雖然偶爾有爭吵,不過我們總能達成一致意見。
201571030308/201571030328《小學生四則運算練習軟件》結對項目報告