1. 程式人生 > >201571030308/201571030328《小學生四則運算練習軟件》結對項目報告

201571030308/201571030328《小學生四則運算練習軟件》結對項目報告

補齊 建設 編程 ole ++ hit 交互界面 txt 生成

一、項目源碼

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《小學生四則運算練習軟件》結對項目報告