任务:随即产生用户输入个数的四则运算包括结果
需求分析:
项目的主要内容:可以随机生成算式包括其运算结果,也可以根据用户输入来指定个数的算式
主要方法: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面向对象程序设计;