微剋多資訊

 找回密碼
 註冊

Login

Login

搜索
回覆 1則 瀏覽 4610篇

[教學] AutoIt 幼幼班第二課 - 資料型態 與 字串處理

該用戶從未簽到

發表於 2012-10-21 16:02 | 顯示全部樓層 |閱讀模式
本帖最後由 rictirse 於 2012-12-2 14:56 編輯

簡述一下AutoIt 的資料型態

AutoIt 的資料型態要求沒有C語言那麼嚴謹

姑且不論壞處,好處就是簡單使用,讓一般用戶也可以輕易上手

常用的資料不外乎是
(這邊我省略很多內容,有興趣請參考MSDN)

Variant (變數)
  $Var、$Time 這種內容可以隨時修改的通稱變數
String (字串)
  「我是字串」這就是一個字串的型態組合
Int (實數)
   1、2、3、4 這種沒有小數點的數字就是實數
Number(浮點數)
  0.01、3.1415 這些有小數點的通為 數字

資料型態轉換[code=autoit]Dim $Str = "12"; 將資料型態宣告成為 String 格式
Dim $a = 10  ; 將資料型態宣告成為 Number 格式

Dim $b = $a + Int ($Str) ; 字串轉整數
MsgBox(0, "", $b)

Dim $s = String($a) & $Str ; 整數轉字串
MsgBox(0, "", $s)[/code]第一課學過 Array 陣列,Array 與 字串息息相關

譬如這句話「我是字串」其實就是用一維陣列高度4的陣列所組成

用程式碼來看的話[code=autoit]Dim $Str, $Output=""

$Str = "我是字串"

;;; 函式介紹
;;; StringLen ( "字串" ) 返回指定字串的字元總數。
;;; StringMid ( "字串", 開始 [, 計數] ) 取某個字串的部分字元。


For $i = 1 To StringLen ($Str) ;; 創造一個迴圈 i 範圍為 1 到 StringLen (Str) 字串長度
        ;; 程式觀念是先將右邊計算完成後丟到左邊變數中
        ;; $Output = $Output & data 就等於 ($Output & data )兩者先結合 再把數據丟到左邊的 $Output中
        $Output = $Output & "String[" & $i & "]=" & StringMid ( $Str, $i, 1) & @CRLF
Next
MsgBox ( 64, "", $Output)
[/code]

但是AutoIt 把字串陣列隱藏起來,方便用戶使用

所以宣告一個字串不需要給字串高度,就可以直接宣告

使用起來很方便,只是效能會比C略顯低落

本帖子中包含更多資源

您需要 登入 才可以下載或查看,沒有帳號?註冊

x

簽到天數: 167

該用戶今日未簽到

發表於 2013-2-15 17:02 | 顯示全部樓層
本帖最後由 gary8349 於 2013-2-15 17:08 編輯

~~~補上遺失的樓層~~~

接著教 字串處理的基本語法使用

StringInStr ( "字串", "子字串" [, 區分大小寫 [, 順序 [, 開始 [, 計數]]]] )
[code=autoit]  #cs
    1. 先用 StringInStr 找到 pos
    2. 取 Str 左邊 pos-1 個,轉整數
    3. 取 Str 右邊 pos+1 個,再丟回給 Str
   
   #ce
   ; --------------------------------
   Dim $Str, $ret=""
   Dim $Msg=""
   Dim $Array[6]
   Dim $Pos=0
   Dim $Cnt=0
   
   ; --------------------------------
   $Str = InputBox ("輸入","","1,2,3,4,5,6")
   For $i=0 to 5
           $Pos = StringInStr($Str, ",") ; 找第一個出現 , 之位置
           $Array[$i] = Int ( StringLeft ( $Str , $Pos-1) ) ;; 第一個 pos 位置-1 就是 數字的位置
           $Str = StringMid($Str, $Pos+1); 取剩下的字串
           $Cnt+=1;計數器+1
   Next
   $Array[5] = Int($Str); 最後一個陣列為 剩下的字串
   
   ; --------------------------------
   For $i=0 To $Cnt-1
           $Msg = $Msg & $Array[$i] & @CRLF
   Next
   MsgBox(64, "", $Msg)
[/code]
StringSplit ( "字串", "分隔符號" [, 旗標 ] )
[code=autoit]  Dim $Msg

   $Str = InputBox ("輸入","","1,2,3,4,5,6"); 設定 $Str = "1,2,3,4,5,6"
   $ret = StringSplit ( $Str, ',');分割$Str 字串, 分割符號為 「,」
   ;;; $ret[0] = 返回分割數量
   For $i = 1 to $ret[0]
           $Msg = $Msg & $ret[$i] &@CRLF
   Next
   MsgBox( 64, "", $Msg)
   
   ; --------------------------------
   $Msg = "" ;重設msg = 空白
   
   $Str = InputBox ("輸入","","1,2,3,4,5,6")
   $ret = StringSplit ( $Str, ',', 2) ;StringSplit ( $Str, ',', 2) = 2 則不會返回 $ret[0] 則不會返回高度
   
   For $i = 0 to UBound ($ret)-1;因為不會返回高度 所以是  0 to (UBound ($ret)-1)
           $Msg = $Msg & $ret[$i] &@CRLF
.   Next
   MsgBox( 64, "", $Msg)
[/code]
StringFormat ( "格式控制", 變數1 [, ... 變數32 ] )
[code=autoit]  ; ------------------------------------------------------
   ; 變數宣告
   Dim $Int = 10
   Dim $i1=1, $i2=2, $i3=3, $i4=4
   Dim $f = 3.1415926
   Dim $s1, $s2, $s3,$s4,$s5, $s6
   Dim $Msg;
   #cs
   ; ------------------------------------------------------
   ; %d : 整數
   $Msg = $i1 & "," & $i2 & "," & $i3
   MsgBox(64, "$Msg=", $Msg)
   
   $Msg = StringFormat("%d,%d,%d",$I1,$I2,$I3)
   MsgBox(64, "simple stringformat", $Msg)
   
   ; ------------------------------------------------------
   ; 特殊符號之表達
   ; \n , \r\n : @LF, @CRLF
   ; \\        : \
   ; \"        : "
   ; \'        : '
   ; \t        : Tab
   ; \a        ; beep (in console)
   
   $Msg = StringFormat("%d\\%d\\%d\n",$I1,$I2,$I3)
   MsgBox(64, "escape character demo", $Msg)
   #ce
   ; ------------------------------------------------------
   ; 進制
   
   $Msg = StringFormat("%%d=%d\n%%u=%u\n%%o=%o\n%%x=%x\n%%X=%X\n", _
                                            $Int,$Int,$Int,$Int,$Int)
.   MsgBox(64, "進制 1 ",$Msg)
   
   $Msg = StringFormat("%%d=%d\n%%u=%u\n%%o=0%o\n%%x=0x%x\n%%X=0X%X\n", _
                                            $Int,$Int,$Int,$Int,$Int)
   MsgBox(64, "進制 1 ",$Msg)
   
   $Msg = StringFormat("%%#d=%#d\n%%#u=%#u\n%%#o=%#o\n%%#x=%#x\n%%#X=%#X\n", _
                                            $Int,$Int,$Int,$Int,$Int)
   MsgBox(64, "進制 2 ",$Msg)
   

   #cs
   ; ------------------------------------------------------
   ; %d : 整數
   
   $s1 = StringFormat("Integer: [%d]",$Int)
   $s2 = StringFormat("Integer: [%5d]",$Int)  ; 欄位長度 5
   $s3 = StringFormat("Integer: [%-5d]",$Int) ; 左對齊
.   $s4 = StringFormat("Integer: [% 5d]",$Int) ; 保留符號欄位
   $s5 = StringFormat("Integer: [%+5d]",$Int) ; 顯示 +- 號
   $s6 = StringFormat("Integer: [%05d]",$Int) ; 填0
   $Msg = StringFormat("s1=%s\ns2=%s\ns3=%s\ns4=%s\ns5=%s\ns6=%s\n", $s1,$s2,$s3,$s4,$s5, $s6)
   MsgBox(64, "%d demo", $Msg)
   
   ; ------------------------------------------------------
   ; %s : 字串
   
   $s1 = "hello"
   $s2 = StringFormat("string s1 = [%s]\n",    $s1)
   $s3 = StringFormat("string s1 = [%10s]\n",  $s1)  ; 寬度10
   $s4 = StringFormat("string s1 = [%-10s]\n", $s1)  ; 寬度 10 靠左
   $s5 = StringFormat("string s1 = [%010s]\n", $s1)  ; 寬度 10 補 0
   $Msg = $s1 & $s2 & $s3 & $s4 & $s5
   MsgBox(64, "%s demo", $Msg)
   #ce
.   ; ------------------------------------------------------
   ;~ ; %f : 浮點數  - part 1
   $s1 = StringFormat("%%f      = [%f]\n", $f)         ; 四舍五入至第六位   
   $s2 = StringFormat("%%10f    = [%10f]\n", $f)       ; 寬度為 10
.   $s3 = StringFormat("%%.2f    = [%.2f]\n", $f)       ; 顯示小數點二位
   $s4 = StringFormat("%%10.2f  = [%10.2f]\n", $f)     ; 整體寬度10(含小數點),小數點二位
   $s5 = StringFormat("%%-10.2f = [%-10.2f]\n", $f)     ; 整體寬度10(含小數點),小數點二位, 靠左對齊
   
   $Msg = $s1 & $s2 & $s3 & $s4 & $s5
   MsgBox(64, "%f demo - 1", $Msg)
   
   ; ------------------------------------------------------
   ;~ ; %f : 浮點數  - part 2
   $s1 = StringFormat("%%f       = [%+f]\n", $f)          ; 四舍五入至第六位   
   $s2 = StringFormat("%%+10.2f  = [%+10.2f]\n", $f)      ; 整體寬度10(含小數點),小數點二位, 顯示正負號
   $s3 = StringFormat("%%-+10.2f = [%-+10.2f]\n", $f)     ; 整體寬度10(含小數點),小數點二位, 靠左對齊, error
   $s4 = StringFormat("%% -10.2f = [% -10.2f]\n", $f)     ; 整體寬度10(含小數點),小數點二位, 靠左對齊, error
   
   $Msg = $s1 & $s2 & $s3 & $s4
   MsgBox(64, "%f demo - 2", $Msg)
.   
   
   ; ------------------------------------------------------
   ;~ ; %g: 浮點數  - part 3
   $f = 3.141591415914159                       ; 再觀查 3.1
   ;$f = 3.1
   $s1= StringFormat("%%g = [%g]\n", $f)        ; 自動調整, 最長到小數後五位
   $s2= StringFormat("%%g = [%.10g]\n", $f)     ; 自動調整, 最長共 10 位
   $s3= StringFormat("%%e = [%e]\n", $f)        ; 科學符號表示法, 預設 5 位
   $s3= StringFormat("%%e = [%.15E]\n", $f)     ; 科學符號表示法, 顯示15位小數
   
   $Msg = $s1 & $s2 & $s3
.   MsgBox(64, "floating demo", $Msg)
.  再來教一下很重要的必要知識 Function 副程式[/code]

1.     什麼時候需要用到Function 呢? 一個動作需要重複做n次這時候用Function 就相當好用

Function寫完畢後整個程式的架構會很容易看懂,而且Function非常容易維護

拿SWAP 當例子

SWAP 功能很簡單就是,要把兩個資料互換就需要 SWAP

原理

定義A = 5, B = 10

兩者間資料要互換當然需要第三者一個暫存資料區

A = tmp; 先將 A數值丟給 tmp

B = A; 把B的數值丟給A

B = tmp; 再把A暫存在tmp的數值丟給B

就完成了交換的動作

至於要怎麼包成 Function呢?
  1.   ; ----------------
  2.    ; declare variable
  3.    Dim $a, $b
  4.    
  5.    ; ----------------
  6.    $x=5
  7.    $y=10
  8.    Swap1($x,$y)
  9.    MsgBox(0, "after swap 1", StringFormat("a=%d\nb=%d\n", $x, $y))
  10.    ; ----------------
  11.    $x=5
  12. .   $y=10
  13.    Swap2($x,$y)
  14.    MsgBox(0, "after swap 2", StringFormat("a=%d\nb=%d\n", $x, $y))
  15.    
  16.    ; ----------------
  17.    Func Swap1($a, $b)
  18.            Local $tmp = $a
  19.            $a = $b
  20.            $b = $tmp
  21.    EndFunc
  22.    ; ----------------
  23.    Func Swap2(ByRef $a,ByRef $b)
  24.            Local $tmp = $a
  25.            $a = $b
  26.            $b = $tmp
  27.    EndFunc
複製代碼
Swap1為什麼沒把資料交換過去呢?

因為 Swap1只有把數值丟進 Function 交換

交換後並沒有再把 數值丟出來

Swap2(ByRef $a,ByRef $b)

ByRef 就是把運算結果再返回 $a $b 這就是我們要的結果

接著再來練習一題

當輸入一個一維陣列的資料,返回陣列內全部的內容
[code=autoit]  Dim $data[10] = [1,4,2,6,3,0,8,9,7,5];定義陣列高度與初始值
   Display($data);呼叫 Function
   
   ; ------------------------------
   Func Display (Const $data);定義data 為常數不得修改
           Local $Msg = "";定義 Msg 初始值為空白
           For $i=0 to UBound ($data)-1
                   $Msg = $Msg & StringFormat ( "data[%d] = %d\n", $i, $data[$i])
           Next
           MsgBox(0, "Display data[10]", $Msg)
   EndFunc
[/code]
接著練習輸入一個陣列後返回陣列內最大的數字位置(POS)
[code=autoit]Dim $data[10] = [1,4,2,6,3,0,8,9,7,5];定義 一維陣列 高度10 並設定初始值
   
$pos = FindMaxIndex ($data); 呼叫Function

   MsgBox ( 0, "", $pos)
   
   Func FindMaxIndex ( Const $arr, Const $Start_Pos = 0);; $Start_Pos = 0 意思是 預設值 等於0
           Local $Pos = $Start_Pos; 設定初始位置預設 = 0
           ;;; i 的範圍 = 初始位置($Pos) 到 陣列最高點-1 (UBound ($arr)-1)
           For $i= ($Pos+1) To (UBound ($arr)-1)
                   If ($arr[$i] > $arr[$Pos]) Then ; 如果 目前陣列數值 > 目前陣列最大值
                           $Pos = $i ; 把目前的位置 傳送給 Pos 當成最大值位置
                   EndIf
           Next
   
           Return $Pos;; 返回最大值
   EndFunc
[/code]

接著用 上面程式的思路寫一隻 傳遞最小數值位置的Function
答案↓
FuncFindMinIndex ( Const $arr, Const $Start_Pos = 0)
        Local $Pos = $Start_Pos


        For $i=$Pos+1 To UBound ($arr)-1
                If ($arr[$i]< $arr[$Pos]) Then
                       $Pos=$i
                EndIf
        Next


        Return $Pos
EndFunc

接著詳細介紹一下 Function 返回資料
沒使用 ByRef
[code=autoit]  #include <Array.au3>
   
   Global $Array[5] ;; 全域宣告

   _ArrayDisplay ($Array, "_ArrAdd前的display");; 顯示空的 array 內容
   _ArrAdd ($Array)
   _ArrayDisplay ($Array, "_ArrAdd後的display") ;; 經過_ArrAdd後 內容還是空的 Function 並沒有返回資料

   Func _ArrAdd($Array)
           For $i=0 To UBound ($Array)-1
                   $Array[$i]+=1
           Next
           _ArrayDisplay ($Array, "Function內的display");; 顯示 _ArrAdd 後的內容
   EndFunc
[/code]

使用 ByRef
[code=autoit]  #include <Array.au3>

   Global $Array[5] ;; 全域宣告
   
   _ArrayDisplay ($Array, "_ArrAdd前的display");; 顯示空的 array 內容
   _ArrAdd ($Array)
   _ArrayDisplay ($Array, "_ArrAdd後的display") ;; 經過_ArrAdd 後的內容
   
   Func _ArrAdd(ByRef $Array);; 加上 ByRef返回陣列內的資料
           For $i=0 To UBound ($Array)-1
                   $Array[$i]+=1
           Next
           _ArrayDisplay ($Array, "Function內的display");; 顯示 _ArrAdd 後的內容
   EndFunc
[/code]
使用 Return,但並未宣告變數繼承Return回來的資料
[code=autoit]  #include <Array.au3>
   
   Global $Array[5] ;; 全域宣告

   _ArrayDisplay ($Array, "_ArrAdd前的display");; 顯示空的 array 內容
   _ArrAdd ($Array)
   _ArrayDisplay ($Array, "_ArrAdd後的display") ;; 經過_ArrAdd 後的內容,但並無法顯示 下一個例題會講解為什麼無法顯示
   
   Func _ArrAdd($Array)
           For $i=0 To UBound ($Array)-1
                   $Array[$i]+=1
           Next
           _ArrayDisplay ($Array, "Function內的display");; 顯示 _ArrAdd 後的內容
           Return $Array ;; 使用 Return 返回資料
   EndFunc
[/code]

宣告變數繼承Return回來的資料
[code=autoit]  #include <Array.au3>

   Global $Array[5] ;; 全域宣告

   _ArrayDisplay ($Array, "_ArrAdd前的display");; 顯示空的 array 內容
   $iArray = _ArrAdd ($Array) ;;; 宣告 $iArray =  _ArrAdd ($Array) 返回的資料
   _ArrayDisplay ($iArray, "_ArrAdd後的display") ;; 經過_ArrAdd 後的內容
   
   Func _ArrAdd($Array)
           For $i=0 To UBound ($Array)-1
                   $Array[$i]+=1
           Next
           _ArrayDisplay ($Array, "Function內的display");; 顯示 _ArrAdd 後的內容
           Return $Array ;; 使用 Return 返回資料
   EndFunc
[/code]

接著介紹 InsertSorting 需要把前面練習的 Display、Swap、FindMinIndexor FindMaxIndex 綜合練習題

思路是這樣的請參考ppt


  1.   Dim $data[10] = [1,4,2,6,3,0,8,9,7,5]
  2.    Display($data);; 置換前
  3.    InsertSort($data)
  4.    Display($data);; 置換後
  5.    
  6.    ; ------------------------------
  7.    Func InsertSort (ByRef $data)
  8.            Local $Pos
  9.            For $i=0 to UBound($data)-2
  10.                    $Pos=$i
  11.                    For $j=$i+1 to UBound($data)-1
  12.                            If $data[$Pos] > $data[$j] Then
  13.                                    $Pos = $j
  14.                            EndIf
  15.                    Next
  16.                    If $Pos <> $i Then
  17.                            Swap( $data[$Pos], $data[$i])
  18.                    EndIf
  19.            Next
  20.    EndFunc
  21.    
  22.    ; ------------------------------
  23.    ; swap function
  24.    Func Swap(ByRef $a,ByRef $b)
  25.            Local $Tmp = $a
  26.            $a = $b
  27.            $b = $Tmp
  28.    EndFunc
  29.    
  30.    ; ------------------------------
  31.    ; Display function
  32.    Func Display(const $data)
  33.            Local $Msg=""
  34.            For $i=0 to UBound($data)-1
  35.                    $Msg = $Msg & StringFormat("data[%d] = %d\n", $i, $data[$i])
  36.            Next
  37.            MsgBox(0, "Display data[10]", $Msg)
  38.    EndFunc
複製代碼

本帖子中包含更多資源

您需要 登入 才可以下載或查看,沒有帳號?註冊

x
回覆

使用道具 舉報

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2016-12-6 16:11

Discuz! X

© 2009-2016 Microduo

快速回覆 返回頂部 返回列表