四则运算结对作业

  1. 代码仓库地址:https://coding.net/u/anvozo/p/operation-program/git我的结对搭档是张琪。

  2. PSP展示

PSP

任务内容

计划时间(min)

完成时间(min)

Planning

计划

60

80

     Estimate

估计这个任务需要多少时间,并规划大致工作步骤

60

80

Development

开发

3000

4800

    Analysis

    需求分析

60

80

    Design Spec

    生成文档

0

0

    Design Review

    设计复审

200

300

    Coding Standard

    代码规范

20

30

    Design

    具体设计

1200

1800

    Coding

    具体编码

1800

3600

    Code Review

    代码复审

300

600

    Test

    测试

130

150

Reporting

报告

600

600

    Test Report

    测试报告

60

80

    Size Measurement

    计算工作量

30

60

   Postmortem& ProcessImprovement Plan

  事后总结, 并提出过程改进计划

600

600

  1. (1)Information Hiding

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。

信息隐藏原则的应用。
     1 多层设计中的层与层之间加入接口层;
     2 所有类与类之间都通过接口类访问; 
     3 类的所有数据成员都是private,所有访问都是通过访问函数实现的;

 

 

 

 

(2)Interface Design接口设计

接口是对象之间建立连接,指的是进行连接而设计的指定方法;

而java中的interface是为了更好的完成这种连接而定义的一种语法支持;

相对于抽象类,抽象类一般在多重继承结构下,抽象类去实现接口并具体实现部分方法。

 

 

 

(3)Loose Coupling松耦合

 

 

 

耦合度(Coupling)是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。

模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。
降低模块间的耦合度能减少模块间的影响。松耦合的目标是最小化依赖。松耦合这个概念主要用来处理可伸缩性、灵活性和容错这些需求。

 

 

 

 

 

 

4.计算模块接口的设计和实现过程

 

计算模块的关键是中缀转后缀

转换的整体流程如下:
中缀表达式转后缀表达式的方法:
1.遇到操作数:直接输出(添加到后缀表达式中)
2.栈为空时,遇到运算符,直接入栈
3.遇到左括号:将其入栈
4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。
5.遇到其他运算符:加减乘除:弹出所有优先级大于或者等于该运算符的栈顶元素,然后将该运算符入栈
6.最终将栈中的元素依次出栈,输出。

 

 

 

 

 

5.计算模块接口部分的性能改进、

 

 

 

 

 

 

6.计算模块部分单元测试展示

public class Test {

    public static void main(String[] args) {

       System.out.println(2.1%1);

    }

}

  

 

 

7.计算模块部分异常处理说明

模块的异常处理

package com.edu;

 

public class Command {

    public Command() {

    }

 

    public static float opt(String s) throws Exception {

        if(s != null && !"".equals(s.trim())) {

            int a1 = s.indexOf("+");

            int a2 = s.indexOf("-");

            int a3 = s.indexOf("*");

            int a4 = s.indexOf("/");

            int a5 = s.indexOf("(");

            if(a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1) {

                if(s.trim() != null && !"".equals(s.trim())) {

                    return Float.parseFloat(s.trim());

                } else {

                    throw new Exception("operate error");

                }

            } else {

                float n2;

                if(a5 != -1) {

                    int n11 = s.indexOf(")");

                    if(n11 == -1) {

                        throw new Exception("括号不匹配");

                    } else {

                        n2 = opt(s.substring(a5 + 1, n11).trim());

                        s = s.replace(s.substring(a5, n11 + 1), String.valueOf(n2));

                        return opt(s);

                    }

                } else {

                    float n1;

                    if(a1 != -1) {

                        n1 = opt(s.substring(0, a1));

                        n2 = opt(s.substring(a1 + 1, s.length()));

                        return n1 + n2;

                    } else if(a2 != -1) {

                        n1 = opt(s.substring(0, a2));

                        n2 = opt(s.substring(a2 + 1, s.length()));

                        return n1 - n2;

                    } else if(a3 != -1) {

                        n1 = opt(s.substring(0, a3));

                        n2 = opt(s.substring(a3 + 1, s.length()));

                        return n1 * n2;

                    } else if(a4 != -1) {

                        n1 = opt(s.substring(0, a4));

                        n2 = opt(s.substring(a4 + 1, s.length()));

                        return n1 / n2;

                    } else {

                        return (float)Integer.parseInt(s.trim());

                    }

                }

            }

        } else {

            return 0.0F;

        }

    }

}

 

 

 

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Map;

import java.util.Set;

 

    public class Command {

        public static ArrayList<String> fu= new ArrayList();

        public static ArrayList<Integer> num=  new ArrayList();

        public static ArrayList<String> fg= new ArrayList();

        public static ArrayList<Float> jian= new ArrayList();//保存四则运算中间结果

        public static boolean flag=false;

        public static int n=1;//题目数

        public static int nops=1;//符号数

    public static int mlow=0;//数值最低取值范围

    public static int mhigh=50;//数值最高取值范围

    public static int c=0;//是否含有括号

    public static int bc=0;//是否包含乘除法

    /**获取表达式

     * @return

     */

    public static String fun() {

        String str="";

        int k=0,s=0,nos=(int) (Math.random()*nops)+1;

        int a=(int) (Math.random()*((mhigh-mlow)/n))+mlow;

        num.set(0, a);

        str+= a;

        for(int i=0;i<nops;i++) {

            char f=fu.get((int) (Math.random()*fu.size())).charAt(0);

            if(f=='/') {

                str+= f;

                fg.set(i, f+"");

                int b= getYin(num.get(i));

                num.set(i+1, b);

                str+= b;

            }else if(f=='*'){

                str+= f;

                fg.set(i, f+"");

                int b=(int) (((mhigh-mlow)/(num.get(i)/2+1))*Math.random()+mlow);

                num.set(i+1, b);

                str+= b;

            }else if(i>1&&fg.get(i-1).equals("+")) {

                str+='-';

                fg.set(i, f+"");

                int b=(int) (((mhigh-mlow)/(num.get(i)+1))*Math.random()+mlow);

                num.set(i+1, b);

                if(bc==1&&k==0&&nops>2&&s<2&&i<num.size()-2) {

                    str+="("+b;

                    k=1;

                    s++;

                }else if(bc==1&&k==1&&nops>2) {

                    str+=b+")";

                    k=0;

                }else {

                    str+= b;

                }

            }else  {

                str+= f;

                fg.set(i, f+"");

                int b=(int)(Math.random()*((mhigh-mlow)))+mlow;

                num.set(i+1, b);

                if(bc==1&&k==0&&nops>2&&s<2&&i<num.size()-2) {

                    str+="("+b;

                    k=1;

                    s++;

                }else if(bc==1&&k==1&&nops>2) {

                    str+=b+")";

                    k=0;

                }else {

                    str+= b;

                }

            }

        }

        if(bc==1&&k==1) {

            str+=")";

        }

        return str;

    }

  

 

 

 

 

 

 

 

8.界面模块的详细设计过程(界面模块与计算模块的对接。详细地描述UI模块的设计与两个模块的对接,并在博客中截图实现的功能。)

界面模块包含出题页面和答题页面、答题界面和文件上传界面

代码展示

 

package com.edu;

 

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.io.IOException;

import java.util.Date;

import java.util.LinkedList;

 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

@WebServlet("/answer")

public class Answer extends HttpServlet {

       private static final long serialVersionUID = 1L;

       private static LinkedList<String> subs=new LinkedList<>();

       private static LinkedList<String> ans=new LinkedList<>();

      

    public Answer() {

        super();

    }

   

 

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              File file=new File("../result.txt");
              file.creatNewFile();

              FileReader fr=new FileReader(file);

              BufferedReader br=new BufferedReader(fr);

              String str=br.readLine();

              //使用request对象的getSession()获取session,如果session不存在则创建一个

              HttpSession session = request.getSession();

              while (str!= null) { 

                  System.out.println(str); 

                  subs.add(str);

                  try {

                         int s=     (int) Command.opt(str);

                         ans.add(s+"");

                     } catch (Exception e) {

                            e.printStackTrace();

                     }

                  str=br.readLine();

              }

              session.setAttribute("subs", subs);

              session.setAttribute("ans", ans);

              session.setAttribute("nsubs", 0);

              session.setAttribute("nans", 0);

              session.setAttribute("time",new Date());

              //将数据存储到session中

              response.sendRedirect("answer.jsp");

       }

 

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              doGet(request, response);

       }

 

}

package com.edu;

 

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.LinkedList;

 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

/**

 * Servlet implementation class DealAnswer

 */

@WebServlet("/dealAnswer")

public class DealAnswer extends HttpServlet {

       private static final long serialVersionUID = 1L;

       private static LinkedList<String> subs=new LinkedList<>();

       private static LinkedList<String> ans=new LinkedList<>();

      

    public DealAnswer() {

        super();

    }

 

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              request.getAttribute("");

              //使用request对象的getSession()获取session,如果session不存在则创建一个

                            HttpSession session = request.getSession();

                            subs=(LinkedList<String>) session.getAttribute("subs");

                            ans=(LinkedList<String>) session.getAttribute("ans");

                            Integer nsubs=(Integer) session.getAttribute("nsubs");

                            Integer nans=(Integer) session.getAttribute("nans");

                            String answer=request.getParameter("anwer");

                            try {

                                   if(nsubs==subs.size()-1) {

                                          Date end=new Date();

                                          Date begin=(Date) session.getAttribute("time");

                                          SimpleDateFormat sf=new SimpleDateFormat("mm:ss");

                                          if(answer.trim().equals((int)Command.opt(subs.get(nsubs))+"")) {

                                                 System.out.println("你的答案"+answer);

                                                 System.out.println("实际答案"+Command.opt(subs.get(nsubs)));

                                                 nans=nans+1;

                                                 session.setAttribute("nans", nans);    

                                          }

                                          long ti=end.getTime()-begin.getTime();

                                          long h=ti/(1000*60*60);  //时

                                          long m=(ti-(h*1000*60*60))/(1000*60);//分

                                          long s=(ti-(m*1000*60))/(1000);//秒

                                          System.out.println(end.getTime()-begin.getTime());

                                          session.setAttribute("time",""+h+":"+m+":"+s);

                                          response.sendRedirect("countAns.jsp");

                                          return;

                                   }

                                   if(answer.trim().equals((int)Command.opt(subs.get(nsubs))+"")) {

                                          System.out.println("你的答案"+answer);

                                          System.out.println("实际答案"+Command.opt(subs.get(nsubs)));

                                          nans=nans+1;

                                          session.setAttribute("nans", nans);    

                                   }

                            } catch (Exception e) {

                                   e.printStackTrace();

                            }

                            session.setAttribute("nsubs", ++nsubs);

                            response.sendRedirect("answer.jsp");

       }

 

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

              doGet(request, response);

       }

 

}

 

  

 


  

 

 

 

 

 

9.界面模块与计算模块的对接

web界面中,后端将数据输出到HTML页面,通过servlet方法在JS控制逻辑中需要访问数据时可以从HTML中取得

 

 

 

 

 

 10.描述结对的过程

这次项目我的队友是张琪,和我对比起来她真的是太优秀了。我的基础知识很不好,编程对于我来说很困难,但是她总能克服各种困难并给我带来信心。我一个人做项目的时候,通常有很多不懂的东西,只能在网上找各种似是而非不知对错的答案,往往因为一个问题纠结半天,效率低下。但是和她合作的时候,因为她性格开朗热情并且乐于助人,有什么问题问她的话简直是事半功倍,我不会再因为一个问题而止步不前,效率比之前提高了很多。我真的给她带来了很多麻烦,谢谢她的不厌其烦。并且她总能有一些很的想法,使得代码变得更加优化简单。

结对编程的优点:

  1. 队友之间互相帮助,互相进步。

  2. 两个人一起总能产生各种各样的想法,有利于代码的设计和规范

  3. 两个人之间的沟通和交流能让一些疑问能很容易就解决了,提高了效率

结对编程的缺点:

  1. 因为张琪很厉害,有时候我对她产生了依赖,付出很少

  2. 有时候因为想法不和容易产生分歧

  3. 成员互评

张琪:优点:认真负责,乐于助人,善于思考,有耐心,代码能力很好

我:优点:思想活跃,总有疑问 缺点:总是拖延,代码能力差

posted @ 2018-04-10 09:39  aaayy(安然)  阅读(281)  评论(2编辑  收藏  举报