Bài tập về vòng lặp

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,947
Những ai đã từng xem qua bài viết này: Giới thiệu Cơ bản về vòng lặp For . . . next của sư phụ ptm0412 giờ hãy cùng làm 1 vài bài tập từ đơn giản đến nâng cao nhé
Xin mở màn bằng 1 bài tập sau:

Bài tập 01:

Hãy tính xem từ năm 1900 đến nay có bao nhiêu ngày thuộc dạng THỨ SÁU NGÀY 13
------------------------
Các bạn ai có bài tập gì hay xin post lên đây nhé! Cảm ơn
 
Chỉnh sửa lần cuối bởi điều hành viên:
Sao viehoai thay số vào B1? thay vào A1, và B1 vẫn = Sin(A1) chứ?
Viehoai thử nghiên cứu vòng lặp Do Loop chạy - dừng xem.
Và thử thay A2 = A1 + số khác >1 thay cho +1, con rắn hiện giờ đang chạy từ phải qua trái, không phải uốn lượn.
 
Upvote 0
Sao viehoai thay số vào B1? thay vào A1, và B1 vẫn = Sin(A1) chứ?
Viehoai thử nghiên cứu vòng lặp Do Loop chạy - dừng xem.
Và thử thay A2 = A1 + số khác >1 thay cho +1, con rắn hiện giờ đang chạy từ phải qua trái, không phải uốn lượn.
Làm theo ý sư phụ, xin sư phụ giúp tiếp
Nhờ sơ phụ xem sao em bỏ đường ngang không được nhỉ?
Em xin cảm ơn
 

File đính kèm

  • viehoai.xls
    57 KB · Đọc: 16
Lần chỉnh sửa cuối:
Upvote 0
Làm theo ý sư phụ, xin sư phụ giúp tiếp
Nhờ sơ phụ xem sao em bỏ đường ngang không được nhỉ?
Em xin cảm ơn
Con rắn chạy từ trái sang phải không phải uốn lượn.
Bạn xem do loop ở Bài trên của Anh NDU hướng dẫn về cái đồng hồ và bấm nút dừng chạy ấy.
Cái đường ngang-> Bạn bấm vào nó bấm phải chuột -> Clear là ok thôi.
 
Upvote 0
Click chọn cái đường ngang (gridline), nhấn delete là xong mà, nếu không thì vào Chart option, click bỏ chọn major gridline.
Sao không kéo công thức A2 xuống luôn, đẹp lắm. Vì không kéocông thức nên con rắn cũng chỉ chạy ngang.

với 1 commandbutton mà muốn nhấn 1 cái chạy, nhấn cái nữa dừng thì trước tiên chỉnh caption của nút thành Start, sau đó dùng:

PHP:
Private Sub CommandButton1_Click()
With CommandButton1
.Caption = IIf(.Caption = "Start", "Stop", "Start")

  Do
      Range("A1").Value = Range("A1").Value + 0.1
       Sleep 30
      DoEvents
  Loop Until .Caption = "Start"
End With
  Range("A1").Value = 1
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Về cách tạo đồng hồ các bạn có thể tham khảo thêm tại đây.
Mấy cái đồng hồ đó vấn chưa đạt CHUẨN đâu ---> CHUẨN tức là đồng hồ chạy mà không ảnh hưởng gì đến công việc của ta và ngược lại, việc ta làm cũng không ảnh hưởng đến đồng hồ
Thật ra là dùng đồng hồ để nghiên cứu vòng lập thôi
Chứ cái đồng hồ thật sự nó phải thế này:
PHP:
Private Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Private Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
PHP:
Sub StartTimer()
  StopTimer
  SetTimer Application.hWnd, 1, 1000, AddressOf TimeProc
End Sub
PHP:
Sub StopTimer()
  KillTimer Application.hWnd, 1
End Sub
PHP:
Private Function TimeProc(ByVal H As Long, ByVal nMSG As Long, ByVal nID As Long, ByVal nTsys As Long)
  Dim sTotal As Double, hPos As Double, mPos As Double, sPos As Double
  On Error Resume Next
  sTotal = Hour(Time) * 3600 + Minute(Time) * 60 + Second(Time)
  sPos = (sTotal Mod 60) * 6
  mPos = ((sTotal / 60) Mod 60) * 6
  hPos = ((sTotal / 720) Mod 60) * 6
  With Sheet2
    .Shapes("sec").Rotation = sPos
    .Shapes("min").Rotation = mPos
    .Shapes("hrs").Rotation = hPos
  End With
End Function
------------
Nếu viết để học vòng lập thì cũng gần giống code trên
PHP:
Private Sub CommandButton1_Click()
  Dim sTotal As Double, hPos As Double, mPos As Double, sPos As Double
  With Sheet1
    With .CommandButton1
      .Caption = IIf(.Caption = "Start", "Stop", "Start")
    End With
    Do
      sTotal = Hour(Time) * 3600 + Minute(Time) * 60 + Second(Time)
      sPos = (sTotal Mod 60) * 6
      mPos = ((sTotal / 60) Mod 60) * 6
      hPos = ((sTotal / 720) Mod 60) * 6
      .Shapes("sec").Rotation = sPos
      .Shapes("min").Rotation = mPos
      .Shapes("hrs").Rotation = hPos
      Sleep 1000
      DoEvents
    Loop Until .CommandButton1.Caption = "Start"
  End With
End Sub
Cũng như tôi đã nói ở trên: HỌC LÀ CHÍNH... chứ xây dựng động hồ mà dùng Sleep thì có mà... chết luôn!
 

File đính kèm

  • Clock_2.rar
    96.4 KB · Đọc: 60
Upvote 0
Cũng như tôi đã nói ở trên: HỌC LÀ CHÍNH... chứ xây dựng động hồ mà dùng Sleep thì có mà... chết luôn!
Chính xác. Sleep 1 giây là giữa 2 lần lặp, mỗi lần lặp là chạy 1 số câu lệnh, thì bị cách 1 quãng thời gian chạy các dòng lệnh đó. Thí dụ chạy 3 dòng lệnh mất 0.01 giây, vậy 1 vòng lặp là 1.01 giây, đồng hồ không chính xác. Với 1 máy yếu hơn, chạy chậm hơn, thì càng không chính xác.

Đồng hồ chạy chín hxác là đồng hồ lấy thời gian từ hệ thống. lặp cũng được.
 
Upvote 0
Chính xác. Sleep 1 giây là giữa 2 lần lặp, mỗi lần lặp là chạy 1 số câu lệnh, thì bị cách 1 quãng thời gian chạy các dòng lệnh đó. Thí dụ chạy 3 dòng lệnh mất 0.01 giây, vậy 1 vòng lặp là 1.01 giây, đồng hồ không chính xác. Với 1 máy yếu hơn, chạy chậm hơn, thì càng không chính xác.

Đồng hồ chạy chín hxác là đồng hồ lấy thời gian từ hệ thống. lặp cũng được.
Quan trọng ở đây là khi nó chạy thì chẳng làm được giống gì cả, đã vậy còn chạy rất.. nặng nề
 
Lần chỉnh sửa cuối:
Upvote 0
Về đồng hồ, có thể tham khảo đồng hồ trong topic thi vẽ biểu đồ chào mừng SN 3, bổ sung đồng hồ có quả lắc.

Còn con rắn, nếu nghịch thì nghịch tới nơi tới chốn, khà khà. Tải file và chạy thử, con rắn lúc thì uốn lượn nhịp nhàng, lúc thì nhảy cà tưng, dzui lắm.
 

File đính kèm

  • RanUon.xls
    42 KB · Đọc: 50
Upvote 0
Về đồng hồ, có thể tham khảo đồng hồ trong topic thi vẽ biểu đồ chào mừng SN 3, bổ sung đồng hồ có quả lắc.

Còn con rắn, nếu nghịch thì nghịch tới nơi tới chốn, khà khà. Tải file và chạy thử, con rắn lúc thì uốn lượn nhịp nhàng, lúc thì nhảy cà tưng, dzui lắm.
Ẹc... Ẹc.... về phần biểu đồ thì chẳng ai địch nổi sư phụ... vì vậy mà em thà dùng API cho nó khoẻ! (code ngắn gọn, chạy chính xác và hoàn toàn không ảnh hướng đến bất kỳ công việc nào trên bảng tính)
 
Upvote 0
Bài 5 a, c, và d với 1 vòng lặp

Suy luận đơn giản: iRow cố định và jCol tăng 1, Khi thoả điều kiện thì iRow tăng 1 (xuống dòng) và tính lại jCol xuất phát của dòng mới.
Do đơn giản, nên có thể áp dụng và mở rộng 2 điều kiện a và c, gộp lại thành d

PHP:
Private Sub To5a()
Dim iRow As Long, jCol As Long, N As Long, t As Long
Cells.Clear
N = InputBox("Cho so N")
iRow = 1: jCol = N - iRow + 1
For t = 1 To N ^ 2
    Cells(iRow, jCol).Interior.ColorIndex = IIf((iRow + jCol) Mod 2 = 0, 15, 16)
    Sleep 10
    jCol = jCol + 1
    If t = iRow ^ 2 Then iRow = iRow + 1: jCol = N - iRow + 1
Next
End Sub

PHP:
Private Sub To5c()
Dim iRow As Long, jCol As Long, N As Long, t As Long
Cells.Clear
N = InputBox("Cho so N")
iRow = 1: jCol = 1
For t = 1 To N ^ 2
    Cells(iRow, jCol).Interior.ColorIndex = IIf((iRow + jCol) Mod 2 = 0, 15, 16)
    Sleep 10
    jCol = jCol + 1
    If t = N ^ 2 - (N - iRow) ^ 2 Then iRow = iRow + 1: jCol = iRow
Next
End Sub

PHP:
Private Sub To5d()
Dim iRow As Long, jCol As Long, N As Long, t As Long, tCount As Long
Cells.Clear
N = InputBox("Cho so N")
iRow = 1
jCol = N - iRow + 1
tCount = N ^ 2 + (N - 1) ^ 2
For t = 1 To tCount
    Cells(iRow, jCol).Interior.ColorIndex = IIf((iRow + jCol) Mod 2 = 0, 15, 16)
    Sleep 10
    jCol = jCol + 1
    If iRow < N And t = iRow ^ 2 Then iRow = iRow + 1: jCol = N - iRow + 1
    If iRow >= N And t = tCount - (2 * N - 1 - iRow) ^ 2 Then iRow = iRow + 1: jCol = iRow - N + 1
Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Sao không thấy các sự phụ ra bài tập cho những ngày Lễ ???
 
Upvote 0
Bài 6

Trong tập hợp các số có 6 chữ số (từ 100.000 đến 999.999):

a. Đếm và liệt kê các số có 3 chữ số giống nhau lên bảng tính, (2, 4, 5, 6 số giống nhau là không tính). 3 chữ số giống nhau này nằm ở vị trí bất kỳ, thí dụ 333456, 345633, 334563, 433356, 343536, ...333645, ...

b. Cố gắng giảm thiểu số vòng lặp, nên có 1 biến đếm số lần lặp để so sánh với số kết quả.

c. Nếu có thể, sử dụng mảng để tăng tốc độ.
 
Upvote 0
Bài 6

Trong tập hợp các số có 6 chữ số (từ 100.000 đến 999.999):

a. Đếm và liệt kê các số có 3 chữ số giống nhau lên bảng tính, (2, 4, 5, 6 số giống nhau là không tính). 3 chữ số giống nhau này nằm ở vị trí bất kỳ, thí dụ 333456, 345633, 334563, 433356, 343536, ...333645, ...

b. Cố gắng giảm thiểu số vòng lặp, nên có 1 biến đếm số lần lặp để so sánh với số kết quả.

c. Nếu có thể, sử dụng mảng để tăng tốc độ.
Em xin dùng 2 vòng lặp For như sau. Các Anh xem và góp ý cho Em nhé!
Mã:
Sub Lietke()
Dim i As Long, j As Integer, demso As Long, k As Long
Cells.Clear
For i = 100000 To 999999
    For j = 0 To 9
        If j = 2 Or j = 4 Or j = 5 Or j = 6 Then Exit For
        With Cells(k + 1, 1)
            If Len(Replace(i, j, "")) = 3 Then
                .Value = i
                demso = demso + 1
                k = k + 1
                Exit For
            End If
        End With
    Next j
Next i
MsgBox "So luong cac so co 3 chu so giong nhau la: " & demso
End Sub
Chỗ vòng lặp For j=0 to 9 Em muốn dùng for each j in arr(0,1,3,7,8,9) thì phải khia bảo như thế nào nhỉ? (Mục đích để khỏi phải dùng if ở dòng lệnh tiếp theo)
 
Lần chỉnh sửa cuối:
Upvote 0
Em xin dùng 2 vòng lặp For như sau:
Mã:
Sub Lietke()
Dim i As Long, j As Integer, demso As Long, k As Long
Cells.Clear
For i = 100000 To 999999
    For j = 0 To 9
        If j = 2 Or j = 4 Or j = 5 Or j = 6 Then Exit For
        With Cells(k + 1, 1)
            If Len(Replace(i, j, "")) = 3 Then
                .Value = i
                demso = demso + 1
                k = k + 1
                Exit For
            End If
        End With
    Next j
Next i
MsgBox "So luong cac so co 3 chu so giong nhau la: " & demso
End Sub
Chỗ vòng lặp For j=0 to 9 Em muốn dùng for each j in arr(0,1,3,7,8,9) thì phải khia bảo như thế nào nhỉ? (Mục đích để khỏi phải dùng if ở dòng lệnh tiếp theo)
Thì tạo 1 biến Arr
Arr = Array(0,1,3,7,8,9)
Rồi
For Each j in Arr
Có điều tôi chưa hiểu tại sao bạn lại bỏ qua mấy số 2, 4, 5 và 6 nhỉ?
 
Upvote 0
À em hiểu chỗ 2, 4, 5, 6 giiống nhau như thế nào rồi, Em tưởng không tính nó chứ.
 
Upvote 0
À em hiểu chỗ 2, 4, 5, 6 giiống nhau như thế nào rồi, Em tưởng không tính nó chứ.
Bài này mà dùng Excel 2003 thì không ăn rồi ---> Kết quả đến trên 130,000 số ---> Làm sao liệt kê?
Sửa lại bài toán trên: Duyệt từ số 100000 đến 500000 thôi
 
Upvote 0
Bài này mà dùng Excel 2003 thì không ăn rồi ---> Kết quả đến trên 130,000 số ---> Làm sao liệt kê?
Sửa lại bài toán trên: Duyệt từ số 100000 đến 500000 thôi
Em sửa lại 1 tí với 2 vòng lặp như sau:
Mã:
Sub Lietke()
Dim i As Long, j As Integer, demso As Long
Cells.Clear
For i = 100000 To 500000
    For j = 0 To 9
        With Cells(demso + 1, 1)
            If Len(Replace(i, j, "")) = 3 Then
                .Value = i
                demso = demso + 1
                Exit For
            End If
        End With
    Next j
Next i
MsgBox "So luong cac so co 3 chu so giong nhau la: " & demso
End Sub
Chưa nghĩ ra phương án nào khác nữa, Em sẽ cố nghiên cứu tiếp.
 

File đính kèm

  • Lietke.xls
    23 KB · Đọc: 15
Upvote 0
Em sửa lại 1 tí với 2 vòng lặp như sau:
Mã:
Sub Lietke()
Dim i As Long, j As Integer, demso As Long
Cells.Clear
For i = 100000 To 500000
    For j = 0 To 9
        With Cells(demso + 1, 1)
            If Len(Replace(i, j, "")) = 3 Then
                .Value = i
                demso = demso + 1
                Exit For
            End If
        End With
    Next j
Next i
MsgBox "So luong cac so co 3 chu so giong nhau la: " & demso
End Sub
Chưa nghĩ ra phương án nào khác nữa, Em sẽ cố nghiên cứu tiếp.
Góp ý chút
Ngay chổ For j = 0 To 9 tức là duyệt từ 0 đến 9, mục đích xem có số nào nằm ở 3 vị trí không ---> Vị chi vòng lập này chạy 10 lần, đúng không?
Nếu bạn duyệt qua các ký tự của số thì chỉ tốn có 6 lần lập thôi
 
Upvote 0
Góp ý chút
Ngay chổ For j = 0 To 9 tức là duyệt từ 0 đến 9, mục đích xem có số nào nằm ở 3 vị trí không ---> Vị chi vòng lập này chạy 10 lần, đúng không?
Nếu bạn duyệt qua các ký tự của số thì chỉ tốn có 6 lần lập thôi
Em làm theo chỉ dẫn của Anh theo Em nghĩ là chỉ cần 4 vòng lặp cho j thôi.
Mã:
Sub Lietke()
Dim i As Long, j As Integer, demso As Long
Cells.Clear
For i = 100000 To 500000
    For j = 1 To 4
        With Cells(demso + 1, 1)
            If Len(Replace(i, Mid$(i, j, 1), "")) = 3 Then
                .Value = i
                demso = demso + 1
                Exit For
            End If
        End With
    Next j
Next i
MsgBox "So luong cac so co 3 chu so giong nhau la: " & demso
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom