I. CẤU TRÚC ĐIỀU KIỆN IF
Các cấu trúc điều kiện if sẽ thực thi lệnh dựa vào điều kiện ban đầu của bạn, việc này cũng giống như những câu nói hằng ngày của bạn: Nếu trời mưa thì tôi sẽ không đi bơi, thì trời mưa là điều kiện, còn không đi bơi là mệnh lệnh khi thỏa điều kiện đó.
Dạng 1: cấu trúc IF...THEN dạng đơn giản AutoIT
If <điều kiện> Then <mệnh lệnh>
Với cấu trúc đơn giản này, bạn có thể chuyển hóa câu nói bên trên thành dạng code như sau:
$thoitiet = "mưa"
If $thoitiet = "Mưa" Then Msgbox(64,"Thông báo","Trời mưa rồi, không đi bơi đâu")
If $thoitiet == "mưa" Then Msgbox(64,"Thông báo","Trời mưa rồi, không đi bơi đâu")
If $thoitiet = "Mưa" Then Msgbox(64,"Thông báo","Trời mưa rồi, không đi bơi đâu")
If $thoitiet == "mưa" Then Msgbox(64,"Thông báo","Trời mưa rồi, không đi bơi đâu")
Đối với dạng so sánh "=" thì nó chỉ so sánh từ giống nhau mà không quan tâm tới chữ hoa chữ thường, cho nên dùng $thoitiet = "Mưa" hay $thoitiet = "mưa" nó đều trả về True, mà True là đúng nên nó sẽ chạy Msgbox.
Còn đối với so sánh "==" thì ngược lại, nó so sánh cả chữ in hoa và in thường nên bạn chỉ có thể đặt là $thoitiet == "mưa" thì giá trị trả về là True, còn $thoitiet == "Mưa" thì giá trị sẽ là False.
Dạng 2: cấu trúc IF...THEN...ENDIF
If <điều kiện> Then
<chuỗi mệnh lệnh>
Endif
<chuỗi mệnh lệnh>
Endif
Cũng như dạng 1, nhưng ở dạng này bạn sẽ sử dụng được nhiều dòng code trong một điều kiện (hay nói cách khác là một chuỗi các mệnh lệnh)
Ví dụ:
$thoitiet = "mưa"
If $thoitiet = "mưa" Then
Msgbox(64,"Thông báo","Trời mưa rồi, không đi bơi đâu")
$thoitiet = "nắng"
EndifIf $thoitiet = "nắng" Then
Msgbox(64,"Thông báo","Trời nắng rồi, đi bơi thôi")
$thoitiet = "mưa"
Endif
If $thoitiet = "mưa" Then
Msgbox(64,"Thông báo","Trời mưa rồi, không đi bơi đâu")
$thoitiet = "nắng"
EndifIf $thoitiet = "nắng" Then
Msgbox(64,"Thông báo","Trời nắng rồi, đi bơi thôi")
$thoitiet = "mưa"
Endif
If $thoitiet = "mưa" Then Msgbox(64,"Thông báo","Trời mưa rồi, không đi bơi đâu")If $thoitiet = "mưa" Then $thoitiet = "nắng"
Dạng 3: cấu trúc IF...THEN... ELSE ...ENDIF
If <điều kiện> Then
<chuỗi mệnh lệnh>
Else
<chuỗi mệnh lệnh>
Endif
<chuỗi mệnh lệnh>
Else
<chuỗi mệnh lệnh>
Endif
Nói nôm na dạng này khác hai dạng trên ở chỗ là chúng ta có trường hợp ngược lại. Tôi ví dụ: nếu trời mưa chúng ta ở nhà, ngược lại chúng ta đi bơi
If $thoitiet = "mưa" Then
Msgbox(64,"Thông báo","Trời mưa rồi, ở nhà")
Else ; ngược lại
Msgbox(64,"Thông báo","Trời không mưa, đi bơi thôi")
Endif
Msgbox(64,"Thông báo","Trời mưa rồi, ở nhà")
Else ; ngược lại
Msgbox(64,"Thông báo","Trời không mưa, đi bơi thôi")
Endif
Dạng 4: cấu trúc IF...THEN... ELSEIF ... ELSE ...ENDIF
If <điều kiện 1> Then
<chuỗi mệnh lệnh>
ElseIf <điều kiện 2> Then
<chuỗi mệnh lệnh>
Else
<chuỗi mệnh lệnh>
Endif
<chuỗi mệnh lệnh>
ElseIf <điều kiện 2> Then
<chuỗi mệnh lệnh>
Else
<chuỗi mệnh lệnh>
Endif
If $thoitiet = "mưa" Then
Msgbox(64,"Thông báo","Trời mưa rồi, tôi tắm mưa")
ElseIf $thoitiet = "nắng" Then
Msgbox(64,"Thông báo","Trời nắng, tôi đi bơi")
ElseIf $thoitiet = "mát" Then
Msgbox(64,"Thông báo","Trời mát, tôi đi dạo")
Else
Msgbox(64,"Thông báo","Tôi nằm lì ở nhà")
Endif
Msgbox(64,"Thông báo","Trời mưa rồi, tôi tắm mưa")
ElseIf $thoitiet = "nắng" Then
Msgbox(64,"Thông báo","Trời nắng, tôi đi bơi")
ElseIf $thoitiet = "mát" Then
Msgbox(64,"Thông báo","Trời mát, tôi đi dạo")
Else
Msgbox(64,"Thông báo","Tôi nằm lì ở nhà")
Endif
II. Các vòng lặp cơ bản
1) Vòng lặp For ... Next
Vòng lặp for, hay còn gọi là vòng chạy, có nhiệm vụ là thực hiện các chuỗi mệnh lệnh lặp đi lặp lại theo điều kiện, cụ thể là lặp lại n lần từ vị trí a tới vị trí b
Dạng 1: For ... Next
For $<biến> = <số bắt đầu> to <số kết thúc>
<chuỗi lệnh>
Next
<chuỗi lệnh>
Next
Ví dụ
For $i = 1 to 10
Msgbox(64,"Thông báo","Giá trị $i = "&$i)
Next
Msgbox(64,"Thông báo","Giá trị $i sau khi thoát khỏi hàm For = "&$i)
Như vậy, vòng lặp sẽ thực hiện chuỗi lệnh và tăng $i cho đến khi vượt qua giá trị tối đa (ở trường hợp này là 10) và kết thúc. Vậy, sau hàm For, $i sẽ có giá trị là 11.
Dạng 2: For ... Step ... Next
For $<biến> = <số bắt đầu> to <số kết thúc> Step <bước nhảy>
<chuỗi lệnh>
Next
<chuỗi lệnh>
Next
Dạng này có thêm Step là bước nhảy, nghĩa là sau một vòng lặp for, nó sẽ cộng biến cho bước nhảy. Ví dụ sau một vòng lặp tính tổng các số lẻ từ 1 tới 10
$tong = 0
For $i = 1 to 10 Step 2
$tong += $i
Next
Msgbox(64,"Thông báo","Tổng các số lẻ từ 1 tới 10: "&$tong)
For $i = 1 to 10 Step 2
$tong += $i
Next
Msgbox(64,"Thông báo","Tổng các số lẻ từ 1 tới 10: "&$tong)
Dạng này còn có thể cho hàm For tiến lùi. Thay vì chạy từ 1 tới 10, tôi có thể cho hàm for chạy từ 10 tới 1, dùng step là -1
For $i = 10 to 1 Step -1
Msgbox(64,"Thông báo","Giá trị $i = "&$i)
Next
Msgbox(64,"Thông báo","Giá trị $i sau khi thoát khỏi hàm For = "&$i)
Như vậy, nếu giải thích rõ cách mà hàm For hoạt động, thì có thể nói nôm na là: sau mỗi vòng lặp, nó sẽ cộng biến cho giá trị Step của bạn, sau đó nó sẽ kiểm tra biến đó có vượt khỏi đoạn [a,b] hay không. Nếu vượt khỏi đoạn đó thì nó thoát vòng lặp. Đó là vì sao khi kết thúc vòng lặp, bạn sẽ nhận được giá trị là 0 ở code bên trên.
2) Vòng lặp While
Đây cũng là một vòng lặp khá phổ biến trong AutoIT. Vòng lặp này sẽ thực hiện đi thực hiện lại một chuỗi mệnh lệnh, nó chỉ thoát vòng lặp khi nào điều kiện của nó trả về là False. Nói nôm na, vòng lặp này sẽ thực hiện mãi một chuỗi mệnh lệnh khi mà điều kiện của nó thỏa
While <điều kiện>
<chuỗi lệnh>
WEnd
Tôi ví dụ:
$flag = True
While $flag
If Random(1,10,1) > 5 then
$flag = False
Else
Msgbox(64,"Thông báo","Chưa thoát vòng lặp")
EndIf
WEnd
Msgbox(64,"Thông báo","Thoát vòng lặp")
While $flag
If Random(1,10,1) > 5 then
$flag = False
Else
Msgbox(64,"Thông báo","Chưa thoát vòng lặp")
EndIf
WEnd
Msgbox(64,"Thông báo","Thoát vòng lặp")
Ở ví dụ trên, ta sẽ thấy, tôi dùng hàm Random là hàm sinh số ngẫu nhiên từ 1 tới 10 (còn số 1 cuối cùng để nó sinh ra số nguyên), nếu random đó lớn hơn 5 thì $flag của tôi sẽ thành False, và do thành False nên vòng lặp sẽ tự thoát.
Trong một số trường hợp, người ta có thể làm thế này để tạo thành một vòng lặp vô hạn (chạy ko có điều kiện dừng)
While 1
Msgbox(64,"Thông báo","Vô hạn")
WEnd
WEnd
Việc sử dụng While 1, số 1 sẽ được hiểu như một số nguyên dương, và số nguyên dương thì lúc nào cũng trả về giá trị True, và do vậy, vòng lặp sẽ thực hiện mãi không ngừng.
Để vòng lặp ngừng, chúng ta ngoài việc đợi điều kiện thỏa, chúng ta còn có thể sử dụng ExitLoop (thoát vòng lặp)
While 1
Msgbox(64,"Thông báo","Vô hạn")
If Random(1,10,1) > 5 then ExitLoop
WEnd
If Random(1,10,1) > 5 then ExitLoop
WEnd
Msgbox(64,"Thông báo","Thoát vòng lặp")
3) Vòng lặp Do... Until
Do...Until thực chất cũng như While, nhưng khác ở chỗ, điều kiện thỏa là điều kiện mà While hoạt động, còn điều kiện thỏa là điều kiện dừng của Do...Until.
Nói nôm na nó giống với hai câu nói thế này:
- Khi nào trời còn mưa, tôi còn ở nhà
- Tôi ở nhà, đến khi nào trời hết mưa
Chúng ta thấy rõ: trời mưa là điều kiện, và câu trên tương tự hàm While, nghĩa là thỏa điều kiện trời mưa thì tôi ở nhà. Còn câu dưới trời mưa cũng là điều kiện, nhưng là điều kiện dừng tương tự như hàm Do...Until
Do
<chuỗi mệnh lệnh>
Until <điều kiện dừng>
Until <điều kiện dừng>
Tôi ví dụ, với bài toán tính các số lẻ trong đoạn từ 1 tới 10
$i = 1
$tong = 0
Do
$tong = 0
Do
$tong += $i
$i += 2
Until $i > 10
Msgbox(64,"Thông báo","Tổng = "&$tong)
$i += 2
Until $i > 10
Msgbox(64,"Thông báo","Tổng = "&$tong)
III) Thực hành
Vòng lặp và cấu trúc điều kiện đối với các bạn mới học là khá khó hiểu và khó làm. Vì vậy các bạn cần cố gắn thực hành, đọc lại, tìm thêm tài liệu để tăng vốn hiểu biết bản thân.
Và sau đây là 1 số bài tập thực hành thử cho các bạn:
- Bài 1: có hai biến $a và $b mang giá trị số nguyên, trong đó biến $a < $b, tính tổng toàn bộ các số lẻ trong đoạn $a, $b đó (lần lượt giải bằng các hàm For, While và Do)
- Bài 2: có hai biến $a và $b mang giá trị số nguyên, không biết ai nhỏ hơn ai, có thêm 1 biến $c, yêu cầu tính tổng trong đoạn $a và $b có bao nhiêu số chia hết cho $c
Đáp án mẫu tham khảo:
- Cơ bản:http://pastebin.com/WBz4mKHp
- Nâng cao: http://pastebin.com/CcgLSi7c