Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 677|回复: 0

[默认分类] 201571030107 小学四则运算练习软件项目报告

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-3-18 22:47:44 | 显示全部楼层 |阅读模式
    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时,以下为输出文件示例。
    支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号必须大于2个,且不得超过运算符的个数。

    2、功能分析
    1、 生成一个包含4个数字,三个运算符且包含两个以上括号的字符串表达式。
    2、求表达式的结果,注意运算过程中不能出现负数。
    3、最后将运算表达式和计算结果写入文件。
    3、设计实现
    1. [code]Arithmetic(SE)
    2. |--app
    3. |   |--Arithmetic -- 调用各个组件,生成一个算术表达式
    4. |   |--BracketsCompute -- 为随机生成的数字和符号添加括号
    5. |--util
    6. |   |--CalculateUtil -- 算术计算工具
    7. |   |--Const -- 常量参数
    8. |   |--FileUtil -- 文件操作工具
    9. |   |--RandomUtil -- 随机数字生成工具
    10. |   |--InfixToSufixUtil -- 将中缀表达式转换为后缀表达式   
    11. |   |--SufixToValueUtil -- 计算后缀表达式
    12. |--Application -- 启动程序
    复制代码
    [/code]
    4、测试运行

    5、核心代码

    将算术表达式(中缀表达式)转换为后缀表达式:
      [blockquote]
       eg. 89-(44/(56*33)) 中缀表达式转换为后缀表达式
    后缀表达式:89 44 56 33 * / -,元素之间用空格隔开。
    从左到右遍历中缀表达式的每一个数字和运算符
    如果是数字就输出(即存入后缀表达式)
    如果是右括号,则弹出左括号之前的运算符
    如果优先级低于栈顶运算符,则弹出栈顶运算符加入后缀表达式,并将当前运算符加入后缀表达式
    遍历结束后,将栈则剩余运算符弹出。
      [/blockquote]
    1. [code]public static String prefixToSuffix(String express) throws Exception {
    2.         String[] expression = express.split(",");
    3.         StringBuffer suffixStr = new StringBuffer();
    4.         String temp = "";
    5.         try {
    6.             for (int i = 0; i < expression.length; i++) {
    7.                 if (SuffixToValueUtil.isNum(expression[i])) {
    8.                     suffixStr.append(expression[i]).append(" ");
    9.                 } else if (expression[i].equals(")")) {
    10.                     temp = stack.pop();
    11.                     while (!temp.equals("(")) {
    12.                         suffixStr.append(temp).append(" ");
    13.                         temp = stack.pop();
    14.                     }
    15.                 } else if (expression[i].equals("(") ||
    16.                         priority.get(expression[i]) >= priority.get(getTopOperator())) {
    17.                     stack.push(expression[i]);
    18.                 } else {
    19.                     temp = stack.pop();
    20.                     suffixStr.append(temp).append(" ").append(expression[i]).append(" ");
    21.                 }
    22.             }
    23.         } catch (Exception e) {
    24.             throw e;
    25.         }
    26.         while (stack.size() > 0) {
    27.             suffixStr.append(stack.pop());
    28.         }
    29.         return suffixStr.toString();
    30.     }
    复制代码
    [/code]

    根据中缀表达式计算结果
      [blockquote]
       eg. 根据后缀表达式:89 44 56 33 * / - 计算结果。
    从左到右遍历后缀表达式
    遇到数字就进栈
    遇到符号,就将栈顶的两个数字出栈运算,运算结果进栈,直到获得最终结果。
      [/blockquote]
    1. [code]public static int compute(String expression) throws Exception {
    2.         int numOne, numTwo;
    3.         String temp = "";
    4.         String[] express = expression.split(" ");
    5.         Stack<String> stack = new Stack<>();
    6.         for (int i = 0; i < express.length; i++){
    7.             if (isNum(express[i])){
    8.                 stack.push(express[i]);
    9.             }
    10.             else
    11.             {
    12.                 numTwo = Integer.parseInt(stack.pop());
    13.                 numOne = Integer.parseInt(stack.pop());
    14.                 temp = CalculateUtil.compute(numOne, numTwo, express[i]).toString();
    15.                 if (Integer.parseInt(temp) < 0){
    16.                     throw new Exception("Negative numbers in operation");
    17.                 }
    18.                 stack.push(temp);
    19.             }
    20.         }
    21.         return Integer.parseInt(stack.pop());
    22.     }
    复制代码
    [/code]
    6、总结
    在这个小项目中,我主要将项目程序分为三个部分,分别是启动程序
    1. Application
    复制代码
    、主程序
    1. app
    复制代码
    和工具类
    1. util
    复制代码
    三部分。在主程序中通过
    1. Arithmetic
    复制代码
    调用各个工具类生产一个算术表达式(中缀表达式),工具类中分别处理文件,随机数,计算和表达式转换工作。降低了程序各个部分的耦合度,实现的软件的
    1. 模块化
    复制代码

    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
      


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

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-27 02:30 , Processed in 0.486810 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表