• 作业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,当连续出现运算符时就返回错误信息!

    运行结果:

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

  • 相关阅读:
    电路分析
    python-字典
    python-异常
    python-抽象类和抽象方法
    pyqt5-QAbstractScrollArea滚动条
    python-类的继承
    python-语言播报
    pyqt5-QFrame边框样式
    流媒体技术学习笔记之(三)Nginx-Rtmp-Module统计某频道在线观看流的客户数
    让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能
  • 原文地址:https://www.cnblogs.com/383237360q/p/4468669.html
Copyright © 2020-2023  润新知