Dòng code có chuyện lạ hay mình chưa hiểu? - Xin giải thích giúp (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mã:
Sub test()
Dim i As Long, j As Long
    For i = 1 To 29
        j = j + 1
    Next
    MsgBox i
    MsgBox j
End Sub
Mình nghĩ i chỉ có thể nhận giá trị 29 thực tế lại nhận 30. Cho hỏi vậy là sao ạ?????
 

File đính kèm

Mã:
Sub test()
Dim i As Long, j As Long
    For i = 1 To 29
        j = j + 1
    Next
    MsgBox i
    MsgBox j
End Sub
Mình nghĩ i chỉ có thể nhận giá trị 29 thực tế lại nhận 30. Cho hỏi vậy là sao ạ?????

Thì tại vòng lập For.. nó vậy đấy
Khi i chạy đến 30, nó phát hiện 1 > 29 thì nó mới ngừng
Vậy thôi
(vụ này lúc mới học code tôi cũng từng thắc mắc)
 
Upvote 0
Mã:
Sub test()
Dim i As Long, j As Long
    For i = 1 To 29
        j = j + 1
    Next
    MsgBox i
    MsgBox j
End Sub
Mình nghĩ i chỉ có thể nhận giá trị 29 thực tế lại nhận 30. Cho hỏi vậy là sao ạ?????
Như vậy là bạn chưa nắm được cơ chế hoạt động của vòng lặp For. Giả sử ta có vòng lặp:
Mã:
For i = Đầu To Cuối
     Lệnh
Next
Vòng lặp trên sẽ được thực hiện như sau:
Bước 1: i nhận giá trị Đầu
Bước 2: Kiểm tra điều kiện i <= Cuối (*)
- Nếu (*) Đúng thì sang bước 3
- Nếu (*) Sai thì thoát khỏi vòng lặp
Bước 3: Thực hiện Lệnh, tăng i lên 1 đơn vị và quay lại Bước 2.
Như vậy, sau vòng lặp trên thì i phải bằng Cuối + 1 chứ không phải là Cuối, vì khi i = Cuối + 1 thì điều kiện (*) mới bắt đầu sai (tất nhiên là loại trừ trường hợp Đầu > Cuối). Và cũng vì vậy mà trong ví dụ của bạn thì i = 30 là điều dễ hiểu.
 
Upvote 0
Mã:
Sub test()

Mình nghĩ i chỉ có thể nhận giá trị 29 thực tế lại nhận 30. Cho hỏi vậy là sao ạ?????[/QUOTE][QUOTE][/QUOTE]

con tôi đang học cấp một, nên tôi hay phải giải bài tập cho nó, tôi thấy bài này rất giống với bài toán sau(gọi là bài toán trồng cây):
một đoạn đường AB dài 25m cứ cách 5m người ta trồng một cây, hỏi người ta trồng được bao nhiêu cây trên đoạn đường đó? bạn thử giải xem có bao nhiêu cây
 
Upvote 0
Thì tại vòng lập For.. nó vậy đấy
Khi i chạy đến 30, nó phát hiện 1 > 29 thì nó mới ngừng
Vậy thôi
(vụ này lúc mới học code tôi cũng từng thắc mắc)

Ah đúng rùi, nó nhận tiếp rùi so sánh >>>mặc nhiên là nó luôn nhận giá tri cuối và cộng với bước nhảy xong dừng lại
Mã:
for i = 5 to 20 step 5
xong vòng này i=25
Vâng không hiểu kĩ chỗ này là nhầm chết hết!
 
Upvote 0
Theo lô gic (*) thì vòng for hoạt động như thế này

For i = triDau To triCuoi Step triBuoc
' gồm câu lệnh gán giá trị cho biến i, câu lệnh này được chia ra làm hai kiểu tuỳ theo lượt vòng lặp:
' 1. lượt đầu tiên, gán giá trị triDau cho i; hành động này chỉ thực hiện một lần duy nhất
' 2. các lần sau (vòng lặp lại), cộng thêm triBuoc vào i
' kế đó đem trị mới của i so sánh với triCuoi, nếu nhỏ hơn hay bằng triCuoi thì chạy tiếp code trong vòng lặp.
' và nếu không thì nhảy ra khỏi vòng lặp

[code bên trong vòng lặp ở đây]

Next ' nhảy đến mục 2. của đầu vòng lặp

' nếu trong vòng lặp không có code nhảy ra sớm (Exit For, Go to, ...)
' thì ở đây (sau câu Next) i luôn luôn có trị lớn hơn triCuoi (nhỏ hơn nếu step là số âm)
' nếu triDau lớn hơn triCuoi thì vòng lặp không hề được chạy qua
' lưu ý là đối với vòng lặp, triCuoi và triBuoc chỉ được tính một lần và được coi là bất biến.
' tức là nếu trong vòng lặp bạn đổi triCuoi hay triBuoc thì cũng không ảnh hưởng gì cả
 
Upvote 0
Mã:
Sub test()
Dim i As Long, j As Long
    For i = 1 To 29
        j = j + 1
    Next
    MsgBox i
    MsgBox j
End Sub
Mình nghĩ i chỉ có thể nhận giá trị 29 thực tế lại nhận 30. Cho hỏi vậy là sao ạ?????

Bạn hỏi, mình cũng ngớ ra...
Và mình đã thử lại...
Giờ thì đã hiểu,
tuy đã có câu trả lời, nhưng mình cũng trả lời lại...hehe

For i = 1 to 29
...
Next i

khi i=30 >29, điều kiện không còn thỏa mãn, nó sẽ dừng vòng lặp.
Cho nên, lúc này i sẽ có giá trị là 30 !
 
Upvote 0
Cảm ơn bạn nhiều. Từ những cái nhỏ để biết thêm cái mới!!
 
Upvote 0
Mã:
Sub test()
Dim i As Long, j As Long
    For i = 1 To 29
        j = j + 1
    Next
    MsgBox i
    MsgBox j
End Sub
Mình nghĩ i chỉ có thể nhận giá trị 29 thực tế lại nhận 30. Cho hỏi vậy là sao ạ?????

Bạn hỏi, mình cũng ngớ ra...
Và mình đã thử lại...
Giờ thì đã hiểu,
tuy đã có câu trả lời, nhưng mình cũng trả lời lại...hehe

For i = 1 to 29
...
Next i

khi i=30 >29, điều kiện không còn thỏa mãn, nó sẽ dừng vòng lặp.
Cho nên, lúc này i sẽ có giá trị là 30 !

Vì thế, khi xử lý trong vòng lặp, ta lợi dụng tình thế số i + 1 này để bẫy lỗi rất hiệu quả! Chẳng hạn:

Tôi có 1 UserForm với 5 TextBox và 1 nút lệnh, tôi viết code như sau:

Mã:
Private Sub CommandButton1_Click()
    Dim i As Long
    For i = 1 To 5
        If Me("TextBox" & i) = "" Then
            Exit For
        End If
    Next
[COLOR=#FF0000][B]    If i < 6 Then[/B][/COLOR]
        MsgBox "Ban phai nhap du lieu vao TextBox" & i
        Me("TextBox" & i).SetFocus
    Else
        MsgBox "OK, ban da nhap tat ca!"
    End If
End Sub

Các bạn có thấy dòng màu đỏ không?
 
Upvote 0

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

Back
Top Bottom