首页 > 技术文章 > 201571030119/201571030120《小学四则运算练习软件》结对项目报告

nwnu-liul 2018-04-01 11:56 原文

一、项目源码

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)运行Calculator.java文件,弹出“测试”框,如下图所示:

(2)点击开始测试按钮之后,计时器开始计时,此时显示题目,用户可输入答案,然后点击下一题,一轮有20道题目。如下图所示:

  (3)每一轮测试完成之后,会弹出“消息”对话框,显示本次测试的成绩,如下图所示。在点击确定之后,用户可以选择点击开始测试按钮,进行下一轮测试,也可以选择查看历史成绩。

  (4)点击查看历史成绩按钮,将每一轮的测试结果以柱状图的形式显示。如下图所示(第四次和第五次测试为0分)。历史成绩存放在文件(d://scores.db)中。

 

 

 

 

 

 

 

 

 

 

 

 

 

5、结对编程

   我们首先根据项目要求进行分析,确定了三个主要的部分:绑定事件、计时器、画统计图。经过详细的探讨和分析,我们设计了软件的整体框架,然后进行分工。我主要负责计时器和统计图设计方面,另一个人负责在实验二算法的基础上进行修改,统计每一轮的测试成绩,将统计结果写入文件scores.db,方便统计图显示时调用。在整个结对编程的过程中,我们两个人负责的部分都遇到了很多问题,通过相互帮助以及查找资料解决了问题。最后我们一起修改代码,比如每个组件的大小、位置,对界面进行美化和代码优化。

 

6、PSP展示

PSP2.1任务内容计划完成的时间(min)实际完成需要的时间(min)
PLanning 计划 60 100
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 60 60
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 报告 30 35
Test Report 测试报告 20 20
Size Measurement 计算工作量 5 5
Postmortem & Process Improvement Plan 事后总结,并提出过程改机计划 30 35

7、评价小伙伴

  我的小伙伴住在我隔壁宿舍,平时关系很好,所以本次项目在讨论的过程中比较融洽。刚开始我们对项目做了需求分析,得出了本次软件设计的主要分,然后经过商量进行分工合作。在整个过程中,偶尔会出现意见不统一,经过比对和分析最后选择较好的想法。我们单独负责的部分遇到问题都是经过查找资料并相互帮助完成的。在整个项目的实现过程中,她都表现的比较积极,共同设计、写代码、查找资料以及最后的界面和代码优化她都积极的参与了,总之,合作的挺好的。

 

8、项目总结

  本次项目是结对项目,和以往的个人项目相比,真的充分感受到了1+1>2的效果。做结对项目的两个人可以进行分工合作,每个人主要完成自己负责的部分,大大减少了整个项目的设计时间。除此之外,两个人一起合作时就会产生更多更好的想法,可以更好的优化整个项目的设计,遇到问题时可以相互帮助解决问题,效率也比较高。本次项目的最后,我们一起进行了界面的美化改进,这部分我个人比较满意,但是由于我们两个人的能力问题,本次设计的功能不是特别全面,没有增加附加功能,以后继续努力。

 

 

 

 

 

 

推荐阅读