四则运算阶段总结

20162325 结对编程项目-四则运算 阶段总结

一、需求分析

  • 能随机生成n道题目,n由使用者输入
  • 支持整数的四则运算
  • 能够判断正误,错误时能提醒并输出正确答案
  • 能计算出正确率
  • 能多次生成题目,直到使用者选择退出

后续拓展的可能

  • 支持真分数
  • 题目去重
  • 支持多运算符
  • 设计一个类可以直接利用中缀表达式进行运算不需要转换

二、设计思路

  • 设立一个栈和一个列表,栈存放运算符,列表存放操作数
  • 用String类型定义两个10以内随机整数的加、减、乘、除四种方法
  • 运用了栈的方法将中缀表达式转化为后缀表达式
  • 设计一个测试结果的类判断正误

UML类图

三、实现过程中的关键代码

  • 中缀表达式转化为后缀表达式
package Arithmetic;

import java.util.*;


/**
 * Created by Administrator on 2017/5/13.
 */
public class NifixToSuffix {
    private Stack<String> stack;
    private List<String> list;

    private String message,Message="";


    public NifixToSuffix() {
        stack = new Stack<String>();
        list = new ArrayList<String>();
    }

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

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

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

    }

    public String getMessage() {
        return message;
    }
}

迭代代码如下

 ListIterator<String > li = list.listIterator();
 while (li.hasNext()) {
     Message += li.next() + " ";
     li.remove();
 }

四、测试方法

  • NifixToSuffix类的方法的测试

  • Judgement类的方法测试

    • evaluate()方法

    • isOperator()方法

五、运行过程截图

六、代码托管地址

七、遇到的困难及解决方法

  • 问题1

本来应该打印出“请输入要生成的题目数”结果显示的却是一串乱码

  • 解决方法

输入ctrl + alt + s,搜索encoding设置GBK或UTF-8

八、对结对的小伙伴的评价

坦白一直以来学得挺吃力,很多东西都不知所以, 张之睿同学始终耐心讲解,我会继续跟从他的指导,多花时间,希望能逐步赶上大部队。

十、PSP

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 20 30
Development 开发
· Analysis · 需求分析 (包括学习新技术) 90 120
· Design Spec · 生成设计文档 120 140
· Design Review · 设计复审 (和同事审核设计文档) 30 25
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 30
· Design · 具体设计 120 150
· Coding · 具体编码 300 400
· Code Review · 代码复审 60 50
· Test · 测试(自我测试,修改代码,提交修改) 60 90
Reporting 报告
· Test Report · 测试报告 90 120
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
合计 980 1215
posted @ 2017-05-14 20:54  20162325金立清  阅读(307)  评论(4编辑  收藏  举报