自己写的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>