github代码地址:https://github.com/mqqgd/Experiment2
小伙伴儿的博客地址链接:http://www.cnblogs.com/mjuan/p/8715700.html
我的学号:201571030316 小伴儿的学号:201571030314
一、需求分析
本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能:
- 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
- 题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
- 程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
- 程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
- 程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
- 测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
- 程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
二、软件设计类图
三、核心功能代码展示
1 import java.util.Random; 2 3 public class GetRandomDigit { 4 private Random random; 5 public GetRandomDigit(){ 6 random=new Random(); 7 } 8 int oprator(){ 9 return random.nextInt(4)+1; 10 } 11 int Time(){ 12 return random.nextInt(3)+3; 13 } 14 int randomDigit(){ 15 return random.nextInt(100); 16 } 17 int probabilityQuestion(){ 18 return random.nextInt(200); 19 } 20 int BracketsIndex(int time){ 21 return random.nextInt(time-2); 22 } 23 }
1 public class LinkSql { 2 private static final String url = "jdbc:mysql://127.0.0.1:3306/mqqgd"; 3 private static final String user = "root"; 4 private static final String password = "root"; 5 private static ResultSet ret = null; 6 private static final String name = "com.mysql.jdbc.Driver"; 7 public Connection conn = null; 8 public PreparedStatement pst = null; 9 public LinkSql() { 10 try { 11 Class.forName(name);//指定连接类型 12 conn = DriverManager.getConnection(url, user, password);//获取连接 13 System.out.println("数据库链接成功"); 14 } catch (Exception e) { 15 e.printStackTrace(); 16 } 17 } 18 19 public void changeMySqlDate(String sql) { 20 try { 21 pst=conn.prepareStatement(sql); 22 pst.executeUpdate(); 23 System.out.println("接收到修改数据库命令"+sql); 24 } catch (SQLException e) { 25 // TODO Auto-generated catch block 26 e.printStackTrace(); 27 } 28 } 29 public ResultSet selectSqlDate(String sql) { 30 try { 31 System.out.println("接收到查询数据库命令"+sql); 32 pst=conn.prepareStatement(sql); 33 ret = pst.executeQuery(); 34 return ret; 35 } catch (SQLException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 return null; 39 } 40 } 41 public void closeMySql() { 42 try { 43 this.conn.close(); 44 } catch (SQLException e) { 45 e.printStackTrace(); 46 } 47 } 48 @SuppressWarnings("static-access") 49 public void closeChart() { 50 try { 51 this.pst.close(); 52 this.ret.close(); 53 } catch (SQLException e) { 54 e.printStackTrace(); 55 } 56 } 57 }
1 import java.util.HashMap; 2 import java.util.Stack; 3 public class ArithmeticResult { 4 public Double Result(String formula) { 5 Stack<Double> s1 = new Stack<Double>(); 6 Stack<String> s2 = new Stack<String>(); 7 HashMap<String, Integer> hashMap = new HashMap<String, Integer>(); 8 hashMap.put("(", 0); 9 hashMap.put("+", 1); 10 hashMap.put("-", 1); 11 hashMap.put("×", 2); 12 hashMap.put("÷", 2); 13 for (int i = 0; i < formula.length();) { 14 StringBuffer digit = new StringBuffer(); 15 char c = formula.charAt(i); 16 while (Character.isDigit(c) || c == ‘.‘) { 17 digit.append(c); 18 i++; 19 c = formula.charAt(i); 20 } 21 if (digit.length() == 0) { 22 switch (c) { 23 case ‘(‘: { 24 s2.push(String.valueOf(c)); 25 break; 26 } 27 case ‘)‘: { 28 String stmp = s2.pop(); 29 while (!s2.isEmpty() && !stmp.equals("(")) { 30 double a = s1.pop(); 31 double b = s1.pop(); 32 double sresulat = calcDouble(b, a, stmp); 33 s1.push(sresulat); 34 stmp = s2.pop(); 35 } 36 break; 37 } 38 case ‘=‘: { 39 String stmp; 40 while (!s2.isEmpty()) { 41 stmp = s2.pop(); 42 double a = s1.pop(); 43 double b = s1.pop(); 44 double sresulat = calcDouble(b, a, stmp); 45 s1.push(sresulat); 46 } 47 break; 48 } 49 default: { 50 String stmp; 51 while (!s2.isEmpty()) { 52 stmp = s2.pop(); 53 if (hashMap.get(stmp) >= hashMap.get(String.valueOf(c))) { 54 double a = s1.pop(); 55 double b = s1.pop(); 56 double sresulat = calcDouble(b, a, stmp); 57 s1.push(sresulat); 58 59 } else { 60 s2.push(stmp); 61 break; 62 } 63 64 } 65 s2.push(String.valueOf(c)); 66 break; 67 } 68 } 69 } else { 70 s1.push(Double.valueOf(digit.toString())); 71 continue; 72 } 73 i++; 74 } 75 return s1.peek(); 76 } 77 78 public double calcDouble(double a, double b, String stmp) { 79 double res = 0f; 80 char s = stmp.charAt(0); 81 switch (s) { 82 case ‘+‘: 83 res = a + b; 84 break; 85 case ‘-‘: 86 res = a - b; 87 break; 88 case ‘ב: 89 res = a * b; 90 break; 91 case ‘÷‘: 92 res = a / b; 93 break; 94 } 95 return res; 96 } 97 }
1 //从这里开始 2 CategoryPlot plot=chart.getCategoryPlot();//获取图表区域对象 3 CategoryAxis domainAxis=plot.getDomainAxis(); //水平底部列表 4 domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14)); //水平底部标题 5 domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12)); //垂直标题 6 ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状 7 rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15)); 8 chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15)); 9 chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体 10 11 //到这里结束,虽然代码有点多,但只为一个目的,解决汉字乱码问题 12 //这里也可以用chartFrame,可以直接生成一个独立的Frame 13 frame1=new ChartPanel(chart,true); 14 15 } 16 17 private CategoryDataset getDataSet() { 18 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 19 System.out.println(times); 20 for(int i=0;i<times;i++){ 21 System.out.println("lalal"); 22 dataset.addValue(result[i],"第"+(i+1)+"轮","第"+(i+1)+"轮"); 23 } 24 return dataset; 25 } 26 27 public ChartPanel getChartPanel(){ 28 return frame1; 29 } 30 }
1 import javax.swing.JFrame; 2 3 @SuppressWarnings("serial") 4 public class Tongji extends JFrame{ 5 PieChart pic; 6 int time; 7 int [] result; 8 public Tongji(int[] result,int time){ 9 this.time=time; 10 this.result=result; 11 setFrame(); 12 } 13 14 //登陆界面 15 private void setFrame(){ 16 System.out.println(time); 17 pic=new PieChart(result,time); 18 this.setTitle("您最终的得分统计"); 19 this.setSize(600,400); 20 this.setLocationRelativeTo(null); 21 this.setResizable(false); 22 this.setVisible(true); 23 this.add(pic.getChartPanel()); 24 25 } 26 }
四、程序运行
1.登录界面
2.数据库
3.做题界面
4.答题结束时,自动显示柱状图
五、结对过程
六、PSP
PSP2.1 |
任务内容 |
计划共完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
20 |
16 |
· Estimate |
· 估计这个任务需要多少时间,并规划大致工作步骤 |
20 |
16 |
Development |
开发 |
1838 |
1736 |
·· Analysis |
需求分析 (包括学习新技术) |
20 |
20 |
· Design Spec |
· 生成设计文档 |
25 |
25 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
10 |
10 |
· Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
3 |
3 |
· Design |
具体设计 |
300 |
240 |
· Coding |
具体编码 |
1440 |
1400 |
· Code Review |
· 代码复审 |
10 |
8 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
30 |
30 |
Reporting |
报告 |
33 |
30 |
·· Test Report |
· 测试报告 |
3 |
2 |
· Size Measurement |
计算工作量 |
10 |
8 |
· Postmortem & Process Improvement Plan |
· 事后总结 ,并提出过程改进计划 |
20 |
20 |
七、用汉堡评价法给小伙伴的点评
首先很感谢我的小伙伴,在这次结对过程中对我的帮助。我是个比较懒的人,每次作业都很喜欢拖到最后一天写,但是我的小伙伴儿督促我,我们一起完成任务。我和小伙伴在编程方面是个newbie??,当老师布置任务以后,我和小伙伴有些绝望,最后想了想,反正也躲不过??,还是乖乖做吧??。我们请教大神,在网上查找资料,看看那些早早做完作业的同学的作业,摸索着思考着我们的作业该如何做如何设计。在合作的过程中,我们不断的互换角色,谁也记不清哪行代码是谁敲的??我们之间也没有出现各执己见的情况,很感谢我的小伙伴,我们都用“桥梁”的方式(ps:在邹欣老师的博文中有详细的介绍),给彼此充分的条件相互了解,达成共识。
八、结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会
通过这次和小伙伴结对完成这个任务,我觉得结对编程真的能带来1+1>2的效果。以前自己一个人在写作业的时候,遇到困难时并没有及时去解决问题,而是和朋友扣扣,淘淘宝或者干干其他事,最后什么都没干,白天的任务拖到晚上熬夜做,看起来我很用功似的。这次结对编程对我的帮助很大,我和小伙伴共用一台电脑,相互督促,在做作业的时候没有做和作业无关的事,我也没有熬夜做作业^o^,上课也精神满满^0^~~而且,上次没有实现的括号运算,我和小伙伴一起请教班里的大神,最后也完成了。很感谢我的小伙伴,我们班的大神,还有老师们,嘿嘿,总之,这次结对感觉很棒棒~
参考资料:
http://www.cnblogs.com/xinz/archive/2011/08/22/2148776.html
https://baike.baidu.com/item/%E7%BB%93%E5%AF%B9%E7%BC%96%E7%A8%8B/7526152?fr=aladdin