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

2015710301120/201571030119《小學四則運算練習軟件》結對項目報告

ron AR else blog 隨機選擇 tga oid 困難 pack

一、項目源碼

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