个人技术流程(四则运算)--田青正

任务:随即产生用户输入个数的四则运算包括结果

需求分析:

  项目的主要内容:可以随机生成算式包括其运算结果,也可以根据用户输入来指定个数的算式

            主要方法:MakeFormula(),生成算式 

                              Solve(String  formula),传入随机生成的算式进行计算

            设计实现:

                         

                   两个函数都由Main来调用

          具体实现:

         MakeFormula():

            

    public static String MakeFormula(){
        StringBuilder build = new StringBuilder();
        int count = (int) (Math.random() * 2) + 1; // generate random count
        int start = 0;
        int number1 = (int) (Math.random() * 99) + 1;
        build.append(number1);
        while (start <= count){
            int operation = (int) (Math.random() * 3); // generate operator
            int number2 = (int) (Math.random() * 99) + 1;
            build.append(op[operation]).append(number2);
            start ++;
        }
        return build.toString();
    }

测试方法:使用junit

 

    @Test
    public void testMakeFormula(){
        for (int i=1; i<6;i++){
            String s = Main.MakeFormula();
            System.out.println(s);
        }
    }

测试结果:

         Solve(String  formula):

  public static String Solve(String formula){
        Stack<String> tempStack = new Stack<>();//Store number or operator (存储数字或运算符)
        Stack<Character> operatorStack = new Stack<>();//Store operator(存储运算符)
        int len = formula.length();
        int k = 0;
        for(int j = -1; j < len - 1; j++){
            char formulaChar = formula.charAt(j + 1);
            if(j == len - 2 || formulaChar == '+' || formulaChar == '-' || formulaChar == '/' || formulaChar == '*') {
                if (j == len - 2) {
                    tempStack.push(formula.substring(k));
                }
                else {
                    if(k < j){
                        tempStack.push(formula.substring(k, j + 1));
                    }
                    if(operatorStack.empty()){
                        operatorStack.push(formulaChar); //if operatorStack is empty, store it
                    }else{
                        char stackChar = operatorStack.peek();
                        if ((stackChar == '+' || stackChar == '-')
                                && (formulaChar == '*' || formulaChar == '/')){
                            operatorStack.push(formulaChar);
                        }else {
                            tempStack.push(operatorStack.pop().toString());
                            operatorStack.push(formulaChar);
                        }
                    }
                }
                k = j + 2;
            }
        }
        while (!operatorStack.empty()){ // Append remaining operators
            tempStack.push(operatorStack.pop().toString());
        }
        Stack<String> calcStack = new Stack<>();
        for(String peekChar : tempStack){ // Reverse traversing of stack
            if(!peekChar.equals("+") && !peekChar.equals("-") && !peekChar.equals("/") && !peekChar.equals("*")) {
                calcStack.push(peekChar); // Push number to stack
            }else{
                int a1 = 0;
                int b1 = 0;
                if(!calcStack.empty()){
                    b1 = Integer.parseInt(calcStack.pop());
                }
                if(!calcStack.empty()){
                    a1 = Integer.parseInt(calcStack.pop());
                }
                switch (peekChar) {
                    case "+":
                        calcStack.push(String.valueOf(a1 + b1));
                        break;
                    case "-":
                        calcStack.push(String.valueOf(a1 - b1));
                        break;
                    case "*":
                        calcStack.push(String.valueOf(a1 * b1));
                        break;
                    default:
                        calcStack.push(String.valueOf(a1 / b1));
                        break;
                }
            }
        }
        return formula + "=" + calcStack.pop();
    }

    测试方法:使用junit

    @Test
    public void testSolve() {
         String sum = Main.Solve("11+22");
System.out.println(sum);
Assert.assertEquals("11+22=33", sum);
}

  测试结果:

   

总结:

     每一个功能的实现都作为一个函数,划分很简单,就如设计里面的,没有什么出入                        

  • PSP展示:
PSP2.1任务内容计划共完成需要的时间(min)实际完成需要的时间(min)
Planning 计划 10 12
· Estimate · 估计这个任务需要多少时间,并规划大致工作步骤 10 12
Development 开发 270 344
· Analysis 需求分析 (包括学习新技术) 10 8
· Design Spec · 生成设计文档 10 10
· Design Review · 设计复审 (和同事审核设计文档) 10 6
· Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 20
· Design 具体设计 20 30
· Coding 具体编码 100 150
· Code Review · 代码复审 60 70
· Test · 测试(自我测试,修改代码,提交修改) 50 50
Reporting 报告 18 20
· Test Report · 测试报告 10 9
· Size Measurement 计算工作量 3 3
· Postmortem & Process Improvement Plan · 事后总结 ,并提出过程改进计划 5 8

总结:在具体编码与代码复审的阶段比较耗时间,许多方法都忘记了,具体算法实现花费较多时间

          个人流程总结:

             首次做个人流程项目,系统的做了收获颇丰:学会了使用Git命令 从GitHub上下载源代码,进行单元测试与效能分析,学习PSP流程并运用于这次的个人项目;学习GitHub代码的管理;复习Java面向对象程序设计;

    

原文地址:https://www.cnblogs.com/tqz521127/p/14640604.html