开放原子开发者工作坊 201571030107 小学四则运算练习软件项目报告

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

本文转载自:http://www.javaxxz.com/thread-359437-1-1.html201571030107 小学四则运算练习软件项目报告项目Github地址Arithmetic_SE项目实施过程1、需求分析程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。为了让小学生得到充分锻炼,每个练习题...

本文转载自:http://www.javaxxz.com/thread-359437-1-1.html

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
  

转载于:https://blog.51cto.com/13649430/2088345

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐

  • 浏览量 280
  • 收藏 0
  • 0

所有评论(0)

查看更多评论 
已为社区贡献11条内容