zoukankan      html  css  js  c++  java
  • 四则运算结对作业

    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. 成员互评

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

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

  • 相关阅读:
    上下文管理器
    创建项目与介绍(2)
    虚拟环境的安装(1)
    爬虫-selenium(14-2)扩展
    爬虫10-1(协程)
    Python3笔记038
    Python3笔记037
    Python3笔记036
    Python3笔记035
    Python3笔记034
  • 原文地址:https://www.cnblogs.com/aaayy/p/8776544.html
Copyright © 2011-2022 走看看