[Học AutoIT] Bài 4: Cấu trúc điều kiện và vòng lặp


Bài học này sẽ giới thiệu một số cấu trúc điều kiện và các vòng lặp cơ bản trong AutoIT. Về cơ bản, bài học này sẽ hướng các bạn theo hướng tự tìm hiểu, tự học là chính, mình sẽ giới thiệu và đưa ra code mẫu để các bạn hiểu hơn về các sử dụng cũng như các hoạt động của các cấu trúc này.



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")

Bạn để ý tôi sử dụng cùng một dạng if, nhưng điều kiện thì khác, ở dòng if đầu thì tôi sử dụng dấu "=" để so sánh, còn ở dòng if kế tiếp tôi sử dụng "==". Ở các bài học trước tôi đã giải thích vấn đề này, ở đây tôi cố tình tạo 2 dòng code vậy để nhắc lại cho các bạn nhớ. 
Đố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

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"
Endif
If $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

Thì ở đây, sau khi xét điều kiện là True, code sẽ chạy hai mệnh lệnh là xuất bảng thông báo và đổi nội dung lưu trữ trong biến $thoitiet. Nếu dùng dạng 1 thì chúng ta cũng có thể làm nhưng rất mất thời gian. Hãy xem thử nhé
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"

Như vậy rõ ràng, nếu trong một điều kiện mà bạn cần thực hiện nhiều thao tác hay mệnh lệnh, chúng ta chọn Dạng 2.


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

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

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

Dạng này là dạng mở rộng nhất của cấu trúc điều kiện If. Ví dụ: nếu trời mưa, tôi ở tắm mưa; trời nắng, tôi đi bơi; trời mát, tôi đi dạo; còn ko thuộc các trường hợp trên, tôi ở nhà.

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

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

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

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)

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")

Ở 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
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
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>

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 += $i
          $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

Xin chào, mình là opdo - một đứa mê những dòng code vô tận. Rất cám ơn vì bạn đã ghé thăm blog của mình ^^. Hi vọng được bạn ủng hộ để blog mình phát triển hơn

Share this

Related Posts

Previous
Next Post »