一、项目源码
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 | 估计这个任务需要多少时间,并规划大致工作步骤 | 90 | |
Developmet | 开发 | 480 | 600 |
Analysis | 需求分析(包括学习新技术) | 30 | 45 |
Design Spec | 生成设计文档 | 10 | 20 |
Design Revie | 设计复审(和同事审核设计文档) | ||
Coding Standard | 代码规范 | ||
Design | 具体设计 | 60 | 80 |
Coding | 具体编码 | 300 | |
Code Review | 代码复审 | 360 | |
Test | 测试(自我测试,修改代码,提交修改) | ||
Reporting | 报告 | 50 | |
Test Report | 测试报告 | 15 | |
Size Measurement | 计算工作量 | 5 | |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改机计划 | 35 |
7、评价小伙伴
由于和小伙伴的关系本身比较好,我们两个在此次项目整体上合作的比较融洽。当然,毕竟两个人的想法不会总是相同,在探讨分析阶段我们在意见上还是都有点自己的小想法,思想上有点小碰撞,但通过积极讨论,最终达成了意见一致的方案。查找资料、编写代码阶段我们两个相互学习,共同进步,最终完成了此次结对项目。在此次项目中,小伙伴一直乐观面对,积极完成,使我学习到了许多。
8、项目总结
此次项目为结对项目,不同于以往的个人项目,1+1>2的效果在此次得到了充分的展现。个人项目由于个人想法单一、片面,虽然也能完成,但不够多彩。结对项目由于两个人的思想碰撞,得到了更加绚丽多彩的火花,使得项目内容更加充实,完整,完成效果更加饱满多姿,时间上也节约了许多。我们的最终的完成效果我们也还是挺满意的,界面的美化改进,我的搭档也比较满意,但是由于我们两个人的能力问题,本次设计的功能不是特别全面,没有增加附加功能,以后继续努力,希望在以后的学习中能够实现!