个人软件开发流程——计应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();

}

}
复制代码

 

三、总结

想要实现更多的功能,需要考虑更多的问题,代码具体实现起来还是比较麻烦的。

PSP
任务内容 计划完成需要的时间(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
posted @ 2021-04-11 16:59  19A3  阅读(59)  评论(0)    收藏  举报