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