2015710301120/201571030119《小學四則運算練習軟件》結對項目報告
一、項目源碼
Github地址:https://github.com/myGitHub1018/Student_Comput3.git
二、項目報告
1、需求分析
(1)由計算機從題庫文件中隨機選擇20道加減乘除混合算式,用戶輸入算式答案,程序檢查答案是否正確,每道題正確計5分,錯誤不計分,20道題測試結束後給出測試總分;
(2)題庫文件可采用實驗二的方式自動生成,也可以手工編輯生成,文本格式如下:
(3)程序為用戶提供三種進階四則運算練習功能選擇:百以內整數算式(必做)、帶括號算式、真分數算式練習;
(4)程序允許用戶進行多輪測試,提供用戶多輪測試分數柱狀圖,示例如下:
(5)程序記錄用戶答題結果,當程序退出再啟動的時候,可為用戶顯示最後一次測試的結果,並詢問用戶可否進行新一輪的測試;
(6)測試有計時功能,測試時動態顯示用戶開始答題後的消耗時間。
(7)程序人機交互界面是GUI界面(WEB頁面、APP頁面都可),界面支持中文簡體(必做)/中文繁體/英語,用戶可以進行語種選擇。
2、軟件設計
類圖如下:
(1)Calculator( )類:主函數類;定義各種組件,初始化界面,計算答題時間,設置組件的位置和大小;綁定三個事件:開始測試、下一題、查看歷史成績。每一輪測試結束之後,在endGame( )中調用了ChartUtil( )類的addScore( )方法往成績庫中添加成績,添加成功之後再順手寫到文件中保存,下次重新打開程序的時候成績還在。
(2)Exam( )類:運算式產生與結果計算類,一輪產生20道題目,保存表達式與正確結果,然後由Question類返回運算式與輸入結果。
(3)ChartUtil( )類:統計成績類,將每一輪的總成績寫入文件(d://scores.db),從文件中加載歷史成績,創建JFreeChart對象畫
柱狀圖。
(4)Question( )類:返回表達式與輸入的結果。
(5)Scores( )類:添加歷史成績類。
3、核心功能代碼展示
(1)事件監聽器部分代碼展示
綁定了三個事件:開始測試點擊事件、下一題點擊事件、查看歷史成績點擊事件。
1 /** 2 * 綁定事件 3 */ 4 public void bindEvent() { 5 //開始測試點擊事件 6 startGame.addActionListener(new ActionListener() { 7 @Override 8 public void actionPerformed(ActionEvent e) { 9 startGame(); 10 } 11 }); 12 nextQuestion.addActionListener(new ActionListener() { 13 14 @Override 15 public void actionPerformed(ActionEvent e) { 16 String text = answer.getText(); 17 if (currentAnswer.equals(text)) { 18 point += 5; 19 } 20 doNextQuestion(); 21 } 22 }); 23 showScore.addActionListener(new ActionListener() { 24 25 @Override 26 public void actionPerformed(ActionEvent e) { 27 ChartUtil.show(); 28 } 29 }); 30 } 31 32 /** 33 * 開始測試 34 */ 35 public void startGame() { 36 startTime = new Date().getTime(); 37 time.setText("計時: 00:00"); 38 startGame.setEnabled(false); 39 question.setVisible(true); 40 answer.setVisible(true); 41 nextQuestion.setVisible(true); 42 tips.setVisible(true); 43 time.setVisible(true); 44 point = 0; 45 try { 46 Exam.buildQuestions();//隨機創建試題 47 doNextQuestion(); 48 } catch (ScriptException e) { 49 e.printStackTrace(); 50 } 51 } 52 53 public void doNextQuestion() { 54 tips.setText("當前得分:" + point + " 分"); 55 Question q = Exam.getQuestion(); 56 if (q != null) { 57 question.setText(q.getExpress().replaceAll("\\*", "×").replaceAll("/", "÷") + " ="); 58 currentAnswer = q.getAnswer(); 59 } else { 60 endGame(); 61 } 62 } 63 public static void show() { 64 ChartFrame cf = new ChartFrame("歷史成績統計圖", createChart()); 65 cf.pack(); 66 cf.setVisible(true); 67 cf.setLocationRelativeTo(null); 68 }
(2)計時器代碼展示
這部分在“測試”界面初始化的時候進行調用,當發生開始測試點擊事件時,計時器開始計時。
1 private void startTimer() { 2 new Thread() { 3 public void run() { 4 while (true) { 5 try { 6 Thread.sleep(1000); 7 long seconds = (new Date().getTime() - startTime) / 1000; 8 long min = seconds / 60; 9 long second = seconds % 60; 10 11 time.setText("計時: " + (min < 10 ? "0" + min : "" + min) + ":" + (second < 10 ? "0" + second : "" + second)); 12 } catch (InterruptedException e) { 13 e.printStackTrace(); 14 } 15 } 16 } 17 }.start(); 18 ; 19 }
(3)統計柱狀圖代碼展示
1 /** 2 * 創建JFreeChart對象 3 * @return chart 4 */ 5 public static JFreeChart createChart() { 6 StandardChartTheme standardChartTheme = new StandardChartTheme("CN"); //創建主題樣式 7 standardChartTheme.setExtraLargeFont(new Font("隸書", Font.BOLD, 20)); //設置標題字體 8 standardChartTheme.setRegularFont(new Font("宋體", Font.PLAIN, 15)); //設置圖例的字體 9 standardChartTheme.setLargeFont(new Font("宋體", Font.PLAIN, 15)); //設置軸向的字體 10 ChartFactory.setChartTheme(standardChartTheme);//設置主題樣式 11 // 通過ChartFactory創建JFreeChart 12 JFreeChart chart = ChartFactory.createBarChart( 13 "歷史成績統計圖", //圖表標題 14 "歷史成績", //橫軸標題 15 "成績(分)", //縱軸標題 16 createDataSet(), //數據集合 17 PlotOrientation.VERTICAL, //圖表方向 18 true, //是否顯示圖例標識 19 false, //是否顯示tooltips 20 false);//是否支持超鏈接 21 return chart; 22 }
4、程序運行
(1)運行文件,界面彈出“測試”框。如下圖所示:
(2)點擊開始測試按鈕後,計時器開始計時,計時器下顯示四則運算題目,用戶可在輸入答案後,點擊下一題,一輪共有20道題目。如下圖所示:
(3)每一輪測試完成之後,界面都會會彈出“消息”對話框,“消息”對話框內顯示本次測試的成績。在點擊"確定"按鈕後,用戶可以選擇點擊開始測試按鈕,進行下一輪測試,或點擊“查看歷史成績”選擇查看歷史成績。如下圖所示。
(4)點擊查看歷史成績按鈕後,每一輪的測試結果將以柱狀圖的形式,成績存放在文件(d://scores.db)中。如下圖所示(第四次和第五次測試為0分)。
5、結對編程
我們兩個人組隊後首先根據老師的項目要求仔細地討論了項目內容,進行了對此次結對項目信息的分析與設計,達成共識確定了此次項目總共有三個主要的部分:綁定事件、計時器、畫統計圖,然後進行了項目分工。我這邊主要負責在實驗二算法的基礎上進行修改,統計每一輪的測試成績,將統計結果寫入文件scores.db,方便統計圖顯示時調用,我的搭檔則負責計時器和統計圖設計方面的代碼設計編寫。在結對編程過程中,我負責的部分有許多困難,但在經過查閱網上資料和搭檔以及同學的幫助下,最終完成了此次借對項目。
6、PSP展示
PSP2.1 | 任務內容 | 計劃完成的時間(min) | 實際完成需要的時間(min) |
---|---|---|---|
PLanning | 計劃 | 120 | 100 |
Estimate | 估計這個任務需要多少時間,並規劃大致工作步驟 | 120 | 90 |
Developmet | 開發 | 480 | 600 |
Analysis | 需求分析(包括學習新技術) | 30 | 45 |
Design Spec | 生成設計文檔 | 10 | 20 |
Design Revie | 設計復審(和同事審核設計文檔) | 30 | 30 |
Coding Standard | 代碼規範 | 20 | 30 |
Design | 具體設計 | 60 | 80 |
Coding | 具體編碼 | 300 | 300 |
Code Review | 代碼復審 | 30 | 360 |
Test | 測試(自我測試,修改代碼,提交修改) | 20 | 30 |
Reporting | 報告 | 60 | 50 |
Test Report | 測試報告 | 20 | 15 |
Size Measurement | 計算工作量 | 5 | 5 |
Postmortem & Process Improvement Plan | 事後總結,並提出過程改機計劃 | 35 | 30 |
7、評價小夥伴
由於和小夥伴的關系本身比較好,我們兩個在此次項目整體上合作的比較融洽。當然,畢竟兩個人的想法不會總是相同,在探討分析階段我們在意見上還是都有點自己的小想法,思想上有點小碰撞,但通過積極討論,最終達成了意見一致的方案。查找資料、編寫代碼階段我們兩個相互學習,共同進步,最終完成了此次結對項目。在此次項目中,小夥伴一直樂觀面對,積極完成,使我學習到了許多。
8、項目總結
此次項目為結對項目,不同於以往的個人項目,1+1>2的效果在此次得到了充分的展現。個人項目由於個人想法單一、片面,雖然也能完成,但不夠多彩。結對項目由於兩個人的思想碰撞,得到了更加絢麗多彩的火花,使得項目內容更加充實,完整,完成效果更加飽滿多姿,時間上也節約了許多。我們的最終的完成效果我們也還是挺滿意的,界面的美化改進,我的搭檔也比較滿意,但是由於我們兩個人的能力問題,本次設計的功能不是特別全面,沒有增加附加功能,以後繼續努力,希望在以後的學習中能夠實現!
2015710301120/201571030119《小學四則運算練習軟件》結對項目報告