博客统计信息

51cto推荐博客
用户名:fsjoy1983
文章数:301
评论数:234
访问量:422967
无忧币:2144
博客积分:3830
博客等级:7
注册日期:2008-02-04

我的技术圈(3)

更多>>
我用flex做的一个计算器
2009-11-04 18:30:32
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://fsjoy.blog.51cto.com/318484/222100
这是界面图:



这个可以在design界面里拖动组件,修改组件属性值来实现。

然后是计算器的算法(仿照win下的计算器算法):

问题描述:
输入一个数,然后按某个运算符,再输入另一个数,按等号即可得出结果。只按照输入顺序计算结果,而非按照运算符优先级来得出结果,即,如果按顺序输入2+8*3=会得到30,而非26.

算法描述:
定义三个全局变量,分别是first(Number), second(Number), symbol(String)

first代表二目运算中第一个数,second代表第二个数,symbol代表运算符(+-*/)

(初始化之后flex对Number型默认值为NaN, String型默认值为null)

1.二目运算第一个数的输入数字阶段,对于小数点(.)按钮,如果输入一次之后enable属性设为false.
2.输入运算符(+-*/),将第一步输入的数字保存到first变量中,并将此运算符保存到symbol中,小数点(.)按钮enable属性为true.
3.二目运算第二个数字输入阶段,对于小数点(.)按钮,如果输入一次之后enable属性设为false.
4.
     4.1如果输入等号(=),将前面存储的first, second, symbol按照相应规则运算得出结果,这个结果存储到first中,second和symbol分别设为NaN和null。小数点按钮enable属性为true。然后可以转入步骤2.
     4.2 如果输入运算符(+-× /) ,将first, second, symbol按照规则运算出结果,结果保存到first中,second设为NaN, 将输入运算符保存到symbol中,小数点按钮enable属性为true。然后可以转入步骤3。


下面是整个计算器的代码及注释:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal">

<mx:Script>
    <![CDATA[
 
        
        public var first:Number; //定义二目运算第一个数的存储变量
        public var second:Number;
//第二个数的存储变量
        public var symbol:String;  //运算符 
        public var display_content:String='0' //input_Text显示内容

        private function addText(str:String):void//输入数字时,显示
内容
        {
            display_content+=str;
//每点一个数字,显示内容增加进去
              var myFloat:Number = parseFloat(display_content);
//将显示内容转换为Number型
              if(str!='.')
                  {
                      txt_display.text = myFloat.toString();
//将刚转换的Number型转换为String型,显示到input_Text中
  

                  }
              else
//处理小数点情况
                  {
                      txt_display.text = myFloat.toString()+".";
                      bt_dot.enabled=false;
                  }
                  
        }
//C按钮的功能
        private function c():void
        {
            display_content ='0';
            txt_display.text='0';
            first=NaN;
            second=NaN;
            symbol=null;
            bt_dot.enabled=true;
        }
//CE按钮功能
        private function ce():void
        {
            display_content='0';
            txt_display.text='0';
            second=NaN;
            bt_dot.enabled=true;
        }
//运算功能
        private function cal():void
        {
            second=parseFloat(txt_display.text);
            switch (symbol)
                    {
                        case "+":
                        first=first+second;
                        break;
                        
                        case "-":
                        first=first-second;
                        break;
                        
                        case "*":
                        first=first*second;
                        break;
                        
                        case "/":
                        
                            first=first/second;
                        break;
                        
                        default:
                        // do nothing
                    }
                txt_display.text=first.toString();
                display_content='0';
                symbol=null;
                second=NaN;
                bt_dot.enabled=true;
        }
//输入运算符(+-× /)符号处理
        private function process_symbol(str:String):void
        {
            if(first.toString()=='NaN')
                {
                    first=parseFloat(txt_display.text);
                    if(str!="=")
                        { symbol=str; }
                    display_content='0';
                    bt_dot.enabled=true;
                }
            else if(second.toString()=='NaN' )
            {
                symbol=str;
            }
            else
            {
                    cal();
            }
        }
        
//输入等号时       
        private function equals():void
        {
            if(first.toString()=='NaN')
            {
                first=parseFloat(txt_display.text);
                display_content='0';
                bt_dot.enabled=true;
            }
            
            else
            {
                cal();
                
            }
        }
        
    ]]>
</mx:Script>
//组件代码:
    <mx:Canvas width="309" height="354">
        <mx:Panel y="10" width="273.5" height="334" layout="absolute" title="calculator" horizontalAlign="center" verticalAlign="middle" backgroundColor="#AFB6B9" horizontalCenter="-2">
            <mx:TextInput x="10.75" y="29" width="231" id="txt_display" text="0" textAlign="right"/>
            <mx:Button x="13" y="98" label="7" width="36" height="31" color="#0B0C0F" id="bt_7" click="addText('7')"/>
            <mx:Button x="57" y="98" label="8" width="36" height="31" id="bt_8" click="addText('8')"/>
            <mx:Button x="101" y="98" label="9" width="36" height="31" id="bt_9" click="addText('9')"/>
            <mx:Button x="145" y="98" label="+" width="36" height="31" color="#0DC5ED" id="bt_plus" click="process_symbol('+')"/>
            <mx:Button x="145" y="137" label="-" width="36" height="31" color="#089D5C" id="bt_minus" click="process_symbol('-')"/>
            <mx:Button x="145" y="176" label="*" width="36" height="31" color="#F018CA" id="bt_multiply" click="process_symbol('*')"/>
            <mx:Button x="145" y="215" label="/" width="36" height="31" color="#67B0BF" id="bt_divide" click="process_symbol('/')"/>
            <mx:Button x="180" y="59" label="C" width="58" height="31" color="#FB2407" id="bt_c" click="c()"/>
            <mx:Button x="189" y="98" label="=" width="49" height="148" id="bt_equal" click="equals()"/>
            <mx:Button x="103.75" y="59" label="CE" width="58" height="31" id="bt_ce" click="ce()"/>
            <mx:Button x="13" y="137" label="4" width="36" height="31" id="bt_4" click="addText('4')"/>
            <mx:Button x="57" y="137" label="5" width="36" height="31" id="bt_5" click="addText('5')"/>
            <mx:Button x="101" y="137" label="6" width="36" height="31" id="bt_6" click="addText('6')"/>
            <mx:Button x="13" y="176" label="1" width="36" height="31" id="bt_1" click="addText('1')"/>
            <mx:Button x="57" y="176" label="2" width="36" height="31" id="bt_2" click="addText('2')"/>
            <mx:Button x="101" y="176" label="3" width="36" height="31" id="bt_3" click="addText('3')"/>
            <mx:Button x="101" y="215" label="." width="36" height="31" id="bt_dot" click="addText('.')"/>
            <mx:Button x="13" y="215" label="0" width="80" height="31" id="bt_0" click="addText('0')"/>
        </mx:Panel>
    </mx:Canvas>
    
</mx:Application>









本文出自 “李骥平” 博客,请务必保留此出处http://fsjoy.blog.51cto.com/318484/222100

分享至
更多
一键收藏,随时查看,分享好友!
qilanling、ccc07
2人
了这篇文章
类别:flex on rails技术圈()┆阅读()┆评论() ┆ 推送到技术圈返回首页

文章评论

 
2009-11-05 17:35:09
2+8*3=30。。。
博主回复:
2009-11-05 22:50:12
怎么了?你好像有意见?

2009-12-18 09:37:25
相当厉害!

2011-04-03 00:36:07
像这样计算器   都好像有这个问题 连续这样计算就不行 4+5+6=

2011-12-21 23:37:18
您好,今天无意中看到您做的计算器。在您的基础上稍稍做了一些改变!有望以后一起交流!

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" creationComplete="init()" currentState="Prbar">
     <mx:states>
           <mx:State name="Prbar">
                 <mx:RemoveChild target="{canvas1}"/>
                 <mx:AddChild position="lastChild">
                       <mx:Canvas width="100%" height="100%">
                          <mx:ProgressBar id="progressBar"
                    complete="progressBar_complete(event);"
                    completeEffect="{progressBar_completeEffect}"
                    mode="manual"
                    labelPlacement="center"
                    width="500"
                    height="30"
                    creationComplete="init1();" alpha="1.0" horizontalCenter="0" verticalCenter="0"/>
                          <mx:Label text="正在加载中,请稍等" fontSize="16" horizontalCenter="-9" verticalCenter="-27"/>
                       </mx:Canvas>
                 </mx:AddChild>
           </mx:State>
     </mx:states>

<mx:Script>
  <![CDATA[  
    public var first:Number; //定义二目运算第一个数的存储变量
    public var second:Number;//第二个数的存储变量
    public var symbol:String;//运算符
    public var display_content:String='0';//input_Text显示内容
    private var timer:Timer;
        private var timer1:Timer;
   
    //进度条显示
      public function init1():void
            {
        timer = new Timer(10);
        timer1=new Timer(1000);
        timer.addEventListener(TimerEvent.TIMER, timer_timer);
        timer1.addEventListener(TimerEvent.TIMER, timer_timer1);
        timer.start();
      }
      public function timer_timer(evt:TimerEvent):void
      {
        progressBar.setProgress(progressBar.value + 1, 100);
      }
      public function timer_timer1(evt:TimerEvent):void
      {
        timer1.stop();
        this.currentState="";
       
      }
      public function progressBar_complete(evt:Event):void
      {
          timer.stop();
          timer1.start();
      }
     
      //键盘输入功能
    public function init():void
    {
         this.addEventListener( MouseEvent.CLICK, clickHandler );
         this.addEventListener(KeyboardEvent.KEY_DOWN,mykey);
          var timer:Timer=new Timer(100,1);
                 timer.addEventListener(TimerEvent.TIMER_COMPLETE,function(event:TimerEvent ):void{
                 event.target.stop();
                 dispatchEvent( new MouseEvent( MouseEvent.CLICK ));
                 });
                 timer.start();                  
    }
    public function clickHandler(event:MouseEvent):void
    {
         this.stage.focus =this;
    }
    public function mykey(e:KeyboardEvent):void
    {      
         switch(e.keyCode)
         {
               case 96:addText("0");break;
                case 48:addText("0");break;
          case 97:addText("1");break;
          case 49:addText("1");break;
          case 98:addText("2");break;  
          case 50:addText("2");break;
          case 99:addText("3");break;
          case 51:addText("3");break;
          case 100:addText("4");break;
          case 101:addText("5");break;
          case 53:addText("5");break;
          case 102:addText("6");break;
          case 54:addText("6");break;
          case 103:addText("7");break;
          case 55:addText("7");break;
          case 104:addText("8");break;
          case 56:addText("8");break;
          case 105:addText("9");break;
          case 57:addText("9");break;
          case 110:addText(".");break;
          case 107:process_symbol("+");break;
          case 109:process_symbol("-");break;
                       case 106:process_symbol("*");break;
                       case 111:process_symbol("/");break;
                       case 187:equals();break;
                       case 8:ce();break;
                       default:
         }
    }
    //正负号的改变
    public function zf():void
    {
         if(txt_display.text!='NaN')
            {
              if("-"==txt_display.text.charAt(0))
                                   txt_display.text=txt_display.text.substr(1,txt_display.text.length-1);
                              else
                              txt_display.text="-"+txt_display.text;
            }
    }
    //输入数字时显示内容
    public function addText(str:String):void
    {
        display_content+=str;
        var myFloat:Number = parseFloat(display_content);
        //处理小数点
        if(str!='.')
            {
              txt_display.text = myFloat.toString();
            }
        else
            {
              txt_display.text = myFloat.toString()+".";
              bt_dot.enabled=false;
            }            
        if(symbol!=null&&str!='NaN')
        {
        bt_plus.enabled=false;bt_minus.enabled=false;bt_multiply.enabled=false;bt_divide.enabled=false;
        }
    }
   
    //C按扭的功能
    public function c():void
    {
        display_content ='0';
        txt_display.text='0';
        first=NaN;
        second=NaN;
        symbol=null;
        bt_0.enabled=true;bt_1.enabled=true;bt_2.enabled=true;bt_3.enabled=true;bt_4.enabled=true;bt_5.enabled=true;bt_6.enabled=true;bt_7.enabled=true;bt_8.enabled=true;bt_9.enabled=true;
        bt_dot.enabled=true;
        bt_ce.enabled=true;
        bt_plus.enabled=true;bt_minus.enabled=true;bt_multiply.enabled=true;bt_divide.enabled=true;
    }

    //CE按扭功能
    public function ce():void
    {
        display_content='0';
        txt_display.text='0';
        second=NaN;
        bt_0.enabled=true;bt_1.enabled=true;bt_2.enabled=true;bt_3.enabled=true;bt_4.enabled=true;bt_5.enabled=true;bt_6.enabled=true;bt_7.enabled=true;bt_8.enabled=true;bt_9.enabled=true;
        bt_dot.enabled=true;
    }

    //运算功能
    public function cal():void
    {
        second=parseFloat(txt_display.text);
        switch (symbol)
            {
                case "+":
                first=first+second;
                break;
               
                case "-":
                first=first-second;
                break;
               
                case "*":
                first=first*second;
                break;
                           
                case "/":        
                first=first/second;
                break;
               
                default:
            }
          txt_display.text=first.toString();
          display_content='0';
          symbol=null;
          second=NaN;
          bt_0.enabled=false;bt_1.enabled=false;bt_2.enabled=false;bt_3.enabled=false;bt_4.enabled=false;bt_5.enabled=false;bt_6.enabled=false;bt_7.enabled=false;bt_8.enabled=false;bt_9.enabled=false;
          bt_dot.enabled=false;
          bt_ce.enabled=false;
          bt_plus.enabled=true;bt_minus.enabled=true;bt_multiply.enabled=true;bt_divide.enabled=true;
    }
   
    //输入运算符号的处理
    public function process_symbol(str:String):void
    {        
        if(first.toString()=='NaN')
          {
            first=parseFloat(txt_display.text);
            if(str!="=")
                { symbol=str; }
            display_content='0';
            bt_dot.enabled=true;
          }
        else if(second.toString()=='NaN')
        {
          symbol=str;
          bt_0.enabled=true;bt_1.enabled=true;bt_2.enabled=true;bt_3.enabled=true;bt_4.enabled=true;bt_5.enabled=true;bt_6.enabled=true;bt_7.enabled=true;bt_8.enabled=true;bt_9.enabled=true;
          bt_ce.enabled=true;
          bt_dot.enabled=true;
        }
    }
   
    //按等号时的处理
    public function equals():void
    {
        if(first.toString()=='NaN')
        {
          first=parseFloat(txt_display.text);
          display_content='0';
          bt_dot.enabled=true;
        }
        else
        {
          cal();      
        }
    }    
  ]]>
</mx:Script>
  <mx:Canvas width="309" height="354" id="canvas1">
    <mx:Panel y="10" width="273.5" height="334" layout="absolute" title="calculator" horizontalAlign="center" verticalAlign="middle" backgroundColor="#AFB6B9" horizontalCenter="-2">
        <mx:TextInput x="10.75" y="29" width="231" id="txt_display" text="0" textAlign="right"/>
        <mx:Button x="13" y="98" label="7" width="36" height="31" color="#0B0C0F" id="bt_7" click="addText('7')"/>
        <mx:Button x="57" y="98" label="8" width="36" height="31" id="bt_8" click="addText('8')"/>
        <mx:Button x="101" y="98" label="9" width="36" height="31" id="bt_9" click="addText('9')"/>
        <mx:Button x="145" y="98" label="+" width="36" height="31" color="#0DC5ED" id="bt_plus" click="process_symbol('+')" enabled="true"/>
        <mx:Button x="145" y="137" label="-" width="36" height="31" color="#089D5C" id="bt_minus" click="process_symbol('-')"/>
        <mx:Button x="145" y="176" label="*" width="36" height="31" color="#F018CA" id="bt_multiply" click="process_symbol('*')"/>
        <mx:Button x="145" y="215" label="/" width="36" height="31" color="#67B0BF" id="bt_divide" click="process_symbol('/')"/>
        <mx:Button x="180" y="59" label="C" width="58" height="31" color="#FB2407" id="bt_c" click="c()"/>
        <mx:Button x="189" y="98" label="=" width="49" height="148" id="bt_equal" click="equals()"/>
        <mx:Button x="103.75" y="59" label="CE" width="58" height="31" id="bt_ce" click="ce()"/>
        <mx:Button x="13" y="137" label="4" width="36" height="31" id="bt_4" click="addText('4')"/>
        <mx:Button x="57" y="137" label="5" width="36" height="31" id="bt_5" click="addText('5')"/>
        <mx:Button x="101" y="137" label="6" width="36" height="31" id="bt_6" click="addText('6')"/>
        <mx:Button x="13" y="176" label="1" width="36" height="31" id="bt_1" click="addText('1')"/>
        <mx:Button x="57" y="176" label="2" width="36" height="31" id="bt_2" click="addText('2')"/>
        <mx:Button x="101" y="176" label="3" width="36" height="31" id="bt_3" click="addText('3')"/>
        <mx:Button x="106" y="215" label="." width="36" height="31" id="bt_dot" click="addText('.')"/>
        <mx:Button x="13" y="215" label="0" width="36" height="31" id="bt_0" click="addText('0')"/>
        <mx:Button x="52" y="215" label="+/-" width="50" height="31" fontSize="12" click="zf()"/>
    </mx:Panel>
  </mx:Canvas>
  <mx:Parallel id="progressBar_completeEffect">
    <mx:Fade alphaTo="0.0" />
    <mx:Zoom zoomHeightTo="0" />
  </mx:Parallel>
</mx:Application>


 

发表评论            

【技术门诊】专家解析:软考重点难点及应试技巧
昵  称:
登录  快速注册
验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容: