201571030316/201571030314《小学生四则运算练习软件》结对项目报告

Posted mqqgd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了201571030316/201571030314《小学生四则运算练习软件》结对项目报告相关的知识,希望对你有一定的参考价值。

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

以上是关于201571030316/201571030314《小学生四则运算练习软件》结对项目报告的主要内容,如果未能解决你的问题,请参考以下文章