本帖最後由 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呢? - ; ----------------
- ; declare variable
- Dim $a, $b
-
- ; ----------------
- $x=5
- $y=10
- Swap1($x,$y)
- MsgBox(0, "after swap 1", StringFormat("a=%d\nb=%d\n", $x, $y))
- ; ----------------
- $x=5
- . $y=10
- Swap2($x,$y)
- MsgBox(0, "after swap 2", StringFormat("a=%d\nb=%d\n", $x, $y))
-
- ; ----------------
- Func Swap1($a, $b)
- Local $tmp = $a
- $a = $b
- $b = $tmp
- EndFunc
- ; ----------------
- Func Swap2(ByRef $a,ByRef $b)
- Local $tmp = $a
- $a = $b
- $b = $tmp
- 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
- Dim $data[10] = [1,4,2,6,3,0,8,9,7,5]
- Display($data);; 置換前
- InsertSort($data)
- Display($data);; 置換後
-
- ; ------------------------------
- Func InsertSort (ByRef $data)
- Local $Pos
- For $i=0 to UBound($data)-2
- $Pos=$i
- For $j=$i+1 to UBound($data)-1
- If $data[$Pos] > $data[$j] Then
- $Pos = $j
- EndIf
- Next
- If $Pos <> $i Then
- Swap( $data[$Pos], $data[$i])
- EndIf
- Next
- EndFunc
-
- ; ------------------------------
- ; swap function
- Func Swap(ByRef $a,ByRef $b)
- Local $Tmp = $a
- $a = $b
- $b = $Tmp
- EndFunc
-
- ; ------------------------------
- ; Display function
- Func Display(const $data)
- Local $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
複製代碼 |