Coding.net原码仓库地址:https://git.coding.net/gemyty/operation.git
1.需求分析
(1)、程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
(2)、每个练习题至少要包含2种运算符,并且练习题在运算过程中不得出现负数与非整数。
2.功能设计
(1)、基本功能:
①程序接收参数n,并对n的合法性作出判断,若出现错误则提示。
②程序能自动生成n个四则运算式,并计算出结果。
③运算式会展现在txt中。
3.设计实现
(1)、PrintStream ps = new PrintStream("../result.txt");打印到result.txt文件
(2)private static Stack<String> stack = new Stack<String>();生成栈放入
(3)private static String[] operator = { "+", "-", "*", "/" };生成运算符
4.算法详解
我用了栈的方法调度。
(1)首先,将中缀表达式改成后缀表达式,从左到右遍历中缀表达式的每一个数字和运算符。
①如果数字就输出(即存入后缀表达式);
②如果是右括号,则弹出左括号之前的运算符;
③如果优先级低于栈顶运算符,则弹出栈顶运算符,并将当前运算符进栈。
遍历结束后,将栈则剩余运算符弹出。
(2)后缀表达式计算结果
从左到右遍历后缀表达式,遇到数字就进栈,遇到符号,就将栈顶的两个数字出栈运算,运算结果进栈,直到获得最终结果,如下
private static String inffixToSuffix(String expression) {
stack.clear();
StringBuilder inffix = new StringBuilder(expression);
StringBuilder suffix = new StringBuilder();
String element = "";
String tmp = "";
while (inffix.length() > 0) {
element = popNextElement(inffix);
if (isNum(element)) { // 是数字则输出
suffix.append(element).append(" ");
} else if (")".equals(element)) { // 右括号则将左括号之前的内容全弹出
tmp = stack.pop();
while (!"(".equals(tmp)) {
suffix.append(tmp).append(" ");
tmp = stack.pop();
}
} else if ("(".equals(element)
|| priority.get(element) >= priority.get(getTopOperator())) {
stack.push(element);
} else { // 优先级小于栈顶运算符,则弹出
tmp = stack.pop();
suffix.append(tmp).append(" ").append(element).append(" ");
}
}
// 把栈中剩余运算符都弹出
while (stack.size() > 0) {
suffix.append(stack.pop()).append(" ");
}
return suffix.toString();
}
private static String suffixToValue(String expression) {
String[] suffix = expression.split(" ");
stack.clear();
double num1 = 0, num2 = 0;
String tmp = "";
for (int i = 0; i < suffix.length; i++) {
if (isNum(suffix[i])) { // 如果是数字
stack.push(suffix[i]);
} else { // 如果是操作符
num2 = Double.parseDouble(stack.pop());
num1 = Double.parseDouble(stack.pop());
tmp = calculate1(num1, num2, suffix[i]);
if (ERROR_ZERO.equals(tmp)) {
throw new ArithmeticException("被除数不能为0");
} else {
stack.push(tmp);
}
}
}
return stack.pop();
}
5.测试运行
你的程序必须是可运行的,请展示程序的运行截图,包括题目要求实现功能对应的运行截图。这些截图说明你的程序确实完成了项目需求,如果程序实现了扩展需求,也请大方秀出来。
6.粘贴自己觉得比较独特的或满意的代码片段
通过此方法判断运算符的优先级
private static Map<String, Integer> priority = new HashMap<String, Integer>();
private static Map<String, String> replace = new HashMap<String, String>();
static {
priority.put("*", 2);
priority.put("/", 2);
priority.put("+", 1);
priority.put("-", 1);
priority.put("", -1);
}
7.总结
因为自己的能力不足,所以做这个项目的时候有非常多的困难,在这个过程中也收获了许多,做的时候开始非常迷茫不知从哪里开始,后来看了些资料例子博客什么的,有了一点思绪,然后清理了思路,开始写,写的时候有很多错误,一直在修修改改,有时候觉得写对了,但还是有报错,有时候查了些资料解决了,有的还是不知怎么弄得只有重新写过。经过这次,实际感受到了做计划的重要性,一定要有清晰思路后再着手,然后java必须要自己私下加速努力了,有想法但是写不出来更是恼火。
8.展示PSP

代码编写用了许多时间,修改更是用了许多许多时间, 只有反思自己的代码能力,非常有待加强。然后计划也应清晰。
---恢复内容结束---
