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道题目,每道题5分,答对一题“当前得分”加5分,共100分。如下图所示:

(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的效果在此次得到了充分的展现。个人项目由于个人想法单一、片面,虽然也能完成,但不够多彩。结对项目由于两个人的思想碰撞,得到了更加绚丽多彩的火花,使得项目内容更加充实,完整,完成效果更加饱满多姿,时间上也节约了许多。我们的最终的完成效果我们也还是挺满意的,界面的美化改进,我的搭档也比较满意,但是由于我们两个人的能力问题,本次设计的功能不是特别全面,没有增加附加功能,以后继续努力,希望在以后的学习中能够实现!

 

posted @ 2018-04-03 20:07  南巷暖栀  阅读(166)  评论(0编辑  收藏  举报