开发环境:eclipse
结对同伴 :32 马志磊
同伴博客:http://www.cnblogs.com/mac54321/
程序介绍:
1.第一阶段目标 - 把计算的功能封装成类。
2.设计测试用例:用白盒与黑盒测试设计技术,为计算核心设计测试用例。
3.在实验环境中(如MyEclipse集成开发环境+Junit测试框架)运行测试用例,分析测试结果,找出程序问题,给出改进前后的代码对照。
程序代码:
Calculator.java
public class Calculator {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String exp=new String("25+5+30+6=");
Core c=new Core();
String result=c.jisuan(exp);
System.out.print(result);
}
}
Core.java
public class Core { public String jisuan(String str) { String num[] =new String[10]; int number[] =new int[10]; char operator[]=new char [10]; int brackets=0,endbrackets=0; int posbra=0,endposbra=0; int j;int k; double result=0; for(int i=0;i<10;i++) { num[i]=""; number[i]=0; } j=0;k=0; for(int i=0;str.charAt(i)!='=';i++) { if(str.charAt(i)>='0' && str.charAt(i)<='9' || str.charAt(i)=='.') { num[j]=num[j]+ str.charAt(i); } else if(str.charAt(i)=='+' || str.charAt(i)=='-' || str.charAt(i)=='*' || str.charAt(i)=='/') { j++; operator[k]=str.charAt(i); k++; } else if(str.charAt(i)=='(') { brackets++; posbra=i; }else if(str.charAt(i)==')'){ endbrackets++; } } if(brackets!=endbrackets) return "括号不对称"; if(j==0) return String.valueOf(Double.parseDouble(num[0])); else { int pos=-1; String str2=new String(""); for(int i=0;i<=k;i++) { if(operator[i]=='*' || operator[i]=='/') pos=i; } if(pos==-1) pos=0; for(int i=0;i<pos;i++) str2=str2+num[i]+String.valueOf(operator[i]); str2=str2+op(Double.parseDouble(num[pos]),Double.parseDouble(num[pos+1]),operator[pos])+String.valueOf(operator[pos+1]); for(int i=pos+2;i<=j;i++) str2=str2+num[i]+String.valueOf(operator[i]); return jisuan(str2+"="); } } public double op(double a,double b,char operator) { switch(operator) { case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; } return 0; } }
初步测试结果:
(1)
(2)
(3)
(4)
然后发现当除数为0的时候 出现了错误 !
然后我们进行了修改
在原来的Core.java的
for(int i=0;i<=k;i++) { if(operator[i]=='*' || operator[i]=='/') pos=i; }
for 循环中 添加多一个判断 检测除数是否为0 如果为0则提示错误
修改如下:
for(int i=0;i<=k;i++) { if(operator[i]=='*' || operator[i]=='/') pos=i; if(operator[i]=='/') if(Double.parseDouble(num[i+1])==0) return "公式错误!除数不能为0"; }
然后运行结果:
然后当用户发现输入"1+1++1="的公式时 又出现这样的错误 不能连续输入两个或以上的运算符
然后我们又做了如下的修改:
在原来的Core.java的
for(int i=0;str.charAt(i)!='=';i++) { if(str.charAt(i)>='0' && str.charAt(i)<='9' || str.charAt(i)=='.') { num[j]=num[j]+ str.charAt(i); } else if(str.charAt(i)=='+' || str.charAt(i)=='-' || str.charAt(i)=='*' || str.charAt(i)=='/') { j++; operator[k]=str.charAt(i); k++; } else if(str.charAt(i)=='(') { brackets++; posbra=i; }else if(str.charAt(i)==')'){ endbrackets++; } }
修改成
for(int i=0;str.charAt(i)!='=';i++) { if(str.charAt(i)>='0' && str.charAt(i)<='9' || str.charAt(i)=='.') { flag=false; num[j]=num[j]+ str.charAt(i); } else if(str.charAt(i)=='+' || str.charAt(i)=='-' || str.charAt(i)=='*' || str.charAt(i)=='/') { if(flag==true) return "公式错误!不能连续输入运算符"; flag=true; j++; operator[k]=str.charAt(i); k++; } else if(str.charAt(i)=='(') { brackets++; posbra=i; }else if(str.charAt(i)==')'){ endbrackets++; } }
就是多添加了一个标志flag,当连续出现运算符时就返回错误信息!
运行结果:
目前括号还没有完善,暂时还没想出好的思路去实现