Làm gì mà loằng ngoằng thế.
Chỉ cần thử nghiệm đúng 1 cấu trúc chuẩn của For...Next thôi. Để nắm chắc nó hoặt động như nào, kết thúc thì counter bằng bao nhiêu?
Điểm quan trọng là ở cái giá trị step có 3 trường hợp: <0, =0, >0 thì không chịu thử nghiệm.
Đã viết sẵn cho rồi, chỉ cần thay giá trị vào rồi xem là xong thôi.
Làm gì mà loằng ngoằng thế.
Chỉ cần thử nghiệm đúng 1 cấu trúc chuẩn của For...Next thôi. Để nắm chắc nó hoặt động như nào, kết thúc thì counter bằng bao nhiêu?
Ủa có mà Bạn, OT có ghi chú khi thử các trị âm hoặc = 0 thì vòng lặp i không có điểm kết thúc ạ.
Cũng có thể là do OT viết sai câu lệnh nên nó mới vậy ạ, híc OT xem thêm ạ :
Mã:
...
Const minStp As Long = 1 ' Khi de gia tri <0 (hoac=0) vong lap i khong thoat
...
For stp = minStp To maxCount
...
For i = startCount To maxCount Step stp
...
Đây ạ, khi stp=0 (hoặc <0) thì i lặp đi lặp lại là 1 khồn tăng nên không thoát được i:
Hic mớ đầu OT cũng làm đơn giản như vi dụ của Bạn nhưng chưa hình dung được bước chạy với các thay đổi giá trị: startCount & stp nên phải tạo thêm các vòng lặp để đưa xuống sheet cho dễ nhìn hơn, vì trong cửa số debug OT coi không quen ạ:
À với step < 0 thì thoát luôn i Bạn à, nhưng do OT để nó chạy từ âm đến dương qua 0 nên nó không thoát được được, OT hiểu rồi.
Cảm ơn Bạn đã nhắc.
Phần đó nói về sự tích lão chết tiệt từ chối 1 tấn mật ong rừng, không có mật để chia cho befaint nên ảnh puồn.
Tôi kể câu chuyện chiều nay tại sao đến giờ mới đọc các câu trả lời:
Bà xã bảo: ông rảnh quá ông lấy rổ giá (giá đỗ) ra bứt và đếm xem bao nhiêu cái rễ. Mình vừa bứt vừa đếm đến hơn 100 thì bả hỏi "xong chưa", mình nói chưa xong, quay lại thì quên mất con số. Báo cho bả biết thì bả bảo đếm tiếp nhưng bắt đầu lại từ 1 cũng được. Mình nghe lời đếm lại từ 1 và bị đếm lại như thế 4, 5 lần. Khi xong hết báo cho bả biết là 12, rồi hỏi bà cần biết số rễ làm gì mà giờ chỉ còn 12?
Bả nói xong rồi thì thôi, ông tự suy luận đi, cuối cùng mình kết luận là bả biểu mình lặt rau.
Câu chuyện liên quan ở đây là: Với yêu cầu viết công thức tính ra giá trị counter khi thoát vòng lặp For i = m to 1000 Step n (chứ không phải giá trị cuối của vòng lặp), nếu đã liệt kê ra 1 bảng rồi thì phải suy luận đưa ra 1 công thức tính cho m và n bất kỳ. Và phải suy luận mới ra, đó là mục đích cuối của việc đố, cũng như phải suy luận mới ra việc bị lặt rau chứ không phải đếm rễ
Ghi chú:
Step âm là trừ cho đến khi nhỏ hơn hoặc bằng 1000. Vậy thì m phải đặt con số lớn hơn 1000 chứ?
Cảm ơn Bạn,
Do OT không hiểu về vấn đề này (bảo sao Bạn cứ bảo làm thật đơn giản thôi) chỉ nghĩ đơn giản không thấy rõ được các bước lặp loại này nên loay hoay mãi làm thử để đưa xuốn sheet để xem cho dễ thôi ạ, tránh đoán mò như những bài trước ..
Phần đó nói về sự tích lão chết tiệt từ chối 1 tấn mật ong rừng, không có mật để chia cho befaint nên ảnh puồn.
Tôi kể câu chuyện chiều nay tại sao đến giờ mới đọc các câu trả lời:
Bà xã bảo: ông rảnh quá ông lấy rổ giá (giá đỗ) ra bứt và đếm xem bao nhiêu cái rễ. Mình vừa bứt vừa đếm đến hơn 100 thì bả hỏi "xong chưa", mình nói chưa xong, quay lại thì quên mất con số. Báo cho bả biết thì bả bảo đếm tiếp nhưng bắt đầu lại từ 1 cũng được. Mình nghe lời đếm lại từ 1 và bị đếm lại như thế 4, 5 lần. Khi xong hết báo cho bả biết là 12, rồi hỏi bà cần biết số rễ làm gì mà giờ chỉ còn 12?
Bả nói xong rồi thì thôi, ông tự suy luận đi, cuối cùng mình kết luận là bả biểu mình lặt rau.
Câu chuyện liên quan ở đây là: Với yêu cầu viết công thức tính ra giá trị counter khi thoát vòng lặp For i = m to 1000 Step n (chứ không phải giá trị cuối của vòng lặp), nếu đã liệt kê ra 1 bảng rồi thì phải suy luận đưa ra 1 công thức tính cho m và n bất kỳ. Và phải suy luận mới ra, đó là mục đích cuối của việc đố, cũng như phải suy luận mới ra việc bị lặt rau chứ không phải đếm rễ
Ghi chú:
Step âm là trừ cho đến khi nhỏ hơn hoặc bằng 1000. Vậy thì m phải đặt con số lớn hơn 1000 chứ?
Thảo nào Chú Mỹ nhớ lâu vậy vì hay liên tưởng việc làm trong cuộc sống đến kiến thức, nhưng pahir có kiến thức thì mới liên tưởng được chứ ạ.
Con cũng chưa tìm hiểu việc đặt số nó có ảnh hưởng gì không nhưng vì duy nghĩ đặt vòng lặp for lồng nhiều vào nhau nên con giảm con số để mang tính test thử rồi ngẫm ra công thức dạng như bài 33 đó ạ:
Khi for i = 1 to m step n thì i = (m-n)+1, n càng tăng thì i càng giảm, m = i chỉ khi nào n=1
Con cũng chưa tìm hiểu việc đặt số nó có ảnh hưởng gì không nhưng vì duy nghĩ đặt vòng lặp for lồng nhiều vào nhau nên con giảm con số để mang tính test thử rồi ngẫm ra công thức dạng như bài 33 đó ạ:
Không phải ngẫu nhiên tôi viết code để test trong bài 21
Mã:
EndRow = 1000
For i = 1 to EndRow
k = i
Next
Msgbox i & "-" & k
tôi viết k = i trong vòng lặp và Msgbox ngoài vòng lặp là để k lấy giá trị cuối của i trong vòng lặp, và Msgbox hiển thị 1 số cuối trong vòng lặp so sánh với khi ra khỏi vòng lặp.
Code viết nhiều để test cũng theo cấu trúc trên cho trường hợp tổng quát For i = m to k step n là:
PHP:
Sub TestOutputCounter()
Dim m As Long, i As Long, n As Long, k As Long, j As Long, p As Long
For i = 2 To 20
m = Cells(i, 1)
k = Cells(i, 2)
n = Cells(i, 3)
For j = m To k Step n
p = j
Next
Cells(i, 4) = p
Cells(i, 5) = j
Next
End Sub
Giải thích code:
Lấy m (start), k (end), n (step) trên bảng tính ở 3 cột A, B, C. Kết quả số cuối của counter j trong vòng lặp gán vào cột D, giá trị sau khi ra khỏi vòng lặp của j gán xuống cột E
Kết quả:
Nhận xét:
p (last counter) = m (start) +bội số lớn nhất của n (step) mà nhỏ hơn k (end). Chỉ cần cộng counter thêm 1 step thì lớn hơn end. Đó chính là Output counter j
Có thể tính ra last counter bằng công thức sau đó cộng thêm step để cho ra counter
D2 = Last counter = End - MOD( End - Start, Step) =B2-MOD(B2-A2,C2)
E2 = Output Counter + Step = End - MOD( End - Start, Step) + Step = B2-MOD(B2-A2,C2)+C2
Test với Step âm: phải cho m lớn hơn k (start > end) mới chạy
Không phải ngẫu nhiên tôi viết code để test trong bài 21
Mã:
EndRow = 1000
For i = 1 to EndRow
k = i
Next
Msgbox i & "-" & k
tôi viết k = i trong vòng lặp và Msgbox ngoài vòng lặp là để k lấy giá trị cuối của i trong vòng lặp, và Msgbox hiển thị 1 số cuối trong vòng lặp so sánh với khi ra khỏi vòng lặp.
Code viết nhiều để test cũng theo cấu trúc trên cho trường hợp tổng quát For i = m to k step n là:
PHP:
Sub TestOutputCounter()
Dim m As Long, i As Long, n As Long, k As Long, j As Long, p As Long
For i = 2 To 20
m = Cells(i, 1)
k = Cells(i, 2)
n = Cells(i, 3)
For j = m To k Step n
p = j
Next
Cells(i, 4) = p
Cells(i, 5) = j
Next
End Sub
Giải thích code:
Lấy m (start), k (end), n (step) trên bảng tính ở 3 cột A, B, C. Kết quả số cuối của counter j trong vòng lặp gán vào cột D, giá trị sau khi ra khỏi vòng lặp của j gán xuống cột E
Kết quả:
Nhận xét:
p (last counter) = m (start) +bội số lớn nhất của n (step) mà nhỏ hơn (k (end) - m (start)). Chỉ cần cộng counter thêm 1 step thì lớn hơn end. Đó chính là Output counter j
Có thể tính ra last counter bằng công thức sau đó cộng thêm step để cho ra counter
D2 = Last counter = End - MOD( End - Start, Step) =B2-MOD(B2-A2,C2)
E2 = Output Counter + Step = End - MOD( End - Start, Step) + Step = B2-MOD(B2-A2,C2)+C2
Trời ạ đúng là ra hại não thật không thể yêu thương được, con thì đang mải loay hoay với cái vidu của Bạn @befaint , Bạn nhắc phải đọc thật chậm thôi và đơn giản thôi giờ mới thấy thấm.
Con mới làm qua qua cái này để xem công thức tổng quát thế nào quay ra thì thấy bài của Chú Mỹ (công thức khiếp quá) để con đọc thật chậm ạ:
Cảm ơn Chú Mỹ nhiều ạ.
Cũng còn may chứ không tôi hỏi tới i = m to k step n là còn bể não nữa đó
Nhận xét:
p (last counter) = m (start) +bội số lớn nhất của n (step) mà nhỏ hơn (k (end) - m (start)). Chỉ cần cộng counter thêm 1 step thì lớn hơn end. Đó chính là Output counter j
Có thể tính ra last counter bằng công thức sau đó cộng thêm step để cho ra counter
D2 = Last counter = End - MOD( End - Start, Step) =B2-MOD(B2-A2,C2)
E2 = Output Counter + Step = End - MOD( End - Start, Step) + Step = B2-MOD(B2-A2,C2)+C2
Trời ạ đúng là ra hại não thật không thể yêu thương được, con thì đang mải loay hoay với cái vidu của Bạn @befaint , Bạn nhắc phải đọc thật chậm thôi và đơn giản thôi giờ mới thấy thấm.
Con mới làm qua qua cái này để xem công thức tổng quát thế nào quay ra thì thấy bài của Chú Mỹ (công thức khiếp quá) để con đọc thật chậm ạ:
Cảm ơn Chú Mỹ nhiều ạ.
Đó là cách để suy luận trực quan. Khi quen rồi thì suy luận trực tiếp cách tính ở trong đầu không cần giấy và nháp.
Phải tập suy luận chứ chả lẽ lần sau vợ bảo đếm rễ giá lại cứ thế mà đếm sao?
Đó là cách để suy luận trực quan. Khi quen rồi thì suy luận trực tiếp cách tính ở trong đầu không cần giấy và nháp.
Chả lẽ lần sau vợ bảo đếm rễ lại cứ thế mà đếm sao?
Nếu không bể não làm sao trả lời được câu hỏi tại sao. Mà không biết hỏi tại sao thì cả đời chỉ xin code hoặc copy code về chạy, chứ chả bao giờ có thể tự viết
Nếu không bể não làm sao trả lời được câu hỏi tại sao. Mà không biết hỏi tại sao thì cả đời chỉ xin code hoặc copy code về chạy, chứ chả bao giờ có thể tự viết