zoukankan      html  css  js  c++  java
  • 201571030107 小学四则运算练习软件项目报告

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

    项目Github地址

    Arithmetic_SE

    项目实施过程

    1、需求分析

    • 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
    • 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。
    • 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
    • 当程序接收的参数为4时,以下为输出文件示例。

    201571030107
    (78*23)-(6*91) = 1248
    (3+36)*(34-21) = 507
    (15*81)*(14+87) = 122715
    (95-4)+(37-30) = 98

    • 支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。

    2、功能分析

    1、 生成一个包含4个数字,三个运算符且包含两个以上括号的字符串表达式。
    2、求表达式的结果,注意运算过程中不能出现负数。
    3、最后将运算表达式和计算结果写入文件。

    3、设计实现

    Arithmetic(SE)
    |--app
    |   |--Arithmetic -- 调用各个组件,生成一个算术表达式
    |   |--BracketsCompute -- 为随机生成的数字和符号添加括号
    |--util
    |   |--CalculateUtil -- 算术计算工具
    |   |--Const -- 常量参数
    |   |--FileUtil -- 文件操作工具
    |   |--RandomUtil -- 随机数字生成工具
    |   |--InfixToSufixUtil -- 将中缀表达式转换为后缀表达式	
    |   |--SufixToValueUtil -- 计算后缀表达式
    |--Application -- 启动程序
    

    4、测试运行

    5、核心代码

    • 将算术表达式(中缀表达式)转换为后缀表达式:

    eg. 89-(44/(56*33)) 中缀表达式转换为后缀表达式
    后缀表达式:89 44 56 33 * / -,元素之间用空格隔开。
    从左到右遍历中缀表达式的每一个数字和运算符
    如果是数字就输出(即存入后缀表达式)
    如果是右括号,则弹出左括号之前的运算符
    如果优先级低于栈顶运算符,则弹出栈顶运算符加入后缀表达式,并将当前运算符加入后缀表达式
    遍历结束后,将栈则剩余运算符弹出。

    public static String prefixToSuffix(String express) throws Exception {
    
            String[] expression = express.split(",");
            StringBuffer suffixStr = new StringBuffer();
            String temp = "";
    
            try {
                for (int i = 0; i < expression.length; i++) {
                    if (SuffixToValueUtil.isNum(expression[i])) {
                        suffixStr.append(expression[i]).append(" ");
                    } else if (expression[i].equals(")")) {
                        temp = stack.pop();
                        while (!temp.equals("(")) {
                            suffixStr.append(temp).append(" ");
                            temp = stack.pop();
                        }
                    } else if (expression[i].equals("(") ||
                            priority.get(expression[i]) >= priority.get(getTopOperator())) {
    
                        stack.push(expression[i]);
                    } else {
                        temp = stack.pop();
                        suffixStr.append(temp).append(" ").append(expression[i]).append(" ");
                    }
    
                }
            } catch (Exception e) {
                throw e;
            }
            while (stack.size() > 0) {
                suffixStr.append(stack.pop());
            }
    
            return suffixStr.toString();
        }
    
    • 根据中缀表达式计算结果

    eg. 根据后缀表达式:89 44 56 33 * / - 计算结果。
    从左到右遍历后缀表达式
    遇到数字就进栈
    遇到符号,就将栈顶的两个数字出栈运算,运算结果进栈,直到获得最终结果。

    public static int compute(String expression) throws Exception {
            int numOne, numTwo;
            String temp = "";
            String[] express = expression.split(" ");
            Stack<String> stack = new Stack<>();
    
            for (int i = 0; i < express.length; i++){
                if (isNum(express[i])){
                    stack.push(express[i]);
                }
                else
                {
                    numTwo = Integer.parseInt(stack.pop());
                    numOne = Integer.parseInt(stack.pop());
                    temp = CalculateUtil.compute(numOne, numTwo, express[i]).toString();
    
                    if (Integer.parseInt(temp) < 0){
                        throw new Exception("Negative numbers in operation");
                    }
                    stack.push(temp);
                }
            }
    
            return Integer.parseInt(stack.pop());
        }
    

    6、总结

    在这个小项目中,我主要将项目程序分为三个部分,分别是启动程序Application、主程序app和工具类util三部分。在主程序中通过Arithmetic调用各个工具类产生一个算术表达式(中缀表达式),工具类中分别处理文件,随机数,计算和表达式转换工作。降低了程序各个部分的耦合度,实现的软件的模块化

    7、展示PSP

    PSP2.1 任务内容 计划完成的时间(min) 实际完成需要的时间(min)
    PLanning 计划 20 40
    Estimate 估计这个任务需要多少时间,并规划大致工作步骤 20 40
    Developmet 开发 132 168
    Analysis 需求分析(包括学习新技术) 12 20
    Design Spec 生成设计文档 5 3
    Design Revie 设计复审(和同事审核设计文档) 3 3
    Coding Standard 代码规范 2 2
    Design 具体设计 30 50
    Coding 具体编码 60 60
    Code Review 代码复审 5 5
    Test 测试(自我测试,修改代码,提交修改) 15 25
    Reporting 报告 30 40
    Test Report 测试报告 20 30
    Size Measurement 计算工作量 3 3
    Postmortem & Process Improvement Plan 事后总结,并提出过程改机计划 7 7

    项目总结

    这个项目并不是很难,但是要把实验要求的所有功能做完还是有挑战性的。在我的项目中我暂时还没有添加真分数的出题和运算功能,后期有时间的话,我会加上去的。做完这个项目后,我最大的感受就是认真做一件事的感觉真好,继续加油!

  • 相关阅读:
    解决验证码问题
    python中的偏函数partial
    Python 数据表orm设计
    参悟yield 和yield from (加精)
    numpy基础
    JS中的面向对象
    pandas使用教程
    一次tornado建站项目分享
    django 一对一, 一对多,多对多的领悟
    三维向量类
  • 原文地址:https://www.cnblogs.com/depers/p/8592654.html
Copyright © 2011-2022 走看看