Có phải Do While...Loop chỉ là 1 dạng viết tắt của For.. Next?

  • Thread starter Thread starter LinDan
  • Ngày gửi Ngày gửi
Liên hệ QC

LinDan

Thành viên tiêu biểu
Tham gia
8/2/12
Bài viết
412
Được thích
111
Tôi chưa thạo lập trình lắm, phần vòng lặp sau khi đọc tôi có cảm giác Do While...Loop và For.. Next hình như bản chất chỉ là 1 (tức là Do While...Loop nó chỉ viết tắt cho gọn) phải không các bác.

Liệu có ví dụ nào thì dùng Do While...Loop nó sẽ ưu việt hơn hẳn dùng For.. Next không?
 
Về bản chất, 2 vòng lặp For...Next và Do While...Loop (hay Do...Loop While, Do...Loop Until) là hoàn toàn khác nhau

Câu này sai. Công dụng khác nhau thì có, nhưng bản chất thì giống nhau: Dùng cấu trúc lặp để không phải viết 1 số dòng code nhiều lần.

Thí dụ:
PHP:
Sub TinhGiaithua_Khonglap()
Dim Kqua As Long
   Kqua = 1
   Kqua = Kqua * 2
   Kqua = Kqua * 3
   Kqua = Kqua * 4
   Kqua = Kqua * 5
   Msgbox Kqua
End Sub
Để tránh viết câu lệnh 5 lần, 10 lần, 100 lần, ta dùng vòng lặp, và ta sẽ chọn Do hay For - Next tuỳ theo.


- Các vòng lặp Do... là các vòng lặp có số lần lặp chưa biết trước, nó chỉ dừng khi gặp một điều kiện phù hợp nào đó, quy định sau từ khóa While hoặc Until:
+ Vòng lặp Do While...Loop hoặc Do...Loop While sẽ chạy khi điều kiện sau While còn đúng, chỉ khác nhau là kiểm tra điều kiện rồi mới chạy lệnh hay ngược lại.
+ Vòng lặp Do...Loop Until sẽ chạy cho đến khi điều kiện sau Until đúng.
Câu màu xanh có thể bị hiểu sai. Phải viết rõ ra rằng:

Vòng lặp Do...Loop Until sẽ chạy cho đến khi điều kiện sau Until đúng thì dừng.
 
Upvote 0
Ví dụ vòng lặp sẽ treo máy:
Dim i as Long
i=1
Do Until i=100

i= i + 2
' ....

Loop


Tôi hiểu từ "treo" của bạn là: bình thường thì code thực hiện một số "thao tác" nào đó rồi hiển thị, trả về kết quả ... nhưng trong th này thì cái hiển thị, trả về kết quả không bao giờ có. Có thể từ "treo" bạn dùng với nghĩa như thế, vậy tôi không "đeo bám" về câu từ. Nhưng ta thử sửa code thành:
Dim i as Long
i=1
Do Until i=100
i= i + 1
' ....
Loop
Vậy thì mọi người sẽ "vỗ tay" là đk đúng? Ừ thì với code đó vòng lặp sẽ kết thúc nhưng về mặt lập trình thì là thói quen không thể chấp nhận được. Như trong cuộc sống ấy, nếu bạn cẩn thận, có thói quen tốt thì ít khi mắc lỗi hơn.
Ta giả sử là trong code trên bạn tính toán gì đó, bạn sử dụng thuật toán gì đó. Code chạy "ngon". Nhưng sau một thời gian bạn nghĩ ra một thuật toán còn "tởm" hơn. Bạn sửa lại code, nhưng với thuật toán mới bạn phải có i = i + 2. Bạn quên sửa lại đk. Nếu code ngắn thì cái đk kia nó "đập" vào mắt và bạn "giật mình" và sửa lại đk. Hoặc có "đậ" nhing nhiều người không "nhìn" thấy và quên bẵng đi. Còn nếu code dài và cái đk kia nó không "đập" vào mắt thì có khi bạn quên luôn. Thế là vòng lặp chạy không bao giờ ngừng.
Về lập trình nếu bạn muốn vòng lặp chỉ thực hiện cho những giá trị vd. < a thì không bao gờ được viết đk là Do Until i = a
Lúc đó luôn phải đổi thành Do Until i >= a. Không bao giờ trong Do (...) ... Loop được có đk ĐÚNG bằng một gá trị nào đó. Hoặc i >= a hoặc i <= a.
Về Byte, Integer, Long mà mọi người bàn thì tôi nghĩ như sau:
Không phải mọi lúc mọi nơi cứ BYTE, INTEGER là đổi thành Long hết. Như thế "người ta" cung cấp kiểu BYTE và Integer để làm gì?. Có một điều tôi nghĩ là System 32 bít (4 bai) thì thực hiện các thao tác trong các khối 4 bai bao giờ cũng nhanh nhất. Tôi ví như (có thể không sát lắm) một người bán hàng có máy đong gạo mỗi lần đong là 10 kg, nó thao tác với lượng 10 kg là thuần thục. Nếu ai mua 10, 20, 30, ... kg thì nó đong vù một cái là xong. Mua 5 kg cũng được nhưng nó phải làm thêm thao tác chia đôi lượng vừa cân. Như thế lâu hơn.
Đổi BYTE thành Long cũng được nhưng tùy th. Nếu bạn dùng một mảng rất lớn và giá trị các ô < 256 thì rất có thể không nên khai báo kiểu Long vì như thế nó chiếm bộ nhớ quá lớn.
 
Upvote 0
Em nghĩ mọi vòng lặp đều có bản chất giống nhau, đều lặp đi lặp lại số hành động cần làm
có khác chăng ở đây là cách thức lập
thử so sánh vòng lập mà ĐK không biết trước số vòng lặp thì có vòng do While, Do ... Loop While, do... Loop Until
do While, Do ... Loop While đều là số vòng lặp không biết trước số lần lặp

Nhưng với do While thì kiểm tra giá trị trước khi lặp có nghĩa là có thể không chạy vào vòng lặp nếu đk không thoả
còn với Do ... Loop While thì làm trước kiểm tra điều kiện sau nên ít nhất sẽ lặp được 1 lần nếu đk đầu tiên bị sai

còn với Do ... Loop Until tương tự như Do ... Loop While nhưng sẽ kết thúc khi điều kiện đúng

Còn vòng lặp For chẳng qua là trường hợp đặt biệt của vòng lặp While
với số lần lặp được biết trướctự động tăng hay giản biến điều kiện ngay trong vòng lặp(Nên hạn chế được việc treo máy vì đk)

Bài của Phi, trừ các lỗi chính tả tô đỏ, vẫn còn những ý sai (màu xanh).

vụ treo máy vì đk, tôi đã phân tích ở trên.

Câu sai thứ 2: Còn vòng lặp For chẳng qua là trường hợp đặt biệt của vòng lặp While

- For Next và Do loop không có cái nào là trường hợp đặc biệt của cái nào. Nó cùng bản chất là cấu trúc dùng để lặp, nhưng chả có cái nào là cha của cái nào.
- Chỉ có vòng lặp Do Loop hoặc nói tắt là vòng lặp Do, chứ không có vòng lặp While

Không hiểu khi đứng lớp giảng bài cho học sinh của mình, và khi soạn giáo án Phi có mắc những lỗi chính tả và lỗi từ ngữ này không?

Câu sai thứ 3: tự động tăng hay giản biến điều kiện ngay trong vòng lặp

Vòng lặp For Next đúng là có tự động tăng (hoặc giảm) biến chạy (hoặc biến đếm), chứ không tăng giảm biến điều kiện. Điều kiện để thoát vòng lặp (cả 2 loại) là 1 điều kiện khác, có thể dùng 1 biến khác chứ không nhất thiết dùng biến đếm (hoặc gọi là biến chạy)
 
Lần chỉnh sửa cuối:
Upvote 0
]
Về Byte, Integer, Long mà mọi người bàn thì tôi nghĩ như sau:
Không phải mọi lúc mọi nơi cứ BYTE, INTEGER là đổi thành Long hết. Như thế "người ta" cung cấp kiểu BYTE và Integer để làm gì?. Có một điều tôi nghĩ là System 32 bít (4 bai) thì thực hiện các thao tác trong các khối 4 bai bao giờ cũng nhanh nhất. Tôi ví như (có thể không sát lắm) một người bán hàng có máy đong gạo mỗi lần đong là 10 kg, nó thao tác với lượng 10 kg là thuần thục. Nếu ai mua 10, 20, 30, ... kg thì nó đong vù một cái là xong. Mua 5 kg cũng được nhưng nó phải làm thêm thao tác chia đôi lượng vừa cân. Như thế lâu hơn.
Đổi BYTE thành Long cũng được nhưng tùy th. Nếu bạn dùng một mảng rất lớn và giá trị các ô < 256 thì rất có thể không nên khai báo kiểu Long vì như thế nó chiếm bộ nhớ quá lớn.
Thật ra những điều tôi nói về Byte, Integer, Long... không phải do tôi nghĩ ra cho vui mà đó là phát biểu từ Microsoft:
http://msdn.microsoft.com/en-us/library/aa164754(v=office.10).aspx
Và chuyện này cũng đã bàn nhiều trên diễn đàn rồi... cho nên cũng không đến lượt tôi hay bạn hay ai đó không tin vào điều này đâu
Còn chuyện ai vì thói quen thích xài cái này (thay vì phải là cái khác) thì cứ tùy ý vậy!
Đã biết rằng Long nhanh hơn Integer thì cứ thế mà xài, đâu cần phải thắc mắc "người ta" cung cấp kiểu BYTE và Integer để làm gì? Nói cho cùng thì câu hỏi này phải đi hỏi MS mới đúng
 
Upvote 0
Không hiểu khi đứng lớp giảng bài cho học sinh của mình, và khi soạn giáo án Phi có mắc những lỗi chính tả và lỗi từ ngữ này không?

ui, thế này thì oan cho thầy quá, nặng lời thật, vì chắc là thầy ít thời gian nên gõ loạn lên thế, chứ lên lớp phong cách phải khác ah,

hơn nữa

Câu sai thứ 2: Còn vòng lặp For chẳng qua là trường hợp đặt biệt của vòng lặp While

- For Next và Do loop không có cái nào là trường hợp đặc biệt của cái nào. Nó cùng bản chất là cấu trúc dùng để lặp, nhưng chả có cái nào là cha của cái nào.

Đúng là không phải loại nào nào là trường hợp đặc biệt của loại vòng lặp kia, mà chắc thầy Phi... NHƯNG có một số bài toán chúng ta có thể chọn dùng cả 2 hay 3 loại đó (khi biết chính xác số lần lặp / ngay việc thoát vòng FOR bằng ExitFOR vẫn giới hạn cần biết số vòng lặp tối đa). Khi đó thì ưu thế vòng FOR thể hiện hơn ở 2 điểm:
- Không phải quản lý điều kiện,
- Nếu cần đếm hoặc đánh dấu số vòng lặp: thì Không phải cần quan tâm tăng biến điều khiển vì lẽ đó nên thầy Phi chăc muốn nói TỰ ĐỘNG TĂNG BIẾN NÀY đây (không phải biến đk)

- Chỉ có vòng lặp Do Loop hoặc nói tắt là vòng lặp Do, chứ không có vòng lặp While

Có vòng lặp While trong VBA đó là While... WEnd, và từ trước này trong tin học lập trình người ta vẫn thường gọi tắt vòng lặp với số lần không xác định - điều kiện trước là While --> từ này là đúng

vài lời chia sẻ
 
Upvote 0
Tôi hiểu từ "treo" của bạn là: bình thường thì code thực hiện một số "thao tác" nào đó rồi hiển thị, trả về kết quả ... nhưng trong th này thì cái hiển thị, trả về kết quả không bao giờ có. Có thể từ "treo" bạn dùng với nghĩa như thế, vậy tôi không "đeo bám" về câu từ. Nhưng ta thử sửa code thành:
Dim i as Long
i=1
Do Until i=100
i= i + 1
' ....
Loop
Vậy thì mọi người sẽ "vỗ tay" là đk đúng? Ừ thì với code đó vòng lặp sẽ kết thúc nhưng về mặt lập trình thì là thói quen không thể chấp nhận được. Như trong cuộc sống ấy, nếu bạn cẩn thận, có thói quen tốt thì ít khi mắc lỗi hơn.
Ta giả sử là trong code trên bạn tính toán gì đó, bạn sử dụng thuật toán gì đó. Code chạy "ngon". Nhưng sau một thời gian bạn nghĩ ra một thuật toán còn "tởm" hơn. Bạn sửa lại code, nhưng với thuật toán mới bạn phải có i = i + 2. Bạn quên sửa lại đk. Nếu code ngắn thì cái đk kia nó "đập" vào mắt và bạn "giật mình" và sửa lại đk. Hoặc có "đậ" nhing nhiều người không "nhìn" thấy và quên bẵng đi. Còn nếu code dài và cái đk kia nó không "đập" vào mắt thì có khi bạn quên luôn. Thế là vòng lặp chạy không bao giờ ngừng.
Về lập trình nếu bạn muốn vòng lặp chỉ thực hiện cho những giá trị vd. < a thì không bao gờ được viết đk là Do Until i = a
Lúc đó luôn phải đổi thành Do Until i >= a. Không bao giờ trong Do (...) ... Loop được có đk ĐÚNG bằng một gá trị nào đó. Hoặc i >= a hoặc i <= a.
....

Mình chỉ ví dụ cho vodoi2x thôi, chớ ai lại đi đặt điều kiện kiểu vậy, mà sao bị chỉ trích nhiều quá, chán!. Nhưng có lẽ mình dùng khái niệm treo máy chưa chính xác (máy để dùng chớ ngu gì treo lên cho bụi bám). Khái niệm này thực ra chắc cũng chưa ai định nghĩa, vì vậy việc code chạy không bao giờ thỏa điều kiện cũng có thể gọi là treo máy (ít nhất là đối với tớ), hi hi
 
Lần chỉnh sửa cuối:
Upvote 0
ui, thế này thì oan cho thầy quá, nặng lời thật, vì chắc là thầy ít thời gian nên gõ loạn lên thế, chứ lên lớp phong cách phải khác ah,

Câu này tôi không nói riêng ai, và tôi cũng đang thực hành:
Tay tôi có vài ngón bị yếu và hơi run, bàn phím thì mờ chữ, nên khi gõ thì sai m thành n, i thành u, khoảng trắng đặt lung tung, có khi thiếu hẳn 1 ký tự. Vấn đề là trước khi nhấn nút gởi bài, tôi đọc đi đọc lại ít nhất là 2 hoặc 3 lần, sửa cho bằng hết lỗi tự mình trông thấy. Cũng có thể còn sót, nhưng ít nhất, đó là tôn trọng người đọc, là tự trọng bản thân, và là tập thói quen tốt, bỏ đi tính cẩu thả. Cẩu thả ở chỗ nào? Ở chỗ viết vội 1 bài quăng lên đó, ai đọc thì đọc, sai mà đọc rồi hiểu sai, làm sai ráng chịu, hoặc đọc thấy chữ gõ sai không hiểu cũng ráng chịu luôn. (Tôi thường có lỗi gõ "không' thành "kôhg", "tin" thành "tun", đọc trời hiểu). Bản thân không đọc lại bài của mình viết cũng là 1 dạng cẩu thả.
Khi bị nhiễm tính cẩu thả thì có "phong cách" gì cũng sẽ mất hết.

Có vòng lặp While trong VBA đó là While... WEnd, và từ trước này trong tin học lập trình người ta vẫn thường gọi tắt vòng lặp với số lần không xác định - điều kiện trước là While --> từ này là đúng
vài lời chia sẻ

Đúng là có vòng lặp While Wend, nhưng phải nói cho đầy đủ. Do Loop nói tắt là Do còn gợi được cái gì đó, chứ "vòng lặp While", ... Ngoài ra:
- Phi không liệt kê trước đó, nên chắc chắn là Phi không có ý nói đến While Wend
- Từ bài 1 đến giờ, theo chủ đề topic, chưa ai nói tới While Wend. nếu muốn nói đến như 1 dạng vòng lặp khác, thì phải nói cho rõ ràng, giới thiệu hẳn hoi (như bạn có giới thiệu).
 
Upvote 0
Thật ra những điều tôi nói về Byte, Integer, Long... không phải do tôi nghĩ ra cho vui mà đó là phát biểu từ Microsoft:
http://msdn.microsoft.com/en-us/library/aa164754(v=office.10).aspx
Và chuyện này cũng đã bàn nhiều trên diễn đàn rồi... cho nên cũng không đến lượt tôi hay bạn hay ai đó không tin vào điều này đâu
Còn chuyện ai vì thói quen thích xài cái này (thay vì phải là cái khác) thì cứ tùy ý vậy!
Đã biết rằng Long nhanh hơn Integer thì cứ thế mà xài, đâu cần phải thắc mắc "người ta" cung cấp kiểu BYTE và Integer để làm gì? Nói cho cùng thì câu hỏi này phải đi hỏi MS mới đúng

Tôi không cho là không nên đổi thành Long. Nhưng không phải mọi lúc mọi nơi. Tôi lập trình trong Dephi và thường viết bằng API. Nếu tôi gọi hàm API và chỗ này, chỗ này phải truyền array BYTE thì tôi không thể khai báo array Integer (integer trong Delphi là 4 bai) được. Đây không phải chuyện thích hay không.
Cái ""người ta" cung cấp kiểu BYTE và Integer để làm gì" là tôi nói đến một khía cạnh, nhưng đâu phải lý do duy nhất. Tôi còn đưa vd. khác nữa. vd. tôi phải thao tác trên một array BYTE (không cần lớn hơn) rất lớn thì không lý gì tôi lại phải khai báo array Long lớn gấp 4 lần và load nó vào RAM, phung phí tài nguyên.
Mà nếu RAM còn ít quá thì system cứ phải liên tục chuyển những phần tạm chưa dùng lên đĩa rồi khi dùng đến đọc từ đĩa (swap file) thì những "thao tác" thêm ấy sẽ làm giảm tốc độ đáng kể (đọc ghi trong RAM bao giờ cũng nhanh hơn đọc ghi trên đĩa cứng). Long nhanh hơn BYTE thì đúng nhưng đến một lúc nào đó thì việc thay BYTE bằng Long sẽ làm chậm hơn do phát sinh thêm một số vấn đề. Việc dùng gì cũng phải cân nhắc chứ đâu cứ một kiểu được.
 
Lần chỉnh sửa cuối:
Upvote 0
Cho fép được lang man dài dòng chút:

Lâu nay, vài chục ngày trong năm mình cũng được gọi là thầy; Đó là chuyện được hưởng theo xái bà Sếp nhà mình!

Bỡi vậy, từ đó mình cũng tin rằng người thấy/cô đúng danh nghĩa của học sinh hay học viên nào đó cũng là thầy/cô của mình.

Theo cách xưa, mình luôn tôn trọng giai tầng này trong xã hội, dù họ có thế nào chăng nữa!

Trong cộng đồng chúng ta cũng vậy; Cũng có lúc làm mình điên tiết họ do sự xuống cấp không ngờ theo cách suy nghĩ cố cựu của mình;

Tuy nhiên, cách góp í cho họ mình sẽ fải dùng cách khác hơn.

. . . . . . . .
 
Upvote 0
Không ngờ một chủ đề nhỏ so sánh Do..Loop và For..Next lại có nhiều người có uy tín trên GPE vào giải thích. Vấn đề tưởng như rõ ràng vậy mà đang đi lan man. Người hỏi thì không thấy trả lời đã hiểu hay chưa?
 
Upvote 0
Phân biệt rõ nhất giữa 2 anh này là đưa ra bài toán cụ thể. Sau đó áp dụng cả 2 kiểu vòng lặp và so sánh ưu nhược điểm của chúng.
 
Upvote 0
Vậy thầy? thầy cho ví dụ cụ thể đi ạ,
Chứ các thành viên nói kiểu này rối như canh hẹ lun, Túm lại FOR làm gì khi nào dùng, Do While, Loop khi nào dùng, vì nếu bản chất giống nhau thì cứ dùng đại phải không?
Thầy nói treo máy vì đk là sao, nghĩa là cứ có đk là treo máy ah?
Dạ vô tình hôm nay có người theo dõi và thấy topic này, thật sự là tui không nhớ về các bài này viết khi nào. tui có thể giải thích đơn giản như vậy @vodoi2x. Vòng lặp For theo như kiến thức tôi biết và tôi luôn chắc chắn nó là vòng lặp đặt biệt. của Do While - Loop
2 vòng lặp này điều kiểm tra điều kiện trước khi thực hiện lệnh, nhưng For thì số vòng lặp sẽ biết trước còn Do While thì không? ví dụ cụ thể tìm số chữ số trong 1 dãy số cho trước, For sẽ không biết bao nhiêu chữ số còn do while thì cứ chia cho 10 cho tới khi nào gặp số 0.
còn tại sao tui nó nó là trường hợp đặt biệt, vì tất cả các bài toán mà for làm được thì Do While sẽ làm được, còn ngược lại thì chưa chắc.
còn Do Loop While cũng là vòng lặp mà không biết trước số lần lặp, nhưng Do Loop While sẽ làm trước và kiểm tra sau, chính vì vậy nó luôn luôn làm ít nhất 1 lệnh trước khi kết thúc. Chỉ có vậy thôi
 
Upvote 0
Dạ vô tình hôm nay có người theo dõi và thấy topic này, thật sự là tui không nhớ về các bài này viết khi nào. tui có thể giải thích đơn giản như vậy @vodoi2x. Vòng lặp For theo như kiến thức tôi biết và tôi luôn chắc chắn nó là vòng lặp đặt biệt. của Do While - Loop
2 vòng lặp này điều kiểm tra điều kiện trước khi thực hiện lệnh, nhưng For thì số vòng lặp sẽ biết trước còn Do While thì không? ví dụ cụ thể tìm số chữ số trong 1 dãy số cho trước, For sẽ không biết bao nhiêu chữ số còn do while thì cứ chia cho 10 cho tới khi nào gặp số 0.
còn tại sao tui nó nó là trường hợp đặt biệt, vì tất cả các bài toán mà for làm được thì Do While sẽ làm được, còn ngược lại thì chưa chắc.
còn Do Loop While cũng là vòng lặp mà không biết trước số lần lặp, nhưng Do Loop While sẽ làm trước và kiểm tra sau, chính vì vậy nó luôn luôn làm ít nhất 1 lệnh trước khi kết thúc. Chỉ có vậy thôi
Tôi xin phép chỉnh bài của bạn, tôi tin chắc là điều này sẽ cố lợi cho dân trong nghề giáo như bạn nếu bạn chịu khó đọc cho kỹ, list đây là tóm lượt, chi tiết sẽ cho biết sau:
1. For-Next không phải là dạng tắt của Do While-Loop
2. While-Wend là dạng cũ của vòng lặp While. Có nhiều bất tiện mafd MS cải tiến về sau bằng Do While

Giải thích:

1. For-Next là căn bản ngôn ngữ lập trình. Được IBM hoàn thiện theo tiêu chuẩn FORTRAN IV (lưu ý phiên bản IV, các phiên bản trước chưa là tiêu chuẩn).
Do-Loop cũng là căn bản của lập trình. Chính thức là để gói một đoạn code cần chạy lặp lại nhiều lần.
Vì là code vòng lại cho nên điểm quan trọng nhất của chúng là phải có cách để dứt, không lặp nữa.
Vòng lặp Do dùng cách dứt tự do, tức là đặt điều kiện gì đó để dứt (ở mệnh đề While hoặc Until).
Vòng lặp For cải tiến tốc độ bằng cách xác định điều kiện với một biến điều khiển, vòng lặp sẽ dứt khi biến điều khiển này vượt quá giới hạn mà For đặt trước. (giới hạn tức là trị của biểu thức nằm ngay bên phải từ khóa TO)

1.2. Các điểm khác biệt:
While test điều kiện, điều kiện này có thể là "biến điều khiển vượt giới hạn" (như For), hay bất cứ biểu thức nào có thể chio về kết quả True/False
- Biến điều khiển của For có thể được thay đổi bên trong vòng lặp, nhưng giới hạn chỉ tính 1 lần, thay đổi trong vòng lặp không ảnh hưởng đến giới hạn vòng lặp
GH = 5
i = 1
Do While i <= GH
...
GH = 10
i = i+1
Loop ' vòng lặp sẽ chạy 10 lần

GH = 5
For i = 1 To GH
...
GH = 10
Next i ' vòng lăp chỉ chạy 5 lần, khi i = 6 (lớn hơn trị ban đầu của GH) thì nó dứt.

Điều này là điều hết sức quan trọng mà nhiều người không biết, vì chưa hề trải qua cái vụ "biểu thức giới hạn thay đổi".

Vì vậy, ta có thể kết luận rằng "trong trường hợp thông thường, hai loại vòng lặp này có thể thay thế lẫn nhau. For nhanh hơn Do nhưng nếu điều kiện thoát vòng lặp phức tạp thì Do-Loop uyển chuyển hơn For-Next"

2. While-Wend là dạng cũ. Không nên dùng nữa vì nó không hỗ trợ việc thoát vòng lặp giữa chừng qua lệnh Exit (trừ Exit Function, Exit Sub)

2.1. Do...Loop Until/While (biểu thức) bảo đảm vòng lặp chạy ít nhất 1 lần, Do While (biểu thức)...Loop thì không bảo đảm.

2.2. For Each là dạng đặc biết của For dùng để duyệt qua các phần tử của một object có thực hiện (implement) giao diện "tuần tự" (iteratable). Code này rất hiệu quả, tốt hơn duyệt bằng chỉ số.
 
Upvote 0
Tôi xin phép chỉnh bài của bạn, tôi tin chắc là điều này sẽ cố lợi cho dân trong nghề giáo như bạn nếu bạn chịu khó đọc cho kỹ, list đây là tóm lượt, chi tiết sẽ cho biết sau:
1. For-Next không phải là dạng tắt của Do While-Loop
Từ đầu đến giờ (bài 8), bạn này đã phát biểu
1697000866473.png

Và giữ nguyên quan điểm mặc dù những bài phía sau phân tích cái sai (cụ thể là bài 23)

1697000993301.png

Sau 9 năm vẫn giữ quan điểm như vậy thì tôi e là anh viết bài có thể vẫn có ích cho nhiều người khác, nhưng tốn công với bạn này,
 
Upvote 0
1697007369059.png

Điều kiện của bạn không đúng. I = 1, sau đó tăng mỗi vòng lắm là I = I + 2 ==>

I =
1
3
5
Toàn số lẻ, nên Until I = 100 không bao giờ xảy ra.
Code của bài ấy không đúng là do thiếu kinh nghiệm viết biểu thức điều kiện.
Người có kinh nghiệm chỉ khi nào điệu kiện bắt buộc phải là chính xác bằng thì mới dùng dấu "=", nếu chỉ xét giới hạn thì luôn luôn dùng "<=" hoặc ">=". Vòng lăp For-Next sử dụng cách so sánh này.

...
Sau 9 năm vẫn giữ quan điểm như vậy thì tôi e là anh viết bài có thể vẫn có ích cho nhiều người khác, nhưng tốn công với bạn này,
Nếu bạn ấy không hiểu thì cũng khó mà cải tiến.
Tuy nhiên, bài #33 tôi viết là để nhắc nhở chung cho các bạn học vội mà không chịu thử lại kiến thức "học vội" ấy.
Vòng lặp, cũng như đệ quy, luôn phải có một cái gì đó để kết thúc - không lặp lại nữa.
- Vòng lặp For là loại vòng lặp dùng một biến (counter) để điều khiển, khi counter vượt giới hạn thì kết thúc. Vì vậy, counter có thể thay đổi nhưng giới hạn thì không.
- Vòng lặp Do While/Until là loại vòng lặp dùng lô gic của biểu thức để quyết định sự kết thúc, biểu thức có thể là biến (counter) nhưng cũng có thể là con toán nào đó có thể ép kiểu thành Boolean. Until chỉ là đối nghịch của While. Điều cần lưu ý là vòng lặp Do While/Until hoàn toàn không bắt buộc phải có biến điều khiển (counter).
Vì vậy, tuy bề ngoài trông vó vẻ giống một vài chỗ, nhưng bên trong, hai cấu trúc này hoạt động khác nhau.
- For Each là loại đặc biệt của For, counter được hiểu ngầm là một biến enum chạy từ chỉ số đầu tiên đến chỉ số cuối cùng. Tùy theo thiết kế của cái collection ấy mà nó là 0->count-1 hay 1->count. (Vì biến này hiểu ngẩm cho nên bên trong block code, không có cách nào truy cập nó)
 
Upvote 0
(Trợ giúp trả lời bài viết đã cũ)
Vòng lặp For và Do While/Until hoặc Loop While/Until không có gì liên quan đến nhau. Vì:
  • Vòng lặp For trả về giá trị bộ đếm qua từng vòng lặp, cho đến khi vượt qua giá trị cuối đã đặt. Các câu lệnh trong vòng lặp dựa vào giá trị bộ đếm đó để tính toán.
  • Vòng lặp Do/Loop While/Until chỉ là vòng lặp xét điều kiện đủ để lặp và thoát vòng lặp.


-----------------------------------------------------------
Lý thuyết căn bản về vòng lặp trong VBA:
  1. For...To...Step...Next: Là vòng lặp xử lý bộ đếm (Thêm bớt giá trị), bước và lệnh thoát Exit For. Xác định điều kiện thoát khi đã đếm xong giá trị đã thiết lặp.
  2. For Each...In.....Next: Là vòng lặp truy cập bộ nhớ tuần tự Array, ArrayList, Collection, có lệnh thoát Exit For. Xác định điều kiện thoát khi đã truy cập xong vùng nhớ cuối cùng (Phần tử cuối cùng).
  3. Do.......................Loop: Là vòng lặp vô tận, thoát với lệnh Exit Do.
  4. Do While..........Loop: Là vòng lặp xác định trước điều kiện thoát, lặp trong khi điều kiện đúng, có lệnh thoát Exit Do.
  5. Do Until............Loop: Là vòng lặp xác định trước điều kiện thoát, cho đến khi điều kiện đúng sẽ thoát, có lệnh thoát Exit Do.
  6. Do .........Loop While: Là vòng lặp xác định điều kiện thoát sau, lặp trong khi điều kiện đúng, có lệnh thoát Exit Do.
  7. Do ...........Loop Until: Là vòng lặp xác định điều kiện thoát sau, cho đến khi điều kiện đúng sẽ thoát, có lệnh thoát Exit Do.
  8. While................Wend: Là vòng lặp xác định điều kiện thoát, lặp trong khi điều kiện đúng, không có lệnh thoát.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom