1 Cấu Trúc Lặp trong autoit Mon Aug 22, 2011 4:53 pm
Trunks-Kun
Administrator
1. While... WEnd...
- Cấu trúc While... WEnd... này hoạt động dựa trên việc kiểm tra biến $var, nên ta cần tạo biến này trước khi cấu trúc được thực thi. Và mình sẽ bỏ qua việc kiểm tra xem Người Dùng có bấm Cancel hay không để cho nó đơn giản, như thế việc bấm Cancel tương đương với việc nhập Chuỗi hoặc 0.
- Cấu trúc lặp sẽ xoay vòng cho đến khi nào biến $var khác 0, tức là khi $var=0 nó sẽ thực thi các câu lệnh bên trong nó mãi, việc kiểm tra này tương tự như việc kiểm tra của If, khi $var có giá trị là chuỗi vẫn tương đương với $var=0. Còn cấu trúc Switch mình đã giới thiệu ở bài trước rùi nên bỏ qua nhé
2. Do... Until...
- AutoIT có khả năng tự tạo các biến khi chúng được sử dụng lần đầu tiên. Vậy nếu ta cho câu lệnh $var = InputBox("Nhập Số",... trong vòng lặp While thực thi trước rồi mới kiểm tra nó sau thì việc khai báo bằng biến $var ở ngoài vòng lặp có thể được rút gọn và Do... Until... có thể làm được việc đó.
- Các bạn mới làm quen với lập trình cần chú ý cách mà 2 cấu trúc này kiểm tra điều kiện, đối với While thì $var bằng 0 còn với Do thì $var phải khác 0. Nếu bạn vẫn chưa hiểu, hãy đọc 2 câu mô tả dưới đây vài lần sẽ thấy được sự khác biệt của chúng, lúc đó các bạn sẽ hiểu sự khác nhau giữa 2 cấu trúc lặp này:
While... WEnd...: Khi biến $var còn bằng 0 thì thực hiện các câu lệnh trong vòng lặp.
Do... Until...: Thực hiện các câu lệnh trong vòng lặp cho đến khi biến $var khác 0.
3. Mở Rộng While... WEnd... và Do... Until...
- Các vòng lặp được sử dụng rất nhiều trong thực tế, một trong số đó là việc kiểm tra mật khẩu. Điều mình muốn nói ở đây là không phải vòng lặp nào cũng chạy mãi nếu Người Dùng cứ nhập sai, ví dụ như trong trường hợp của mật khẩu. Đôi khi Người Dùng chỉ được phép nhập 1 số lần nhất định nào đó rồi thôi, lúc ấy vòng lặp sẽ ngưng và tự thoát ra dù điều kiện vẫn chưa thõa.
- While... WEnd... và Do... Until... hoàn toàn có thể đáp ứng được vấn đề mà mình đặt ra ở trên bằng cách dùng cấu trúc If để kiểm tra 1 biến đếm rồi ép cho vòng lặp thoát.
- Nếu hiểu theo một nghĩa khác thì việc kiểm tra biến đếm bằng cấu trúc If thật chất là một điều kiện thoát thứ 2 của vòng lặp, như thế với sự kết hợp các cấu trúc Rẽ Nhánh (không riêng gì If) ta sẽ có nhiều đều kiện thể thoát vòng lặp. Ví dụ của tụi mình sẽ được thay đổi 1 chút để phù hợp với mô tả này.
- Trong ví dụ này điều kiện thoát của Do... Until... chỉ là False, như thế vòng lặp sẽ hoạt động mãi và điều kiện để thoát là những Case được trang bị từ khóa Exit của Cấu Trúc Switch. Tiếp tục nói về 2 ví dụ mở rộng này, không biết các bạn có nhận ra sự khác biệt trong cách thoát của chúng không, nếu chưa thì bạn hay khoan đọc tiếp và quay lại so sánh xem.
- Nếu không thể phát hiện ra cũng không sao "cần cù sẽ bù thông mình" mà :rb99: Điểm khác biệt mà mình muốn đề cập đến chính là với Do muốn thoát người dùng nhập đúng số liệu mà nó muốn và chỉ đúng lúc đó mà thôi, không thì nó lặp mãi. Còn ví dụ của While cũng thoát, nhưng có thêm điều kiện là biến đếm bằng 7, tức là việc thoát được lập trình viên qui định trước. Và nếu đã biết trước khi nào thoát vòng lặp thì tụi mình nên cùng một cậu trúc khác tốt hơn.
4. For... To... Step...
- Có thể lúc mới nhìn thì Cấu Trúc này nó rườm rà hơn ở While và Do, nhưng thực tế nó giúp tụi mình đơn giản hóa công việc vì không phải tăng biến đếm, không cần đặt điều kiện kiểm tra và cũng không cần khai báo biến gì cả.
- Và khả năng hoạt động của cấu trúc For này không chỉ có vậy, ngoài việc cho biến đếm tăng dần bằng từ khóa Step, tụi mình còn có thể cho nó giảm dần đến khi gặp một giới hạn được định trước nó sẽ thoát vòng lặp. Ví dụ mở rộng ở dưới đây chỉ là để nói thêm về nó, còn vận dụng thế nào là tùy vào tài năng của mọi người thui.
nguồn autoit.72ls.ne
- Cấu trúc While... WEnd... này hoạt động dựa trên việc kiểm tra biến $var, nên ta cần tạo biến này trước khi cấu trúc được thực thi. Và mình sẽ bỏ qua việc kiểm tra xem Người Dùng có bấm Cancel hay không để cho nó đơn giản, như thế việc bấm Cancel tương đương với việc nhập Chuỗi hoặc 0.
- Code:
$var=0 ;Khởi tạo biến $var để vòng lặp được thực thi
While $var=0 ;Kiểm tra giá trị của $var
$var=InputBox("Nhập Số","Hãy nhập một số gì đó, trừ số 0 và Chuỗi",7," M7")
If $var=0 Then MsgBox(0,"Khoanh Vùng","Bạn đã nhập Chuỗi hoặc số 0")
;~ Exit ;Bỏ Từ khóa này để chương trình không thoát
WEnd
Switch $var ;Kiểm tra biến $var
Case -9999999 To -1
MsgBox(0,"Khoanh Vùng","Bạn đã nhập số Âm")
Case 1 To 9
MsgBox(0,"Khoanh Vùng","Số có 1 chữ số")
Case 10 To 99
MsgBox(0,"Khoanh Vùng","Số có 2 chữ số")
Case 100 To 999
MsgBox(0,"Khoanh Vùng","Số có 3 chữ số")
Case 1000 To 9999
MsgBox(0,"Khoanh Vùng","Số có 4 chữ số")
Case 10000 To 99999
MsgBox(0,"Khoanh Vùng","Số có 5 chữ số")
Case 100000 To 999999
MsgBox(0,"Khoanh Vùng","Số có 6 chữ số")
Case 1000000 To 9999999
MsgBox(0,"Khoanh Vùng","Số có 7 chữ số")
EndSwitch
- Cấu trúc lặp sẽ xoay vòng cho đến khi nào biến $var khác 0, tức là khi $var=0 nó sẽ thực thi các câu lệnh bên trong nó mãi, việc kiểm tra này tương tự như việc kiểm tra của If, khi $var có giá trị là chuỗi vẫn tương đương với $var=0. Còn cấu trúc Switch mình đã giới thiệu ở bài trước rùi nên bỏ qua nhé
2. Do... Until...
- AutoIT có khả năng tự tạo các biến khi chúng được sử dụng lần đầu tiên. Vậy nếu ta cho câu lệnh $var = InputBox("Nhập Số",... trong vòng lặp While thực thi trước rồi mới kiểm tra nó sau thì việc khai báo bằng biến $var ở ngoài vòng lặp có thể được rút gọn và Do... Until... có thể làm được việc đó.
- Code:
Do
$var=InputBox("Nhập Số","Hãy nhập một số gì đó, trừ số 0 và Chuỗi",7," M7")
If $var=0 Then MsgBox(0,"Khoanh Vùng","Bạn đã nhập Chuỗi hoặc số 0")
Until $var<>0 ;Thay đổi Phương Thức kiểm tra
Switch $var ;Kiểm tra biến $var
Case -9999999 To -1
MsgBox(0,"Khoanh Vùng","Bạn đã nhập số Âm")
Case 1 To 9
MsgBox(0,"Khoanh Vùng","Số có 1 chữ số")
Case 10 To 99
MsgBox(0,"Khoanh Vùng","Số có 2 chữ số")
Case 100 To 999
MsgBox(0,"Khoanh Vùng","Số có 3 chữ số")
Case 1000 To 9999
MsgBox(0,"Khoanh Vùng","Số có 4 chữ số")
Case 10000 To 99999
MsgBox(0,"Khoanh Vùng","Số có 5 chữ số")
Case 100000 To 999999
MsgBox(0,"Khoanh Vùng","Số có 6 chữ số")
Case 1000000 To 9999999
MsgBox(0,"Khoanh Vùng","Số có 7 chữ số")
EndSwitch
- Các bạn mới làm quen với lập trình cần chú ý cách mà 2 cấu trúc này kiểm tra điều kiện, đối với While thì $var bằng 0 còn với Do thì $var phải khác 0. Nếu bạn vẫn chưa hiểu, hãy đọc 2 câu mô tả dưới đây vài lần sẽ thấy được sự khác biệt của chúng, lúc đó các bạn sẽ hiểu sự khác nhau giữa 2 cấu trúc lặp này:
While... WEnd...: Khi biến $var còn bằng 0 thì thực hiện các câu lệnh trong vòng lặp.
Do... Until...: Thực hiện các câu lệnh trong vòng lặp cho đến khi biến $var khác 0.
3. Mở Rộng While... WEnd... và Do... Until...
- Các vòng lặp được sử dụng rất nhiều trong thực tế, một trong số đó là việc kiểm tra mật khẩu. Điều mình muốn nói ở đây là không phải vòng lặp nào cũng chạy mãi nếu Người Dùng cứ nhập sai, ví dụ như trong trường hợp của mật khẩu. Đôi khi Người Dùng chỉ được phép nhập 1 số lần nhất định nào đó rồi thôi, lúc ấy vòng lặp sẽ ngưng và tự thoát ra dù điều kiện vẫn chưa thõa.
- While... WEnd... và Do... Until... hoàn toàn có thể đáp ứng được vấn đề mà mình đặt ra ở trên bằng cách dùng cấu trúc If để kiểm tra 1 biến đếm rồi ép cho vòng lặp thoát.
- Code:
$var=0 ;Khởi tạo biến $var để vòng lặp được thực thi
$count=0 ;Khởi tạo biến đếm
While $var=0 ;Kiểm tra giá trị của $var
$count+=1 ;Tăng biến đếm lên 1 đơn vị
$var=InputBox($count,"Hãy nhập một số gì đó, trừ số 0 và Chuỗi",7," M7")
If $var=0 Then MsgBox(0,"Khoanh Vùng","Bạn đã nhập Chuỗi hoặc số 0")
If $count=7 Then Exit ;Khi $count=7 thoát chương trình luôn
WEnd
;...
- Nếu hiểu theo một nghĩa khác thì việc kiểm tra biến đếm bằng cấu trúc If thật chất là một điều kiện thoát thứ 2 của vòng lặp, như thế với sự kết hợp các cấu trúc Rẽ Nhánh (không riêng gì If) ta sẽ có nhiều đều kiện thể thoát vòng lặp. Ví dụ của tụi mình sẽ được thay đổi 1 chút để phù hợp với mô tả này.
- Code:
Do
$var=InputBox("Nhập","Hãy nhập một số gì đó, trừ số 0 và Chuỗi",7," M7")
If $var=0 Then MsgBox(0,"Khoanh Vùng","Bạn đã nhập Chuỗi hoặc số 0")
Switch $var ;Kiểm tra biến $var
Case -9999999 To -1
MsgBox(0,"Khoanh Vùng","Bạn đã nhập số Âm")
;Exit
Case 1 To 9
MsgBox(0,"Khoanh Vùng","Số có 1 chữ số")
;Exit
Case 10 To 99
MsgBox(0,"Khoanh Vùng","Số có 2 chữ số")
;Exit
Case 100 To 999
MsgBox(0,"Khoanh Vùng","Số có 3 chữ số")
;Exit
Case 1000 To 9999
MsgBox(0,"Khoanh Vùng","Số có 4 chữ số")
;Exit
Case 10000 To 99999
MsgBox(0,"Khoanh Vùng","Số có 5 chữ số")
;Exit
Case 100000 To 999999
MsgBox(0,"Khoanh Vùng","Số có 6 chữ số")
;Exit
Case 1000000 To 9999999
MsgBox(0,"Khoanh Vùng","Số có 7 chữ số")
Exit
EndSwitch
Until False ;Với False cấu trúc sẽ lặp mãi
- Trong ví dụ này điều kiện thoát của Do... Until... chỉ là False, như thế vòng lặp sẽ hoạt động mãi và điều kiện để thoát là những Case được trang bị từ khóa Exit của Cấu Trúc Switch. Tiếp tục nói về 2 ví dụ mở rộng này, không biết các bạn có nhận ra sự khác biệt trong cách thoát của chúng không, nếu chưa thì bạn hay khoan đọc tiếp và quay lại so sánh xem.
- Nếu không thể phát hiện ra cũng không sao "cần cù sẽ bù thông mình" mà :rb99: Điểm khác biệt mà mình muốn đề cập đến chính là với Do muốn thoát người dùng nhập đúng số liệu mà nó muốn và chỉ đúng lúc đó mà thôi, không thì nó lặp mãi. Còn ví dụ của While cũng thoát, nhưng có thêm điều kiện là biến đếm bằng 7, tức là việc thoát được lập trình viên qui định trước. Và nếu đã biết trước khi nào thoát vòng lặp thì tụi mình nên cùng một cậu trúc khác tốt hơn.
4. For... To... Step...
- Code:
;~ $var=0 ;Không cần Khởi tạo biến $var
;~ $count=0 ;Không cần tạo biến đếm trước
For $count=1 To 7 Step 1
;~ $count+=1 ;Biến đếm sẽ tự tăng không cần cộng
$var=InputBox($count,"Hãy nhập một số gì đó, trừ số 0 và Chuỗi",7," M7")
If $var=0 Then
MsgBox(0,"Khoanh Vùng","Bạn đã nhập Chuỗi hoặc số 0")
Else
ExitLoop ;Từ khóa thoát vòng lặp
EndIf
;~ If $count=7 Then Exit ;Không cần kiểm tra biến đếm
Next
;...
- Có thể lúc mới nhìn thì Cấu Trúc này nó rườm rà hơn ở While và Do, nhưng thực tế nó giúp tụi mình đơn giản hóa công việc vì không phải tăng biến đếm, không cần đặt điều kiện kiểm tra và cũng không cần khai báo biến gì cả.
- Và khả năng hoạt động của cấu trúc For này không chỉ có vậy, ngoài việc cho biến đếm tăng dần bằng từ khóa Step, tụi mình còn có thể cho nó giảm dần đến khi gặp một giới hạn được định trước nó sẽ thoát vòng lặp. Ví dụ mở rộng ở dưới đây chỉ là để nói thêm về nó, còn vận dụng thế nào là tùy vào tài năng của mọi người thui.
- Code:
$end=9 ;Giá trị giới hạn
$step=2 ;Số đơn vị sẽ tăng
;~ Tăng dần
For $start=1 To $end Step $step
MsgBox(0,"Step: "&$step,"Start: "&$start&" to: "&$end)
Next
;~ Giảm dần
For $start=43 To $end Step $step-9
MsgBox(0,"Step: "&$step-9,"Start: "&$start&" to: "&$end)
Next
nguồn autoit.72ls.ne