作业5 四则运算 测试与封装 5.1

开发环境: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,当连续出现运算符时就返回错误信息!

运行结果:

目前括号还没有完善,暂时还没想出好的思路去实现

原文地址:https://www.cnblogs.com/383237360q/p/4468669.html