官术网_书友最值得收藏!

第3章 AS 3.0程序設計

任何一門編程語言都要設計程序問題,ActionScript 3.0也不例外。本章將介紹ActionScript 3.0中代碼的基本語句以及程序設計的一般過程。首先介紹程序控制的邏輯運算,然后著重介紹條件語句和循環語句。

3.1 邏輯運算

在程序設計的過程中,要實現程序設計的目的,必須進行邏輯運算。只有進行邏輯運算,才能控制程序不斷向最終要達到的目標前進,直到最后實現目標。

邏輯運算又稱為布爾運算,通常用來測試真假值。邏輯運算主要使用條件表達式進行判斷,如果符合條件,則返回結果true;不符合條件,返回結果false。

條件表達式中最常見的形式就是利用關系運算符進行操作數比較,進而得到判斷條件。

當然,有些情況下需要控制的條件比較多,那么就需要使用邏輯表達式進行邏輯運算,得到一個組合條件,并控制最后的輸出結果。

常見的條件表達式舉例如下:

?(a>0):表示判斷條件為a>0。若是,返回true;否則返回false。

?(a==b)&&(a>0):表示判斷條件為a大于0,并且a與b相等。若是,返回true,否則返回false。

?(a==b)||(a>0):表示判斷條件為a大于0,或者a與b相等。若是,返回true,否則返回false。

邏輯運算執行的最終結果,就是返回一個Boolean型的變量true或者false,然后按照程序的要求,執行相應的操作。

3.2 程序的3種結構

在程序設計的過程中,如果要控制程序,應安排每句代碼執行的先后次序,這個先后執行的次序稱為“結構”。常見的程序結構有3種:順序結構、選擇結構和循環結構。本節將分別介紹一下這3種程序結構的概念和流程。

3.2.1 順序結構

順序結構最簡單,就是按照代碼的順序,一句一句地執行操作,結構如圖3.1所示。

圖3.1 順序結構

ActionScript代碼中的簡單語句都是按照順序進行處理的,這就是順序結構。請看下面的示例代碼:

    //執行第一句代碼,初始化一個變量
    var a:int;
    //執行第二句代碼,給變量a賦值數值1
    a=1;
    //執行第三句代碼,變量a執行遞加操作
    a++;

3.2.2 選擇結構

當程序有多種可能的選擇時,就要使用選擇結構。選擇哪一個,要根據條件表達式的計算結果而定。結構如圖3.2所示。

圖3.2 選擇結構

舉個簡單的例子,使用if...else語句實現這樣的效果。如果現在時間超過了22點,就停止寫作,否則繼續寫作。程序代碼如下所示:

    if(現在時間>22){
    停止寫作
    }else{
    繼續寫作
    }

3.2.3 循環結構

循環結構就是多次執行同一組代碼,重復的次數由一個數值或條件來決定。結構如圖3.3所示。

圖3.3 循環結構

循環結構只是包含了選擇結構,因為它要判斷是否符合條件,如果符合條件才會執行代碼,否則就會跳出循環,執行后面的代碼。對編程過程來說,循環結構能夠節約程序代碼,提高執行效率。例如,要在輸出面板輸出0~9這10個數,不使用循環結構,代碼只能這樣寫:

    trace(0);
    trace(1);
    trace(2);
    trace(3);
    trace(4);
    trace(5);
    trace(6);
    trace(7);
    trace(8);
    trace(9);

要寫10行代碼才能完成,而使用循環結構,只需用3行就可以實現相同的效果。代碼如下所示:

    for (var i:uint; i<10; i++) {
          trace(i);
    }

3.3 選擇程序結構

選擇程序結構就是利用不同的條件執行不同的語句或者代碼。ActionScript 3.0有3個可用來控制程序流的基本條件語句,分別為if...else條件語句、if...else if...else條件語句、switch條件語句。本節將詳細講解這3種不同的選擇程序結構。

3.3.1 if...else 條件語句

if...else條件語句判斷一個控制條件,如果該條件能夠成立,則執行一個代碼塊,否則執行另一個代碼塊。

if...else條件語句基本格式如下:

    if(表達式){
      語句1;
    }
    else
    {
    語句2;
    }

說明

如果表達式的值為真,就執行語句1,否則就執行語句2。

下面使用if...else條件語句實現年份是否為閏年的判斷。

由分析可知,閏年的判斷條件有以下兩條:

?當年份能被4整除,且不能被100整除,則該年為閏年。

?當年份能被4整除,又能被400整除,則該年為閏年。

如果年份滿足上述兩個條件中的一個就是閏年。

若用year來表示存放年份的變量,則條件可以表示為:

    (year%400==0)||(year%4==0)&&(year%100!=0)

完成后的代碼如下所示:

    var year:int=2008;
    if ((year%400==0)||(year%4==0)&&(year%100!=0)) {
          trace("今年是閏年");
    } else {
          trace("今年不是閏年");
    }

如果只是想在滿足某個條件時執行操作,而不滿足時不執行操作,可以省略else語句。格式如下所示:

    if(表達式){
    語句;
    }

3.3.2 if...else if...else語句

if...else條件語句執行的操作最多只有兩種選擇,如果有更多的選擇,那就可以使用if...else if...else條件語句。

if...else if...else語句格式如下:

    if(表達式1){
    語句1;
    }
    else if (表達式2){
    語句2;
    }
    else if (表達式3){
    語句3;
    }
    .
    .
    .
    else if (表達式n){
    語句n;
    }
    else{
    語句 m;
    }

可以通過使用多個else?if來進行多個條件的判斷,最后的else語句塊可有可無(根據實際需要選用)。但是,這種多層條件判斷語句在層次太多時執行速度較慢。另外如果條件過多,在編程的時候容易出現錯誤。

下面使用if...else if...else語句來實現網絡上非常流行的隔段問候語效果。要實現的效果為先判斷當前的時間,然后根據當前的時間來作出判斷。

完成后的代碼如下所示:

    //獲取當前時間
    var date:Date=new Date();
    //獲取當前的小時
    var hh:int=date.getHours();
    //進行判斷
    if (( hh >= 0 ) && (hh <= 4 )) {
          trace("深夜了,注意身體,該休息了!");
    } else if (( hh >= 4 ) && (hh < 7)) {
          trace("清晨好,這么早就上網呀?! ");
    } else if (( hh >= 7 ) && (hh < 12)) {
          trace("早上好,一日之際在于晨,又是美好的一天!");
    } else if (( hh >= 12) && (hh <= 13)) {
          trace("該吃午飯啦!有什么好吃的?");
    } else if (( hh >= 13) && (hh <= 17)) {
          trace("外面的天氣很熱吧?!心靜自然涼! ");
    } else if (( hh >= 17) && (hh <= 18)) {
          trace("太陽落山了!快看看夕陽吧!");
    } else if ((hh >= 18) && (hh <= 19)) {
          trace("吃過晚飯了嗎?");
    } else if ((hh >= 19) && (hh <= 23)) {
          trace("一天過得可真快!今天過得好嗎?");
    }

說明 if...else語句實現條件判斷,但是使用起來相對比較煩瑣一點,需要在使用的過程中根據需要來選擇。

3.3.3 switch語句

switch語句相當于一系列的if...else if...else語句,但是比if語句要清晰得多。switch語句不是對條件進行測試以獲得布爾值,而是對表達式進行求值,并使用計算結果確定要執行的代碼塊。

switch語句格式如下:

    switch (表達式) {
          case1:
            程序語句1;
            break;
          case2:
            程序語句2;
            break;
          case3:
            程序語句3;
            break;
        default:
              默認執行程序語句;
    }

格式說明如下:

?表達式:可以是任何表達式,其結果是一個具體的值。

?case:關鍵字,其后跟有一個表達式、冒號和一組語句。如果在使用全等(===)的情況下,若此處的表達式與switch的表達式的參數相匹配,則執行這組語句。

?break:跳出判斷語句,也就是說,如果上面的表達式判斷正確,已經執行了相應的語句,那么執行以后將跳出判斷。

?default:關鍵字,其后跟有一組語句。如果case表達式都不與switch的表達式參數全等(===)匹配時,將執行這些語句。

下面使用switch語句結合Date.getDay()方法返回的日期值輸出當前的星期日期,代碼如下所示:

    //獲取當前時間
    var date:Date = new Date();
    //獲取當前是星期幾
    var dd:uint = date.getDay();
    switch (dd) {
          case 0:
                trace("今天星期日");
                break;
          case 1:
                trace("今天星期一");
                break;
          case 2:
                trace("今天星期二");
                break;
          case 3:
                trace("今天星期三");
                break;
          case 4:
                trace("今天星期四");
                break;
          case 5:
                trace("今天星期五");
                break;
          case 6:
                trace("今天星期六");
                break;
          default:
                trace("超出星期范圍,是不可能的!");
                break;
    }

說明 break關鍵字是跳出執行語句,在遇到該關鍵字后,程序代碼將不再執行。

3.4 循環程序結構

在現實生活中有很多規律性的操作,作為程序來說就是要重復執行某些代碼。其中重復執行的代碼稱為循環體,能否重復操作,取決于循環的控制條件。循環語句可以認為是由循環體和控制條件兩部分組成。

循環程序的結構一般有兩種:

?一種是先進行條件判斷,若條件成立,執行循環體代碼,執行完成之后再進行條件判斷,若條件成立,循環繼續,否則退出循環。若第一次條件就不滿足,則一次也不執行,直接退出。

?另一種是先執行操作,不管條件,執行完成之后進行條件判斷,若條件成立,循環繼續,否則退出循環。

下面依次介紹ActionScript 3.0中的循環語句:for循環語句、while循環語句、do...while循環語句、for...in循環語句和for each...in循環語句。

3.4.1 for循環語句

for循環語句是ActionScript編程語言中最靈活、應用最為廣泛的語句。for循環語句語法格式如下:

    for(初始化;循環條件;步進語句) {
      循環執行的語句;
    }

格式說明如下:

?初始化:把程序循環體中需要使用的變量進行初始化。注意要使用var關鍵字來定義變量,否則編譯時會報錯。

?循環條件:邏輯運算表達式,運算的結果決定循環的進程,若為false,退出循環,否則繼續執行循環代碼。

?步進語句:算術表達式,用于改變循環變量的值。通常為使用++(遞增)或--(遞減)運算符的賦值表達式。

?循環執行的語句:循環體,通過不斷改變變量的值,以達到需要實現的目標。

下面的這段代碼可以用來計算1~100的自然數之和:

    //初始化變量
    var sum = 0;
    //下面是 for 循環
    for (var i:int=1; i<=100; i++) {
          //在計算加和的基礎上累加
    sum = sum + i;//循環體
    }
    trace("sum="+sum);

代碼運行后的輸出結果如下所示:

    //輸出結果:sum=5050

另外,利用逗號運算符(,)可以在for循環中增加變量和控制語句。語法格式如下所示:

    for(初始化語句1,初始化語句2;循環條件;步進語句1,步進語句2)

下面計算兩個變量之積小于100的值,并輸出對應的計算表達式。代碼如下所示:

    for (var a:int=1,b:int=20; a*b<100; a++,b--) {
          trace(a+"*"+b+"="+a*b);
    }

代碼運行后的輸出結果如下所示:

    1*20=20
    2*19=38
    3*18=54
    4*17=68
    5*16=80
    6*15=90
    7*14=98

注意 在多個初始化語句中,只能在第一個初始化語句中使用var關鍵字,其他的語句不能使用var關鍵字,否則編譯器會報錯。

3.4.2 while循環語句

while循環語句是典型的“當型循環”語句,意思是當滿足條件時,執行循環體的內容。while循環語句語法格式如下:

    while(循環條件) {
      循環執行的語句
    }

格式說明如下:

?循環條件:邏輯運算表達式,運算的結果決定循環的進程,若為true,繼續執行循環代碼,否則退出循環。

?循環執行的語句:循環體,其中包括變量改變賦值表達式,以及執行語句并實現變量賦值。

該語句是常用的循環語句,其代碼的執行過程為:先測試循環條件的邏輯結果,如果返回true,則運行循環語句塊,如果該條件為false,則跳過該語句塊,并執行while動作語句塊之后的第一條語句。下面使用while循環計算1~100的自然數之和。代碼如下所示:

    //先初始化變量
    var i:int = 0;
    var sum:int=0;
    //下面是 while 循環
    while (i <= 100) {
          sum = sum + i;
          i++;
    }
    trace("sum="+sum);

代碼運行后的輸出結果如下所示:

    sum=5050

3.4.3 do...while循環語句

do...while循環是另一種while循環,它保證至少執行一次循環代碼,這是因為其在執行代碼塊后才會檢查循環條件。do...while循環語句語法格式如下:

    do {
      循環執行的語句
    } while (循環條件)

格式說明如下:

?循環執行的語句:循環體,其中包括變量改變賦值表達式,以及執行語句并實現變量賦值。

?循環條件:邏輯運算表達式,運算的結果決定循環的進程,若為true,繼續執行循環代碼,否則退出循環。

該語句的執行順序和while語句有一定的區別。該循環要先執行語句,然后進入循環條件判斷,如果條件為true,繼續進行循環,否則跳出循環。

下面使用do...while循環計算1~100的自然數之和。代碼如下所示:

    //初始化變量
    var i:int=0;
    var sum:int;
    //循環語句
    do {;
    //循環體
    sum+=i;
    i++;
    } while (i<=100);
    //輸出結果
    trace("sum="+sum);

代碼運行后的輸出結果如下所示:

    sum=5050

3.4.4 for...in和for each...in語句

for...in和for each...in語句都可以用于循環訪問對象屬性或數組元素。下面分別使用這兩個語句來訪問對象中的屬性。代碼如下所示:

    //定義一個對象lzxt,并添加屬性nameage
    var lzxt:Object = {name:"浪子嘯天", age:30};
    //執行遍歷操作
    for (var i:String in lzxt) {
          //輸出屬性名稱和屬性值
          trace("for in 語句輸出:"+i + ": " + lzxt[i]);
    }
    //執行for each遍歷操作
    for each (var k:String in lzxt) {
          //輸出屬性值
        trace("for each 語句輸出:"+k);
    }

代碼運行后的輸出結果如下所示:

    for in 語句輸出:age: 30
    for in 語句輸出:name: 浪子嘯天
    for each 語句輸出:30
    for each 語句輸出:浪子嘯天

說明

從上面語句的測試結果可以看出,for...in語句在執行遍歷對象操作時,遍歷的結果是對象的屬性;for each...in語句遍歷的結果是屬性的值。另外,for...in語句可以通過數組訪問符“[]”和遍歷出的對象屬性來訪問對象屬性的值。

下面分別使用兩種語句來遍歷數組中的值。代碼如下所示:

    //定義一個數組變量,并初始化賦值
    var arr:Array = ["one", "two", "three"];
    //執行for in 遍歷操作
    for (var i:String in arr) {
          //輸出數組的值
          trace(arr[i]);
    }
    //執行for each in遍歷操作
    for each (var k in arr) {
          trace(k);
    }

代碼運行后的輸出結果如下所示:

    one
    two
    three
    one
    two
    three

從一些程序的測試結果來看,for each...in語句比for...in語句的執行速度要快,執行效率要高。

for each...in語句除了可以用來遍歷對象和數組的值,還可以通過循環訪問XML或XMLList對象。下面使用for each...in語句來訪問XML對象,代碼如下所示:

    //聲明一個XML對象,并初始化賦值
    var myXML:XML = <book>
                          <bookname>flash cs3之路</bookname>
                          <bookname>as3基礎教程</bookname>
                          <bookname>flex語言基礎</bookname>
                      </book>;
    //屬于for each...in操作遍歷XML對象
    for each (var item in myXML.bookname) {
          //輸出遍歷獲得的結果
          trace(item);
    }

代碼運行后的輸出結果如下所示:

    flash cs3之路
    as3基礎教程
    flex語言基礎

使用for each...in語句可以很方便地訪問XML對象,并獲取節點屬性的值。

3.4.5 循環的嵌套

嵌套循環語句是在一個循環的循環體中存在另一個循環體,如此重復下去直到循環結束為止,即為循環中的循環。以for循環為例,格式如下所示:

    for (初始化; 循環條件; 步進語句) {
          for (初始化; 循環條件; 步進語句) {
                  循環執行的語句;
          }
    }

下面使用循環語句,實現一個九九乘法表的效果。代碼如下所示:

    //循環語句1
    for (var i:int=1; i<10; i++) {
          //循環語句2
          for (var j:int=1; j<=i; j++) {
                  //循環體
                  var label:TextField=new TextField();
                  label.text=i+"×"+j+"="+i*j;
                  label.x=5+50*i;
                  label.y=20*j;
                  addChild(label);
            }
    }

完成后的效果如圖3.4所示。

圖3.4 九九乘法表效果圖

循環嵌套可以解決很多比較麻煩的問題,但是也有一些需要注意的地方:

?使用嵌套循環時,內部循環體的變量不要和外部循環體的變量相同。

?嵌套循環結構的書寫,最好用嚴格格式,采用相應的縮進,以體現循環層次。

?要盡量避免使用太多層的循環結構,否則執行的效率會比較低。

3.4.6 循環流程控制語句

在ActionScript 3.0中可以使用break和continue來控制循環流程。break語句的結果是直接跳出循環,不再執行后面的語句;continue語句的結果是停止當前這一輪的循環,直接跳到下一輪的循環,而當前輪次中continue后面的語句也不再執行。

下面的兩個例子分別執行循環變量從0遞增到10的過程,如果i等于4,分別執行break和continue語句,觀察各自執行的情況。代碼如下所示:

    //使用break控制循環
    for (var i:int=0; i<10; i++) {
          if (i==3) {
                  break;
          }
          trace("當前數字是:"+i);
    }

代碼運行后的輸出結果如下所示:

    當前數字是:0
    當前數字是:1
    當前數字是:2

下面使用continue控制循環,代碼如下所示:

    for (var j:int=0; j<10; j++) {
          if (j==3) {
                  continue;
          }
          trace("當前數字是:"+j);
    }

代碼運行后的輸出結果如下所示:

    當前數字是:0
    當前數字是:1
    當前數字是:2
    當前數字是:4
    當前數字是:5
    當前數字是:6
    當前數字是:7
    當前數字是:8
    當前數字是:9

說明

從上面代碼的輸出結果來看,break語句直接退出了循環,只輸出到2,就連已經執行到的數值3都沒有輸出;continue語句則只是退出了當前輪次語句的執行,當重新開始后繼續執行循環,故至少輸出了i=3這一個結果。

break語句控制循環流程的退出。如果是在嵌套循環中,則主循環體內的break只能退出當前的循環,不能退出外部的循環。要使用break控制,則必須使用多個break語句。而ActionScript中引入了標簽,新的標簽可以和循環體一起使用,通過break標簽的方法直接退出循環。下面的示例從內循環直接退出主循環。代碼如下所示:

    var j:Number;
    mainLoop:for (var i:int=0; i<10; i++) {
        for (j=0; j<10; j++) {
                if (i > 3 || j > 3) {
                          break mainLoop;
                }
                trace(i,j);
        }
    }

代碼運行后的輸出結果如下所示:

    0 0
    0 1
    0 2
    0 3

說明

其中的mainLoop就是自定義的標簽,當表達式i > 3 || j > 3返回為false時,就退出循環。

3.5 練習題

1. 用for循環計算1,2,4,8,?,2n(n=10)的和。

2. for(var...in...)和for each(...in...)是我們常用的遍歷方法,它們有什么區別?

3. 補充下面代碼,輸出數據中的書名,輸出格式為:

    book1:sky
    book2:the wind

代碼:

    var arr:Array=[{name: "yyy",book: "sky"},{name: "xiang"},book: "the wind"]
    for(var i in arr){
    var data:Object=arr[i];
          for(var j in data){
    trace(                             )
    }
    }

4. 運行以下代碼,i的值會是( )。

    for(var i=0;i<10;++i){
    }
    i=i+++i++;
    trace(i);

A. 11

B. 12

C. 21

D. 22

主站蜘蛛池模板: 石台县| 晴隆县| 东乡| 四子王旗| 庆云县| 寻乌县| 丹寨县| 镇坪县| 沂源县| 中西区| 唐海县| 岐山县| 康乐县| 彭山县| 吉林市| 云阳县| 遂宁市| 七台河市| 故城县| 黄龙县| 嘉鱼县| 北辰区| 临高县| 化州市| 维西| 吉安市| 曲松县| 资兴市| 肥城市| 同德县| 凤翔县| 呼玛县| 抚州市| 无为县| 广水市| 丹寨县| 广汉市| 孝义市| 洞口县| 革吉县| 遵义县|