码迷,mamicode.com
首页 > 其他好文 > 详细

2016012077+小学四则运算练习软件项目报告

时间:2018-03-25 21:13:20      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:log   收获   size   测试   说明   负数   for   数字   .net   

 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

技术分享图片

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

 

---恢复内容结束---

2016012077+小学四则运算练习软件项目报告

标签:log   收获   size   测试   说明   负数   for   数字   .net   

原文地址:https://www.cnblogs.com/benmatt/p/8646826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!