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