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


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

    需求分析:

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

                主要方法: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面向对象程序设计;

        

  • 相关阅读:
    linux 基础笔记(一)
    wysiwyg加ckeditor加 代码高亮
    将html转换为Drupal模板文件的一般步骤
    最重要的7个Drupal内核模板文件
    drupal模板命名规则
    mysql存储过程和事件
    阿里云图片压缩上传代码
    BeanUtils No value specified for Date的解决方法
    mysql SQLyog导入导出csv文件
    mysql去除重复查询的SQL语句基本思路
  • 原文地址:https://www.cnblogs.com/tqz521127/p/14640604.html
Copyright © 2020-2023  润新知