自己写的flex计算器,菜鸟一个,代码写的很烂,各位多多包涵

来源:互联网 发布:大数据分析书籍 编辑:程序博客网 时间:2024/05/17 03:50


自己写的flex计算器,支持+,-,*,/ 和(),支持10以上的运算,但是不支持小数。


借鉴了http://www.cnblogs.com/mygmh/archive/2012/10/06/2713362.html 和 http://blog.csdn.net/antineutrino/article/details/6763722这个两位博主的文章。

第一次写博客,不对的地方请各位指教。


------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="600">
    <mx:Script>
        <![CDATA[
            
        import mx.controls.Alert;
            
        var operate:String="";                                    //运算符
        var str:Array=new Array();
        var ann:Number=0;
        var arrynumber:Array=new Array();          //存放操作数的数组
        var arryoperate:Array=new Array();         //存放运算符的数组
        var num1:String;  
        var num2:String;
            private function cResult():Number      //运算函数
            {
                var result:Number=0;
                switch(operate){
                    case "/":
                        if(Number(num2)!=0)
                        {result=Number(num1)/Number(num2);}
                        else
                        {
                            Alert.show("除数不能为0!","警告",Alert.OK);
                            result=0;
                        }
                        break;
                    case "*":
                        result=Number(num1)*Number(num2);
                        break;
                    case "+":
                        result=Number(num1)+Number(num2);
                        break;
                    case "-":
                        result=Number(num1)-Number(num2);
                        break;
                    default:break;        
                }
                return result;
            }
        public function Isoperate(c:String):Boolean     //运算符判断函数
        {
            switch(c)
            {
                case "+":
                    return true;
                case "-":
                    return true;
                case "*":
                    return true;
                case "/":
                    return true;
                default:break;            
            }
            return false;
        }
        public function Precedence(op1:String,op2:String):Number    //优先级比较函数
        {
            if(op1=="(")
            {
                return -1;
            }
            if(op1=="+"||op1=="-")
            {
                if(op2=="*"||op2=="/")
                {
                    return -1;
                }
                else
                {
                    return 0;
                }
            }
            if(op1=="*"||op1=="/")
            {
                if(op2=="+"||op2=="-")
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
            return -1;
            
        }    
        
        public function nFix2PostFix():void    //中缀运算式转化成后缀运输式
        {   
            var str:String;
            var s:String;
            var i:Number=0;  //表达式长度
            var j:Number=0;//操作符计数器
            var k:Number=0;//运算数计数器
            var length:Number;
            var operat:Number=0;//运算符监视器
            s=txt1.text
            length=txt1.length;
            for(i=0;i<length;i++)
            {
                str=s.charAt(i);
                if(str=="(")
                {
                    arryoperate[j]=str;
                    j++;
                    operat=1;
                }
                else if(str==")")
                {   
                    j=j-1;
                    while(arryoperate[j]!="(")
                    {
                        arrynumber[k]=arryoperate[j];
                        k++;
                        j--;
                    }
                    operat=1;
                }
                else
                {
                    if(!Isoperate(str))
                    {
                        if(operat==0&&k-1>=0)
                        {
                            arrynumber[k-1]=String(Number(arrynumber[k-1])*10+Number(str));
                            operat=0;
                        }
                        else{
                                arrynumber[k]=str;
                                k++;
                                operat=0;
                        }
                    
                    }
                    else
                    {
                       
                        while(arryoperate[0]!=""&&Precedence(arryoperate[j-1],str)>=0)
                        {
                            arrynumber[k]=arryoperate[j-1];
                            k++;
                            j--;
                        }
                        arryoperate[j]=str;
                        j++;
                        operat=1;
                    }
                }
            }
            j=j-1;
            while(j>=0)
            {
                arrynumber[k]=arryoperate[j];
                k++;
                j--;
            }
            arrynumber[k]=0;
            ann=k;
            var stro:String="";
            var z:Number;
                for(z=0;z<ann;z++)
                {
                    stro+=arrynumber[z];
                }
                txt2.text=stro;
            }
            private function txt3Btn_click():void       //后缀运算
            {
                var i:Number;
                var k:Number=0;
                var s:String;
                var a:Array=new Array();
                for(i=0;i<ann;i++)
                {    
                    s=arrynumber[i];
                    if(Isoperate(s)==false)
                    {  a[k]=arrynumber[i];k++; }
                    else
                    {
                        num1=a[k-2];
                        num2=a[k-1];
                        operate=arrynumber[i];
                        a[k-2]=cResult();
                        k=k-1;
                    }
                }
                txt3.text=a[0];
            }
    
        ]]>
        </mx:Script>
    <mx:Panel x="230" y="88" width="421" height="284" layout="absolute">
        <mx:TextInput x="120.5" y="19" id="txt1" />
        <mx:TextInput x="120.5" y="74" id="txt2"/>
        <mx:Button x="154" y="212" label="按钮"  click="nFix2PostFix()"/>
        <mx:Label x="28" y="76" text="num1"/>
        <mx:TextInput x="120" y="126" id="txt3"/>
        <mx:TextInput x="120" y="182" id="txt4"/>
        <mx:Label x="28" y="130" text="operate"/>
        <mx:Label x="28" y="196" text="num2"/>
        <mx:Button x="220" y="212" label="计算" click="txt3Btn_click()"/>
    </mx:Panel>
    
</mx:Application>
0 0
原创粉丝点击