201571030301 四则运算
- Github项目地址 https://github.com/Ahmatjan-IT/Sizeyunsuan
1.需求分析
- 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。
- 练习题生成好后,将你的学号
- 当程序接收的参数为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还可以发现自己在开发时的不足。