成员:201421123005 谢晓萍 201421123030 陈宇杰
代码地址:
1.需求分析
(1)通过单元测试代码,测试加法是否能正确工作;
(2)通过单元测试代码,测试加减乘除功能。
(3)通过单元测试代码,测试计算类对于各种参数的支持:
a. 输入是有错误的,例如 “1 ++ 2”,
b. 在数值范围是 -1000 .. 1000 的时候,传进去 “10000 + 32768”,
c. 或者是 “ 248 / 0” 怎么办?
d. 怎么告诉函数的调用者 “你错了”? 把返回的字符串定义为 “-1” 来表示?
e. 那么如果真的计算结果是 “-1” 又怎么处理呢?
2.设计测试框架, 模拟测试数据
加减测试:
乘除测试:
混合运算测试(带括号):
括号的嵌套:
括号输入不完整:
输入错误:(如输入1++2)
除0的情况:(结果定义为无穷)
以下是运算模块的代码:
1 package package1; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 public class autoCalculate { 6 7 8 public Listlist; 9 public autoCalculate(String input) { 10 char[] ins = input.toCharArray(); 11 list = new ArrayList (); 12 String str = ""; 13 14 for (int i = 0; i < ins.length; i++) { 15 16 if (ins[i] == '-' && ins[i + 1] >= '0' && ins[i + 1] <= '9' 17 && (i == 0 || ins[i - 1] == '(')) { 18 str += ins[i]; 19 continue; 20 } 21 22 if (ins[i] == '-' && ins[i + 1] == '('&&(i==0||ins[i-1]!=')')) { 23 list.add("0"); 24 list.add("-"); 25 list.add("1"); 26 list.add("*"); 27 continue; 28 } 29 if (!checkFuhao(ins[i])) { 30 str += ins[i]; 31 if (i == ins.length - 1) { 32 list.add(str); 33 } 34 } else { 35 if (!"".equals(str)) { 36 list.add(str); 37 str = ""; 38 } 39 list.add(ins[i] + ""); 40 } 41 42 if (i>0&&ins[i]=='('&&ins[i-1]>='0'&&ins[i-1]<='9') { 43 list.add(list.size()-1,"*"); 44 } 45 } 46 47 } 48 49 String yunsuan(List list) { 50 try { 51 int zuo = haveZuoKuoHao(list); 52 if (zuo != -1) { 53 int you = lastYouKuohao(list, zuo); 54 List l = removeKuohao(list, zuo, you); 55 addKuohao(list, yunsuan(l), zuo); 56 yunsuan(list); 57 } 58 int chengchu = haveChengChu(list); 59 if (chengchu != -1) { 60 chengchuYunsuan(list, chengchu); 61 } else { 62 jiajianYunsuan(list); 63 } 64 if (list.size() == 1) { 65 return list.get(0); 66 } 67 } catch (Exception e) { 68 System.out.println("error"); 69 System.exit(0); 70 } 71 return yunsuan(list); 72 } 73 74 public void jiajianYunsuan(List list) { 75 for (int i = 0; i < list.size(); i++) { 76 if (list.get(i).equals("+")) { 77 double last = Double.parseDouble(list.remove(i + 1)); 78 list.remove(i); 79 double first = Double.parseDouble(list.get(i - 1)); 80 list.set(i - 1, last + first + ""); 81 i--; 82 } 83 if (list.get(i).equals("-")) { 84 double last = Double.parseDouble(list.remove(i + 1)); 85 list.remove(i); 86 double first = Double.parseDouble(list.get(i - 1)); 87 list.set(i - 1, first - last + ""); 88 i--; 89 } 90 } 91 92 } 93 94 public void chengchuYunsuan(List list, int chengchu) { 95 double last = Double.parseDouble(list.remove(chengchu + 1)); 96 String fuhao = list.remove(chengchu); 97 double first = Double.parseDouble(list.get(chengchu - 1)); 98 if (fuhao.equals("*")) { 99 list.set(chengchu - 1, first * last + "");100 }101 if (fuhao.equals("/")) {102 list.set(chengchu - 1, first / last + "");103 }104 105 }106 public int haveChengChu(List list) {107 for (int i = 0; i < list.size(); i++) {108 if (list.get(i).equals("*") || list.get(i).equals("/")) {109 return i;110 }111 }112 return -1;113 }114 115 public List removeKuohao(List list, int zuo, int you) {116 List l = new ArrayList ();117 list.remove(you);118 list.remove(zuo);119 for (int i = zuo; i <= you - 2; i++) {120 l.add(list.remove(i));121 i--;122 you--;123 }124 return l;125 }126 127 public int haveZuoKuoHao(List list) {128 for (int i = 0; i < list.size(); i++) {129 if (list.get(i).equals("(")) {130 return i;131 }132 }133 return -1;134 }135 public int lastYouKuohao(List list, int zuo) {136 int zuoIndex = 1;137 int youIndex = 0;138 for (int i = zuo + 1; i < list.size(); i++) {139 if (list.get(i).equals("(")) {140 zuoIndex++;141 }142 if (list.get(i).equals(")")) {143 youIndex++;144 }145 if (zuoIndex == youIndex) {146 return i;147 }148 }149 return -1;150 }151 public boolean checkFuhao(char a) {152 if (a == '+' || a == '-' || a == '*' || a == '/' || a == '('153 || a == ')') {154 return true;155 }156 return false;157 }158 159 public void addKuohao(List list, String yunsuan, int zuo) {160 list.add(zuo, yunsuan);161 162 }163 164 }
代码覆盖率:
结队照片:
psp:
PSP2.1 | Personal Software Process Stages | Estimated time(min) | actual time(min) |
Planning | 计划 | 11 | 6 |
· Estimate | 估计这个任务需要多少时间 | 120 | 125 |
Development | 开发 | 70 | 90 |
· Analysis | 需求分析 (包括学习新技术) | 20 | 30 |
· Design Spec | 生成设计文档 | 4 | 5 |
· Design Review | 设计复审 | 10 | 5 |
· Coding Standard | 代码规范 | 4 | 5 |
· Design | 具体设计 | 20 | 25 |
· Coding | 具体编码 | 40 | 50 |
· Code Review | 代码复审 | 10 | 15 |
· Test | 测试(自我测试,修改代码,提交修改) | 10 | 15 |
Reporting | 报告 | 10 | 12 |
· | 测试报告 | 5 | 5 |
· | 计算工作量 | 3 | 5 |
· | 并提出过程改进计划 | 4 | 4 |
小结:
1.谢晓萍同学很耐心,遇到不会的问题会愿意花时间去自己百度并学习(例如,如何在eclipse上安装使用eclemma来测试代码覆盖率)。这点是我所欠缺的,两人结队编程起到了1+1>2的效果。
2.之前的java规范意识太弱,导致这次花了一些时间在重新模块化上,拖慢了整体进度。不过这也增加了我们的契合度,让我们合作更加顺利。