201571030301 四则运算

1.需求分析

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

                                                                   

2.设计实现

   运用随机数,输出结果。

3.功能设计

输入一个数字n,自动生成学号和n道四则运算题。

4.核心代码

 

  1 import java.util.HashMap;  
  2 import java.util.Stack;    
  3 public class ArithmeticResult {  
  4     public Double Result(String formula) {  
  5         Stack<Double> s1 = new Stack<Double>();
  6         Stack<String> s2 = new Stack<String>();
  7         HashMap<String, Integer> hashMap = new HashMap<String, Integer>();  
  8         hashMap.put("(", 0);  
  9         hashMap.put("+", 1);  
 10         hashMap.put("-", 1);  
 11         hashMap.put("*", 2);  
 12         hashMap.put("/", 2);  
 13         for (int i = 0; i < formula.length();) {  
 14             StringBuffer digit = new StringBuffer();  
 15             char c = formula.charAt(i);  
 16             while (Character.isDigit(c) || c == '.') {  
 17                 digit.append(c);  
 18                 i++;  
 19                 c = formula.charAt(i);  
 20             }  
 21             if (digit.length() == 0) {  
 22                 switch (c) {  
 23                 case '(': {  
 24                     s2.push(String.valueOf(c));  
 25                     break;  
 26                 }  
 27                 case ')': {  
 28                     String stmp = s2.pop();  
 29                     while (!s2.isEmpty() && !stmp.equals("(")) {  
 30                         double a = s1.pop();  
 31                         double b = s1.pop();  
 32                         double sresulat = calcDouble(b, a, stmp);  
 33                         s1.push(sresulat);  
 34                         stmp = s2.pop();  
 35                     }  
 36                     break;  
 37                 }  
 38                 case '=': {  
 39                     String stmp;  
 40                     while (!s2.isEmpty()) {  
 41                         stmp = s2.pop();  
 42                         double a = s1.pop();  
 43                         double b = s1.pop();  
 44                         double sresulat = calcDouble(b, a, stmp);  
 45                         s1.push(sresulat);  
 46                     }  
 47                     break;  
 48                 }  
 49                 default: {  
 50                     String stmp;  
 51                     while (!s2.isEmpty()) {  
 52                         stmp = s2.pop();  
 53                         if (hashMap.get(stmp) >= hashMap.get(String.valueOf(c))) {  
 54                             double a = s1.pop();  
 55                             double b = s1.pop();  
 56                             double sresulat = calcDouble(b, a, stmp);  
 57                             s1.push(sresulat);  
 58   
 59                         } else {  
 60                             s2.push(stmp);  
 61                             break;  
 62                         }  
 63   
 64                     }  
 65                     s2.push(String.valueOf(c));  
 66                     break;  
 67                 }  
 68                 }  
 69             } else {  
 70                 s1.push(Double.valueOf(digit.toString()));  
 71                 continue;  
 72             }  
 73             i++;  
 74         }  
 75         return s1.peek();  
 76     }  
 77   
 78     public double calcDouble(double a, double b, String stmp) {  
 79         double res = 0f;  
 80         char s = stmp.charAt(0);  
 81         switch (s) {  
 82           case '+': {  
 83             res = a + b;  
 84             break;  
 85           }  
 86           case '-': {  
 87             res = a - b;  
 88   
 89             break;  
 90           }  
 91           case '*': {  
 92             res = a * b;  
 93             break;  
 94           }  
 95           case '/': {  
 96             res = a / b;  
 97             break;  
 98           }  
 99         }  
100         return res;
101     }    
102 }  

 

 

 

5.测试运行

 

 

6.测试结果

 

 

 

7.展示PSP

PSP2.1

任务内容

计划完成需要的时间(min)

实际完成需要的时间(min)

Planning

计划

20

3

·       Estimate

·  估计这个任务需要多少时间,并规划大致工作步骤

20

3

Development

开发

90

170

··       Analysis

  需求分析 (包括学习新技术)

10

20

·       Design Spec

·  生成设计文档

5

5

·       Design Review

·  设计复审 (和同事审核设计文档)

5

5

·       Coding Standard

  代码规范 (为目前的开发制定合适的规范)

5

10

·       Design

  具体设计

15

20

·       Coding

  具体编码

20

100

·       Code Review

·  代码复审

10

6

·       Test

·  测试(自我测试,修改代码,提交修改)

20

4

Reporting

报告

10

10

··       Test Report

·  测试报告

6

4

·       Size Measurement

  计算工作量

2

3

·       Postmortem & Process Improvement Plan

·  事后总结 ,并提出过程改进计划

2

3

8.总结

 本次实验是软件工程作业中的第一个实验类作业,虽然自己对Java不太掌握,但经过同学的帮助,我顺利完成了这次实验任务。发现无论开发大小程序代码,第一步必须要对开发的内容有所分析,也就是需求分析,最后通过PSP还可以发现自己在开发时的不足。

posted @ 2018-03-21 09:47  Aa合  阅读(197)  评论(2编辑  收藏  举报