2018年5月17日 星期四

AutoIt 學習筆記 : 流程控制

流程控制包括條件式之選擇結構與迴圈之循環結構兩大類. 本系列之前的筆記參考 :

AutoIt 學習筆記 : 基本語法
AutoIt 內建 SciTE 的字型設定問題


一. 選擇結構 (條件式) :

1. If 結構 :

AutoIt 的 If 有四種結構, 但是每一個 If, Then, Else, ElseIf 方塊內也可以有內部 If 結構 (巢狀). 注意, 每一個 If 區塊都要有 EndIf, 只有單行條件式不需要 EndIf.

(1). If … Then 單行結構 : (無 EndIf)

當只有一個運算式時, 可以將其直接放在 Then 後面, 整個 If … Then … 只有一行, 不可再加 EndIf  (否則執行錯誤), 例如 :

      If $x > 0 Then MsgBox(0, “結果”, “正數”)

(2). If … Then … EndIf  結構 :

當運算式放在 Then 的下一行時, 一定要用 EndIf 結束 (否則執行錯誤) :

      If $x > 0 Then
        MsgBox(0, “結果”, “正數”)
      EndIf

(3). If … Then … Else … EndIf  結構 :

      If $x > 0 Then
        MsgBox(0, “結果”, “正數”)
      Else
        MsgBox(0, “結果”, “非正數”)                   ;不可與 Else 同一行
      EndIf

(4). If … Then … ElseIf … Then … Else … EndIf  結構 :

      If $x > 0 Then
        MsgBox(0, “結果”, “正數”)
      ElseIf $x=0 Then                     ;這個 Then 不要忘記了 (注意 ElseIf 中間無空格)
        MsgBox(0, “結果”, “零”)
      Else                                          ;當所有 If 與 ElseIf 均不符時執行 Else (非必須)
        MsgBox(0, “結果”, “負數”)
      EndIf

2. Select Case … Case Else … EndSelect 結構 :

Select Case 是 AutoIt 兩個多重選擇結構之一, Select Case 較適用於多重條件式, 而另一個  Switch … Case 則較適用於單一條件式. 同一問題兩個結構都可解決, 但差別是 Select 的  Case 是放條件式, 而 Switch 的 Case 是放數值或值域 (Range). 例如 :

  Select
    Case $Score>90 And $Score<=100
        MsgBox(0, “榜單”, “正取”)
    Case $Score>80 And $Score<=90
        MsgBox(0, “榜單”, “備取”)
    Case Else
        MsgBox(0, “榜單”, “落榜”)
  EndSelect

  ** 注意, Case Else (中間空一格) 並非必要項, 即使無Case Else語法仍屬正確.

3. Switch … Case … Case Else … EndSwitch 結構 :

此結構功能雖與Select Case類似, 但是Switch後面須有一個運算式; 而Case放的是這個運算式的值或值域, 例如 :

  $Return=MsgBox(1, "確認", "確定要刪除這筆資料?")
  Switch $Return
    Case 1
        MsgBox(0, “回傳值”, “1=確定”)
    Case 2
        MsgBox(0, “回傳值”, “2=取消”)
  EndSwitch

  ** 注意, 運算式的值也可以是字串或布林值 :

  Switch $Answer
    Case true
        MsgBox(0, “答案”, “是”)
    Case false
        MsgBox(0, “答案”, “否”)
  EndSwitch

  而上述Select Case之榜單範例也可以改寫為 Switch 版 :

  Switch $Score
    Case 91 To 100
        MsgBox(0, “榜單”, “正取”)
    Case 81 To 89
        MsgBox(0, “榜單”, “備取”)
    Case Else
        MsgBox(0, “榜單”, “落榜”)
  EndSwitch

** 注意 : 當Case後面是值域時, 是包含這兩個值的, 所以從 Select 移植時必須依照 Select 之條件式改寫為適當之值域, 不要有所重疊. 當值域有重疊時, 會以第一個符合之Case優先.
** 值域也可以用在字串, 這時會自動將字串轉成數值再判斷區間落在哪一個Case, 例如 :

  $Return="O"    ;結果將顯示 “N-T”
  Switch $Return
    Case "A" TO "M"
        MsgBox(0, "回傳值", "A-M")
    Case "N" TO "T"
        MsgBox(0, "回傳值", "N-T")
    Case Else
        MsgBox(0, "回傳值", "U-Z")
  EndSwitch

4. ContinueCase 的用法

ContinueCase 是用來告訴 AutoIt 停止目前的 Case, 直接跳到下一個 Case 執行. 因為 Select 與 Switch 結構內之 Case均是單一執行分支, 僅能有一個Case會執行, 對某些程式邏輯而言形成結構上的限制, 這時就可以用 ContinueCase 來彌補, 不必跳出選擇結構. 注意, 此指令只能用在Case區塊內, 否則將導致嚴重錯誤.

  Switch $X
    Case 1
        $Y="進入測驗區, 請繼續…"
        ContinueCase   ;跳到下一Case繼續執行
    Case 2
        $Y &= "選擇題共20題, 請繼續…"
    Case Else
        $Y= "答題結束, 再見"
EndSwitch


二. 循環結構 (迴圈) :

AutoIt 有下列四種循環結構 :

  1. For...Next 
  2. For...In...Next
  3. While...WEnd 
  4. Do...Until 



1. For Next 迴圈 :

迴圈會以一 Local 變數為計數器循環執行直到符合 To 所指定之停止條件為止. Step 項非必須,  其預設值為 1. 當 Step 為正數時, 停止值必須大於或等於開始值, 迴圈才會執行; 當 Step 為負數時, 開始值必須大於或等於開始值, 迴圈才會執行. 下例計算 1~99 奇數之和 :

  1+3+5+7 … +99=2500 (注意, 不是加到 100, 因 99 下一階為 101 已超過停止值)

  Dim $Sum=0
  For $i=1 To 100 Step 2     ;$i是不須宣告之Local變數
     $Sum += $i
  Next
  MsgBox(0, "奇數和", $Sum)

2. For In Next 迴圈 :

此迴圈結構只能用在變數為陣列或 COM 物件集合時, 用來拜訪陣列或物件集合之元素.

範例 1 : 拜訪陣列元素

  Dim $Letter[4]=["A", "B", "C", "D"]     ;必須宣告Scope, 否則錯誤
  For $i In $Letter
     MsgBox(0, "字母", $i)
  Next

範例 2 : 拜訪物件集合

  $oShell=ObjCreate("shell.application")  ;建立物件
  $oShellWindows=$oShell.windows     ;產生視窗物件集合
  If IsObj($oShellWindows) Then        ;檢查物件集合是否建立成功
    $String=""
    For $Window in $oShellWindows    ;拜訪視窗物件集合之元素
       $String &= $Window.LocationName & @CRLF    ;產生顯示字串
    Next
    MsgBox(0,"視窗列表","已開啟的視窗:" & @CRLF & $String)
  Else
    MsgBox(0," 視窗列表","未開啟任何視窗")
  EndIf

3. While WEnd 迴圈

此結構為先測迴圈, 意即在執行迴圈內容之前, 先測試條件式 (關係或邏輯) 是否符合, 結果為真才進入迴圈執行. 下例計算 100 以內奇數之和 1+3+5+7+ … +99=2500 :

  Local $Sum=0, $i=1           ;初始值
  While $i < 100
        $Sum += $i            ;加總
        $i += 2                ;步進值=2
  Wend
  MsgBox(0,"奇數之和",$Sum)   ;結果為2500

4. Do Until 迴圈

此結構為後測迴圈, 意即會先執行迴圈內容一次, 再測試條件式 (關係或邏輯) 是否符合, 結果為真才繼續執行迴圈內容. 因此 Do Until 迴圈會至少執行一次. 計算100以內奇數之和 1+3+5+7+ … +99=2500 之程式改寫為 Do Until 如下 :

  Local $Sum=0, $i=1           ;初始值
  Do
     $Sum += $i               ;加總
     $i += 2                   ;步進值=2
  Until $i > 100
  MsgBox(0,"奇數之和",$Sum)   ;結果為2500
  ** 注意, 因為先後測之邏輯相反, 故Do Until與While WEnd 的條件式須相反

5. 與迴圈相關之指令

欲干涉迴圈結構之執行順序用的

(1). ContinueLoop : 跳過後面的運算, 直接進入下一個循環, 例如 1~100 之奇數和之計算 :

      Dim $Sum=0
      For $i=1 To 100                                  ;$i是不須宣告之Local變數
         If mod($i, 2)==0 Then ContinueLoop   ;偶數就跳過, 進入下一循環
         $Sum += $i                                      ;奇數就累加
      Next
      MsgBox(0, "奇數和", $Sum)             ;和=2500

(2). ExitLoop : 跳出目前的迴圈, 停止尚未執行完其他循環

下例計算輸入數目之累計和, 直到輸入Q跳出無窮迴圈

      $Sum=0
      While 1                                                                 ;使用無窮迴圈
            $Input=InputBox("累加計算","請輸入數字(Q 跳出)")  ;輸入數字
            If $Input=="Q" Then ExitLoop                      ;輸入 Q 跳出累計迴圈
            $Sum += $Input
      Wend
      MsgBox(0,"累加計算總和", "總和=" & $Sum)

沒有留言 :