结对编程四则运算(阶段总结)

四则运算阶段性总结

结对对象

学号 :20162330
姓名 : 刘伟康

担任角色

(驾驶员):张旭升
(副驾驶):刘伟康

UML

一、需求分析

  • 需要一个整数计算类
  • 需要一个分数计算类
  • 需要一个可自动生成题目的类
  • 需要一个测试结果的类
扩展需求
  • 需要一个IO输出流对自动生成的题目写入文件
  • 需要一个IO输入流读入文件内容并判断正误
  • 需要一个去除生成题目中重复出现的题目的方法
综上有两种办法:
  1. 用栈的方法计算
  2. 不用栈的方法计算

二、设计思路

方法一(不用栈的方法):

优点:

  1. 思路简单,易实现。
  2. 主要需求bug少

缺点:

  1. 扩展需求难于实现
  2. 不支持复杂计算

方法二(用栈的方法):

优点:

  1. 可进行多运算符的精确计算
  2. 对后期扩展需求的实现较容易

缺点:

  1. 思路复杂
  2. 自动生成题目bug较多

三、Junit测试

中缀转后缀表达式转换类:
public class Original {
    private Stack<String> stack1;
    private List<String> list1;
    private String message,Message="";

    public Original() {
        stack1 = new Stack<String>();
        list1 = new ArrayList<String>();
    }

    public void evaluate(String expr) {
        int op1, op2, result = 0;
        String token;
        StringTokenizer tokenizer = new StringTokenizer(expr);

        while (tokenizer.hasMoreTokens()) {
            token = tokenizer.nextToken();

            if (token.equals("("))
                stack1.push(token);
            else if (token.equals("+") || token.equals("-")) {
                        if(!stack1.empty()) {
                            if (stack1.peek().equals("*") || stack1.peek().equals("/"))
                                    list1.add(stack1.pop());
                                    stack1.push(token);
                            } else 
                                   stack1.push(token);
                        }
                        else stack1.push(token);
                }
            else if (token.equals("*") || token.equals("/")) {
                if(!stack1.empty()){
                if(stack1.peek().equals("*")||stack1.peek().equals("/"))     {
                        list1.add(stack1.pop());
                    }
                }
                stack1.push(token);
            }
            else if (token.equals(")")) {
                while (true) {
                    String A = stack1.pop();
                    if (!A.equals( "("))
                        list1.add(A);
                    else break;
                }
            }else list1.add(token);
        }
        while (!stack1.empty()) {
            list1.add(stack1.pop());
        }
        ListIterator<String > li = list1.listIterator();
        while (li.hasNext()) {
            Message += li.next() + " ";
            li.remove();
        }
        message = Message;
    }

    public String getMessage(){
        return message;
    }
}
Junit测试结果:

四、结对评价


在这周的结对编程项目中刘伟康同学主要对我的编写的代码,和代码的运行结果查找不足和需要改进之处,在这个过程中他也针对我的代码找找出了许多不足,我也相应做了一些改进。不好的地方就在于刘伟康同学的思想总是很奇怪,很容易钻牛角尖把一些简单的问题复杂化,这些希望今后他能改进,毕竟之后还有很多的合作要做。


五、遇到的问题及解决方法

问题:在题目生成过程中只能生成符带有号和数字的表达式却不能生成带有括号的混合运算。
解决办法:在查过文档后,我发现了一个列表(List)的很好用的方法,IndexOf(object o)lastIndexOf(object o)分别是返回列表中首次出现某个对象的位置和最后一次出现某个对象的位置,利用左右括号的位置差进行判断,最终实现加多个括号的表达式生成。

六、压力测试

我为我的题目生成设置了生成等级,即 两个数字一个符号为一级,每加一级符号和数字个加一个,以此类推,然后我利用这个功能进行了多符号表达式的生成的压力测试:
  • 等级10:0.5秒以下;
  • 等级100:1秒以下;
  • 等级1000:1秒以下;
  • 等级10000: 3秒左右;
  • 等级100000: 4分钟左右;

PSP

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 1 1
· Estimate · 估计这个任务需要多少时间 20 20
· Analysis · 需求分析 (包括学习新技术) 1 3
· Design Spec · 生成设计文档 0.5 0.5
· Design Review · 设计复审 (和同事审核设计文档) 1 0.5
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 1 0.5
· Design · 具体设计 2 3
· Coding · 具体编码 2 4
· Code Review · 代码复审 2 1
· Test · 测试(自我测试,修改代码,提交修改) 2 1
·Reporting ·报告 1 1.5
· Test Report · 测试报告 2 2.5
· Size Measurement · 计算工作量 0.5 0.5
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 1 1
posted @ 2017-05-14 15:26  Don't_worry  阅读(302)  评论(21编辑  收藏