1. 陣列之宣告

陣列和一般變數不同,一般變數可以不經由宣告就可以使用,但陣列一定要先行宣告,宣告可用 Global、Local、Dim,如下所示

Dim $A[4]  ; 宣告 $A  是 大小為 4 的一維陣列
Dim $B[3] = ["Test","Good","EdisonX"]
; 宣告 $B 是大小為 3 的一維陣列,並把 "Test","Good","EdisonX" 設給 $B

2. 使用陣列

假設一陣列已這麼宣告

Dim $Arr[3]

宣告時我沒給它初值,日後要設值給它的時候可以這麼做

$Arr[0] = "Test"
$Arr[1] = "Good"
$Arr[2] = "EdisonX"

注意到,雖然大小是 3,不過實際上可以調用的卻只有 0~2 ( 3-1,也就是陣列元素個數再扣去1)。但一般而言,陣列通常都是存數字(包含整數、小數)比較多,舉個例子,假設我生成的陣列要變成這樣: $Arr[0] = 0, $Arr[1] = 1, $Arr[2] = 4, $Arr[3]=9, ... $Arr[n] = n^2,如果有陣列元素有 100 個的話,到時候慢慢寫也很麻煩,這時候便調用回圈去寫

$n = 100
Dim $Arr[$n]
For $i=0 To $n-1
        $Arr[$i] = $i^2
Next

這裡要注意,很多人習慣其中的回圈是從 1 或其它數字開始,但其實這不是很好的習慣,無論如何,請練習回圈的起始值一律執 0 開始。其中的 $n - 1 事實上可以代換成 UBound($Arr) - 1,因為 UBound($Arr) 這函數就是去取得 $Arr 這陣列的大小。這裡要注意的是,如果宣告了大小為 n 的陣列,千萬不能存取陣列到 n 以上的位置,因為這樣會造成錯誤。

3. 重新設定大小

上一點有提到,如果宣告了大小為 n 的陣列,千萬不能存取陣列到 n 以上的位置。如果陣列需求變小就算了,反正後面不要用就好了;如果陣列需求變大的話,這就是個問題了。 AutoIt 提供了非常便捷的方式

Dim $Arr[5]
ReDim $Arr[10]

這樣  $Arr 就擴成 10 個元素大小的陣列。特別注意的事情是,陣列大小如果由小變大,那麼之前的元素值並不會不見。但如果大小變化如果是  10 -> 5 -> 10,由於第一次變 5 的時候,後面 5 個元素就被洗掉了,這時再調回 10 時,後面的那 5 個元素仍不可被回復。

4. 使用範例

在說明範例之前,先說明二個函數:SRandom、 Random ,SRandom 原型如下:

SRandom ( 亂數種子(Seed) )

在此要說明為什麼要有這個函數。事實上,電腦裡面的亂數可以把它視為一組公式(是一組,不是一個),這個公式要有初值帶進去,不然每次產生的亂數都會一樣;講白一點,如果不調用 SRandom 的話,每次產生的亂數都會一樣,然而亂數種子如果也是一個定值的話,其實每次產生的亂數值也都一樣,因為它是一組公式。至於要怎麼讓每次產生的亂數值都不一樣,這個我們日後再探討。這個 SRandom 函數也只要調用一次就可以了,也就是說,不用每次呼叫 Random 的時候都要先叫 SRandom 出來。至於Random 它的函式原型如下:

Random ( [最小值 [, 最大值 [, 旗標]]] )

這部份的詳細介紹日後再說明,目前我們知道的是,裡面的三個引數都是選填的。現在假設我們要產生 100 個亂數(亂數範圍為 1 到 100),並且把這些亂數存下來,我們可以這麼做:


SRandom(12)
$Arr[100]
For $i = 0 To 99
        $Arr[$i] = Random(1,100)
Next

這樣就存下了 100 組亂數。這個例子好像沒什麼,那再實際一點的例子:假設要從樂透裡面的 42 個號碼(應該是 42 個號碼吧?) 隨便抽 5 個號碼要怎麼隨機產生?那些暴力的方法我就不說了,這裡說的是撲克演算法。這個演算法跟玩 poker 洗牌的原理一樣,首先我要先產生 42 張牌,先 "隨機" 挑一張,再 "隨機" 挑第二張,接著把這二張交換。至於要換幾次呢?這不一定,有人說換牌數的一半是最好的,也有人習慣換牌的張數;總之,洗完牌之後,再取出前面 5 張牌,就是所要的東西了。這種演算法細節部份每個人都不一樣,有興趣可以去查查,筆者這裡提供其中一種

Dim $pos1, $pos2
Dim $poker[42]
Dim $temp

; 產生42張 poker
For $i=0 To 41
        $poker[$i] = $i+1
Next

; 開始洗牌
SRandom(0)
For $i=0 To 41 ; 洗 42 次
        $pos1 = Random(0, 41) ; 從 42 張牌取出第一張
        $pos2 = Random(0, 41) ; 從 42 張牌取出第二張
        ; 交換這二張牌
        $temp = $poker[$pos1]
        $poker[$pos1] = $poker[$pos2]
        $poker[$pos2] = $temp
Next

; 取出前 5 張牌出來
Dim $Ans
For $i=0 To 4
        $Ans &= $poker[$i] & " "
Next
MsgBox(0, "五張不重覆", $Ans)

edisonx 發表在 痞客邦 PIXNET 留言(0) 人氣()