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