網頁標題: 07 迴圈 While...WEnd, For...Next, Do...Until

Warning: fopen(/home/crazy/www/cmsb/bcj/has_read.php): failed to open stream: Permission denied in /home/crazy/www/compose/reading.php on line 2077

Warning: fputs() expects parameter 1 to be resource, bool given in /home/crazy/www/compose/reading.php on line 2079

Warning: fclose() expects parameter 1 to be resource, bool given in /home/crazy/www/compose/reading.php on line 2080
 
﹗﹗﹗觀看留言:此文章已經有1則留言 ﹗﹗﹗


 到目前為止所有程式都還是只執行一次,也就是從頭到尾,雖然因為有分支而越過某些程式碼不執行,但是無法一直做同樣一件事。快速反覆工作是電腦的大優勢,所謂的「迴圈」就是要求電腦一直做同一件事。AutoIt 提供了三種迴圈,分別是 While...WEnd, For...Next 及 Do...Until. 下面以 While...WEnd 展示如何叫電腦反覆工作:

 While 之後也是接一個條件,執行到 While 時會判斷該條件,滿足將進入 While...WEnd 之間的程式,不滿足直接越過迴圈。當 While...WEnd 內執行完,又回來判斷 While 的條件,根據是否滿足決定要不要再一次迴圈裡的程式。上例的條件是 1, AutoIt 中的整數除了 0 當成跟「假」一樣,其餘都是「真」,這裡條件永遠為真,就稱為「無窮迴圈」。

 迴圈裡可以用 ExitLoop 指令,讓 AutoIt 直接跳到 WEnd 之後執行,這是離開無窮迴圈的方法之一,也可以用在一般迴圈。通常都如上例所示,達到某條件即離開,但是判斷條件的位置又不在迴圈的首或尾,就用無窮迴圈而在中間設置離開的條件。


 第二種迴圈的寫法是使用 For...Next. 很多情況下,迴圈需要一個計數的變數,所謂「計數」就是該變數會從一個初值開始,逐漸遞增或遞減到迴圈結束,如迴圈執行三次,變數 $i 每圈的值分別是 1, 2, 3. 下例展示使用 For...Next 迴圈實作 1+2+...+n 的計算:

 這是 For...Next 迴圈最基本的外型,For 後面寫的是一個範圍而非條件,第一次迴圈從 To 左邊的值開始,遞增到 To 右邊的值為止。注意,上例 $i 在最後一次執行迴圈內容時恰好是 To 右邊的 $n, 也就是 100.

 但是,通常 $i 在迴圈內會被使用,像上例就與 $sum 一起運算,有許多場合雖然每圈需要的 $i 值之間變化有規則,可是整體 $i 的範圍不好用上例的寫法來滿足,比如希望一次遞增 2, 或者希望 $i 變化的方向是遞減而非一直加 1.

 因此,可以用 Step 關鍵字替迴圈指定 $i 的走向,如下例的 $i 將在迴圈裡從 1 開始遞增,每次遞增時增加 2, 在小於 10 時會繼續執行迴圈。不過一般狀況下未指定 Step, 就等同於 Step 1.

 上例的 $i 五次迴圈裡分別是 1, 3, 5, 7, 9, 注意它並沒有用 10 執行迴圈。既然可以自由指定 Step, $i 在執行過程中就不一定在某圈裡恰等於 To 右邊的邊界值。如果 $i 會恰好落在該邊界上,則邊界值的 $i 也會被執行一次迴圈,如果遞增或遞減的時候越過邊界就直接跳出整個迴圈了。

 以上 For...Next 之中 To 兩邊的邊界及 Step 後指定的值都可以使用「變數」填入,然而 AutoIt 要求迴圈內容中禁止改變 To 右邊的邊界及指定 Step 用的變數。另外,使用變數指定 Step 時請用分支的方法避免內容是 0 的變數被指定為 Step, 否則迴圈將永遠無法停止!


 For...Next 有另一種使用 In 而非 To 的指定範圍方式,可以對「集合」中每個元素各拜訪一次,「集合」只是一個概念,實際的例子如陣列,它把許多變數集結在一起,另外有些「物件」也可以用 For...In...Next 掃過其內容物。下面以 In 方式依序印出一維陣列裡各元素:

 因為 $array 有四個元素,所以迴圈將執行四次,每次迴圈中 $element 分別是 $array 裡某個元素。迴圈內禁止對 $array 進行「修改」,同樣地,對 $element 的修改將不在 $array 發生效用。此種迴圈寫法二個主要特色是,對陣列內容唯讀,以及忽略當前跑到第幾次。

 另外,上例中出現 @CRLF, 也是一個「巨集」,等效於歸位 (carriage return, @CR) 與換行 (line feed, @LF) 連接,記事本當按下 Enter 其實就在行尾加入這個字串,把它印在 MsgBox 能要求訊息換行顯示。從 Unix 類的作業系統如 Ubuntu 抓檔案來 Windows 閱讀發現亂碼,很可能是 Unix 的換行只有 @LF, 而記事本換行是 @CRLF 所致。

 下例改用 To 方式重新實作範例 7-4:

 很明顯可看出,範例 7-4 的寫法比範例 7-5 乾淨許多,因此如果可以用 In 建議盡量使用,有改變陣列內容的需求才用 To.


 第三個迴圈的選擇是 Do...Until, 示範如下:

 $i 從 0 起,一直遞增 1, 每次執行完迴圈內容就判斷 Until 後寫的條件,要是達到就離開。這種類型適合條件在最後一個敘述的狀況。

 其實 While...WEnd 等價於 Do...Until 放在分支的程式碼中,但是 While...WEnd 不大方便直接調整成 Do...Until 的模樣,而 Do...Until 還要配合分支去產生 While...WEnd 的話也很多餘,因此兩者都有其存在的價值。


 下面是 AutoIt 三種迴圈的總結:

 While...WEnd 是迴圈中最直覺常見的,執行前先判斷條件,每次執行後也判斷一次條件決定是否衝復。For...Next 會把計數器給定預設範圍,到整個迴圈結束為止都不能改變範圍。Do...Until 迴圈要執行進去時,開頭沒有判斷條件,所以必先執行一次迴圈內容,然後才開始判斷條件決定是否重複。

 提醒:除了 For...Next 計數用的變數是寫在 To 左邊,其他變數最好盡量宣告在迴圈之外,以避免每次執行迴圈內容遇見變數宣告就要花時間重新在記憶體分配一個空間。


回 · 我的 AutoIt 學習筆記 這一篇文章封面
回 · 我的 AutoIt 學習筆記 這一篇文章封面


本文張貼者:Bo-Cheng Jhan〔張貼時間:民國105年4月30日(星期六)4點09分 | 更新次數 #1 | 最後更新:民國105年5月14日(星期六)16點25分〕

部落格首頁


學習的故鄉首頁
本站公告:〔您越需要我們,我們就越有創意〕 本站說明書:〔發現故鄉還有改進的地方,請來信告訴原丁們〕
觀察應用學習點數 :〔咱的故鄉有您的參與,會使我們有更大的發揮空間,展現更豐富精彩的學習畫面〕 〔期待藉由無障礙網頁設計,能讓視障小朋友更愛看書、更愛寫作且更愛學習〕:盲用電腦「心得分享」
〔為了讓我們有乾淨的學習環境,請勿任意在本站散播商業廣告與不合法文件或聯結〕:本站宣示