Dec 22 Wed 2010 03:42 [A] AutoIt!! 一維陣列 分享: 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) 引用(0) 人氣(200) http://edisonx.pixnet.net/blog/post/38606099 回 · 發現好東西 autoit 這一篇文章封面 |
本站公告:〔您越需要我們,我們就越有創意〕 | 本站說明書:〔發現故鄉還有改進的地方,請來信告訴原丁們〕 |
觀察應用學習點數 :〔咱的故鄉有您的參與,會使我們有更大的發揮空間,展現更豐富精彩的學習畫面〕 | 〔期待藉由無障礙網頁設計,能讓視障小朋友更愛看書、更愛寫作且更愛學習〕:盲用電腦「心得分享」 |