2018年5月17日 星期四

AutoIt 學習筆記 : 陣列

陣列是多個變數 (元素) 之集合, 而以單一變數名稱及索引來識別各變數 (元素), 由於搭配迴圈來存取變數值非常方便, 因此具有同一性質之變數常用陣列方式處理. 由於陣列為一組變數的集合, 因此其命名規則與變數相同, 亦即須以 $ 開頭, 只能使用英數字與底線, 不分大小寫. 陣列元素以中括號內的索引存取.

AutoIt 之陣列索引可以從 0 起算, 也可以從 1 起算 (例如索引 0 可用來存元素個數), 但對習慣 C, Java, PHP 等 0 起始語言者可能會不習慣, 因此仍以 0 起算為宜. 元素個數 (陣列長度) 可用 AutoIt 內建的 Ubound() 函數取得. 另外, AutoIt 的使用者定義函式庫 Array.au3 提供的 _ArrayDisplay() 函數則常用來以 GUI 方式顯示陣列內容.


本系列之前的筆記參考 :

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


一. 陣列之宣告與賦值 : 

1. 先宣告再逐一賦值 :

Local $a[3]   ;中括號內的整數表示元素個數
$a[0]=1         ;中括號內的整數表示元素之索引
$a[1]=2         ;中括號內的整數表示元素之索引
$a[2]=3         ;最大索引=元素個數-1


2. 宣告同時賦值 :

Local $a[3]=[1,2,3]      ;等號左邊為宣告 (中括號內是元素個數), 右邊為元素值
Local $Score[5]            ;宣告5個元素的1維陣列
Local $Score[$Count]  ;陣列元素個數可以用已賦值之變數 ($Count必須之前就已賦值)

注意, 陣列宣告後若不賦值, 則每個元素內容預設均為空字元 NULL, 即 Chr(0)


3. 多維陣列之宣告與賦值 :

多維陣列即元素也是一個陣列, AutoIt 最多可用到 64 維陣列.

Local $Array[10][20]             ;宣告 10 列 20 行之二維陣列 : 索引 (0, 0) ~ (9, 19)
$rows=UBound($Array, 1)     ;傳回陣列之列數=10 (參數預設=1)
$cols=UBound($Array, 2)      ;傳回陣列之行數=20
$dims=UBound($Array, 0)     ;傳回陣列之維數=2

二維陣列之宣告與賦值 :

Local $NameScore[2][2]=[["John", 91], ["Peter", 91]]   ;宣告同時賦值
Local $NameScore[2][2]                          ;先宣告
$NameScore[0]=["John", 91]                   ;賦值
$NameScore[1]=["Peter", 91]                  ;賦值


二. 拜訪陣列元素 :

顯示陣列之全部元素有兩個方法, 對於一維陣列只用一層迴圈即可 :

Local $Score[5]=[99,78,100,87,65]
Local $Str=""
For $i=0 To Ubound($Score)-1
   $Str &= $Score[$i] & " "                         ;以空格隔開
Next
MsgBox(0,"陣列全部元素",$Str)

自訂函式庫 Array.au3 提供 _ArrayDisplay($Array) 函式可以 GUI 形式顯示陣列內容 :

#include <Array.au3>
Local $Score[5]=[99,78,100,87,65]                                             ;宣告並賦值
_ArrayDisplay($Score, "陣列全部元素")                                   ;以GUI顯示陣列內容




對於多維陣列, 必須用多層迴圈來依序擷取元素, 例如 :

   Local $NameScore[2][2]=[["John", 91], ["Peter", 91]]               ;宣告二維陣列並賦值
   Local $Str=""                                                                                ;初始值
   For $i=0 To Ubound($NameScore,1)-1                                        ;外圈=拜訪列
      For $j=0 To Ubound($NameScore,2)-1                                     ;內圈=拜訪行
          $Str &= $NameScore[$i][$j] & " "                                        ;串接元素
          If $j==Ubound($NameScore,2)-1 Then $Str &= @CRLF    ;行結束就串跳行符號
      Next
   Next
   MsgBox(0,"",$Str)


三. 異質資料型態之陣列

通常陣列是一種元素資料類型均相同的資料結構, 但在AutoIt 並不禁止異質資料, 亦即元素可以是數值, 字串, 布林值等, 甚至可以是另一個陣列, 但這種用法是不宜的, 尤其元素是另一個陣列會嚴重拖慢執行速度.

   #include <Array.au3>                                  ;匯入自訂函式庫
   $AnotherArray=StringToASCIIArray("ABC")    ;將字串轉成ASCII碼陣列
   Local $Array[4]                                                    ;宣告四個元素之陣列
   $Array[0]=1                                                          ;元素0=數值
   $Array[1]=true                                                      ;元素1=布林值
   $Array[2]="字串"                                                 ;元素2=字串
   $Array[3]=$AnotherArray                                    ;元素3=另一個陣列
   _ArrayDisplay($Array, "陣列內容");                   ;元素3無法顯示
   _ArrayDisplay($Array[3], "子陣列內容");          ;元素3內容


執行後先顯示主陣列 :




可見元素 [3] 乃一子陣列, 游標移到標題按右鍵關閉視窗會執行第二個 _ArrayDisplay() 顯示子陣列 :




四. 稀疏陣列

多維陣列缺少部份元素即為稀疏陣列, AutoIt 允許稀疏陣列, 例如 :

   #include <Array.au3>
   Local $NameScore[3][3]=[["Peter",100],["John",67,82],["Mary"]]
   _ArrayDisplay($NameScore);




可見 Peter 與 Mary 有不完整之元素.


五. 陣列互相賦值

兩個陣列可以互相賦值, 例如 $ArrayA=$ArrayB 中, 左邊的 A 陣列內容會與 B 陣列完全相同,  即使兩者原先維度與資料類型不同.

  #include <Array.au3>
  Local $ArrayA[2]=[123,456]
  Local $ArrayB[3][3]= [["Peter",100,55],["John",67,82],["Mary",87,99]]
  $ArrayA=$ArrayB                                                 ;$ArrayA 會變成 $ArrayB 之備份
  _ArrayDisplay($ArrayA);


六. 使用者定義函式庫 Array.au3 中的常用函數 :

~~待續~~

沒有留言 :