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

本文总结了一个四则运算项目的开发过程,涉及需求分析、设计思路、Junit测试等内容,并介绍了如何使用栈的方法来处理复杂的四则运算问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四则运算阶段性总结

结对对象
学号 :20162330
姓名 : 刘伟康
担任角色
(驾驶员):张旭升
(副驾驶):刘伟康
UML

1065476-20170514230852097-2117021924.png

一、需求分析

  • 需要一个整数计算类
  • 需要一个分数计算类
  • 需要一个可自动生成题目的类
  • 需要一个测试结果的类
扩展需求
  • 需要一个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测试结果:

1065476-20170514112254394-624805068.png

四、结对评价


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


1065476-20170514151635644-101767152.png

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

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

六、压力测试

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

PSP

PSP2.1Personal Software Process Stages预估耗时(小时)实际耗时(小时)
Planning计划11
· Estimate· 估计这个任务需要多少时间2020
· Analysis· 需求分析 (包括学习新技术)13
· Design Spec· 生成设计文档0.50.5
· Design Review· 设计复审 (和同事审核设计文档)10.5
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)10.5
· Design· 具体设计23
· Coding· 具体编码24
· Code Review· 代码复审21
· Test· 测试(自我测试,修改代码,提交修改)21
·Reporting·报告11.5
· Test Report· 测试报告22.5
· Size Measurement· 计算工作量0.50.5
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划11

转载于:https://www.cnblogs.com/Zhangxusheng/p/6851954.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值