个人软件开发流程——计应191班 第三组余方
《个人软件开发流程》——第三组余方
一、计划:
设计一个程序,让它能够随机生成指定个数的整数4则运算,运算符为 +, −, ×, ÷,并输出结果。
二、开发
(1)需求分析以及功能设计
根据题目要求,要制作一个能自动生成题目的软件。
随机生成不同难度的四则运算,并计算出结果,输出到控制台。
(2)生成设计文档
语言:java
软件:eclipse
目标一:学习如何使用参数来控制生成题目的个数。
目标二:最好能重复生成。
(3)设计复审
和室友再次审核了一下设计文档
(4)代码规范
要求 :
1.程序块要采用缩进风格编写,缩进的空格数为4个。
2.分界符(如大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。在函数体的开始、类和接口的定义、以及if、for、do、while、switch、case语句中的程序都要采用如上的缩进方式等等
(5)具体设计
我分用了俩个方法:
1.MakeFormula()方法
用于实现随机生成四则运算式子
2.Solve()方法
用于计算结果
(6)具体编码
package org;
import java.util.Stack;
public class Main {
private static String[] op = { "+", "-", "*", "/" };// Operation set
public static void main(String[] args) {
String question = MakeFormula();
System.out.println(question);
String ret = Solve(question);
System.out.println(ret);
}
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();
}
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();
}
}
三、总结
想要实现更多的功能,需要考虑更多的问题,代码具体实现起来还是比较麻烦的。
| 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
| 计划 | 20 | 30 |
| 明确需求和其他相关因素,估计每个阶段的时间成本 | 10 | 20 |
| 开发 | 150 | 180 |
| 需求分析 | 10 | 10 |
| 生成设计文档 | 10 | 10 |
| 设计复审 | 10 | 10 |
| 代码规范 | 10 | 10 |
| 具体设计 | 10 | 10 |
| 具体编码 | 60 | 90 |
| 代码复审 | 10 | 10 |
| 测试 | 10 | 10 |
| 报告 | 5 | 5 |
| 测试报告 | 5 | 5 |
| 计算工作量 | 5 | 5 |
| 总结 | 5 |


浙公网安备 33010602011771号