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,930
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:
Hàm tìm chữ số lớn nhất trong một số nguyên
ví dụ
Số 123544 có chữ số lớn nhất là 5
Số 1328 có chữ số lớn nhất là 8
Số -9344 có chữ số lớn nhất là 9
Function solonnhat(n As Long) As Byte
Dim max As Byte
n = Abs(n)
max = 0
Do While (n > 0)
If (max < n Mod 10) Then
max = n Mod 10
End If
n = Int(n / 10)
Loop
solonnhat = max
End Function
 
Upvote 0
Có một câu lệnh có thể thay thế bằng

Mã:
[B]n = n \ 10[/B]

Chúc vui & hết sức cảm ơn bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
Hàm tìm chữ số lớn nhất trong một số nguyên
ví dụ
Số 123544 có chữ số lớn nhất là 5
Số 1328 có chữ số lớn nhất là 8
Số -9344 có chữ số lớn nhất là 9


Lợi dụng hàm trên em viết thêm hàm đếm số chữ số lớn nhất trong 1 số
ví dụ
Số 347334 kết quả là 1 vì có 1 số 7(số 7 là lớn nhất)
Số -9394939 kết quả là 4 vì có 4 số 9(số 9 là số lớn nhất)
Function dem_sochu_solonnhat(n As Long) As Byte
Dim dem As Byte
Dim m As Long
Dim max As Byte
n = Abs(n)
m = n
dem = 0
max = solonnhat(m)
Do While (n > 0)
If (max = (n Mod 10)) Then
dem = dem + 1
End If
n = n \ 10
Loop
dem_sochu_solonnhat = dem
End Function
 
Upvote 0
Lợi dụng hàm trên em viết thêm hàm đếm số chữ số lớn nhất trong 1 số
ví dụ
Số 347334 kết quả là 1 vì có 1 số 7(số 7 là lớn nhất)
Số -9394939 kết quả là 4 vì có 4 số 9(số 9 là số lớn nhất)
Tôi chưa nghĩ ra được những trường hợp sẽ ứng dụng các hàm của bạn. Theo tôi thì một hàm tự tạo trước hết phải có tính hữu dụng cao, hơn nữa những hàm đó thì công thức Excel làm cũng được mà.
 
Upvote 0
Bài tập 02:
Nhập vào 1 số N nguyên dương, in ra sheet hiện hành trên 1 vùng N cột, N dòng bắt đầu từ ô A1 với vùng đó chứa các số tự nhiên từ 1 đến N*N theo vòng xoáy ốc.
Bài này C++ tôi giải quyết tốt, nhưng mà VBA thì chưa rõ lắm nên không biết chọn vùng như thế nào và cách đưa dữ liệu vào các ô ra sao hu hu
 
Lần chỉnh sửa cuối:
Upvote 0
Gì mà khóc như trẻ lên 3 thế? bài 23 và 24 đã giải và giải thích cặn kẽ rồi.
 
Upvote 0
Theo tôi với vòng lặp thì bài này có thể finish được rồi, 1 vòng lặp hay 2 vòng lặp thì số lượng phép toán là như nhau, các bạn có thể tìm hiểu thêm phương pháp không dùng vòng lặp(đệ quy) xem sao.
Liên quan đến vòng lặp thì thường là các bài liên quan đến xử lý mảng, sắp xếp, ma trận, xử lý chuỗi ... Tôi xin góp vui 1 bài như sau
Bài tập 02:
Nhập vào 1 số N nguyên dương, in ra sheet hiện hành trên 1 vùng N cột, N dòng bắt đầu từ ô A1 với vùng đó chứa các số tự nhiên từ 1 đến N*N theo vòng xoáy ốc. Ví dụ N=5 ta sẽ phải in ra sheet hiện hành là
|A|B|C|D|E
1|1|2|3|4|5
2|16|17|18|19|6
3|15|24|25|20|7
4|14|23|22|21|8
5|13|12|11|10|9

hihi cuối cùng mình cũng biết một ít VBA rồi mừng quá, mình cảm thấy rất vui khi chuyển từ ngôn ngữ C++ qua VBA tuy bài này Code rất tầm thường nhưng mình rất vui vì đã biết chuyển đổi từ C++ qua VBA, xin cảm ơn GPE

PHP:
Sub xoanoc()
    Dim n, a, b, c, d As Integer
    Range("a1:z100").Clear
    n = InputBox(" Nhap vao so nguyen, nho nhap dung nha", "Nhap")
    n = Val(n)
    a = 1
    b = 1
    c = n
    d = n
    t = 1
     Do While (t < n * n)
            For i = a To d - 1 Step 1
                Range("A1").Offset(b, i) = t
                t = t + 1
             Next i
    
            For i = b To d - 1
                Range("A1").Offset(i, c) = t
                t = t + 1
            Next i

            For i = c To a + 1 Step -1
                Range("A1").Offset(d, i) = t
                t = t + 1
            Next i

            For i = d To b + 1 Step -1
                Range("A1").Offset(i, a) = t
                t = t + 1
            Next i
            a = a + 1
            b = b + 1
            c = c - 1
            d = d - 1
        Loop

        If (n Mod 2 = 1) Then
            Range("A1").Offset(Int(n / 2) + 1, Int(n / 2) + 1) = n * n
        End If
End Sub

[PHP]
Private Sub CommandButton1_Click()
Call xoanoc
End Sub
[/PHP]
 
Upvote 0
hihi cuối cùng mình cũng biết một ít VBA rồi mừng quá, mình cảm thấy rất vui khi chuyển từ ngôn ngữ C++ qua VBA tuy bài này Code rất tầm thường nhưng mình rất vui vì đã biết chuyển đổi từ C++ qua VBA, xin cảm ơn GPE
/QUOTE]
Thuật toán trên rất hay và sáng tạo mà bạn nói rất tầm thường, vậy bạn có thể chuyển từ Do... Loop sang for ... next thử.
Do tôi chưa rành lắm về Do... Loop.
Cám ơn bạn.
 
Upvote 0
hihi cuối cùng mình cũng biết một ít VBA rồi mừng quá, mình cảm thấy rất vui khi chuyển từ ngôn ngữ C++ qua VBA tuy bài này Code rất tầm thường nhưng mình rất vui vì đã biết chuyển đổi từ C++ qua VBA, xin cảm ơn GPE
/QUOTE]
Thuật toán trên rất hay và sáng tạo mà bạn nói rất tầm thường, vậy bạn có thể chuyển từ Do... Loop sang for ... next thử.
Do tôi chưa rành lắm về Do... Loop.
Cám ơn bạn.

Gởi chị bài For Next
PHP:
Sub xoanoc()
    Dim n, a, b, c, d As Integer
    
    Range("a1:z100").Clear
    n = InputBox(" Nhap vao so nguyen, nho nhap dung nha", "Nhap")
    n = Val(n)
    
    a = 1
    b = 1
    c = n
    d = n
    t = 1
     For t = 1 To n * n
           If (t = n * n) Then Exit For
            For i = a To d - 1 Step 1
                Range("A1").Offset(b, i) = t
                t = t + 1
             Next i
    
            For i = b To d - 1
                Range("A1").Offset(i, c) = t
                t = t + 1
            Next i

            For i = c To a + 1 Step -1
                Range("A1").Offset(d, i) = t
                t = t + 1
            Next i

            For i = d To b + 1 Step -1
                Range("A1").Offset(i, a) = t
                t = t + 1
            Next i
            a = a + 1
            b = b + 1
            c = c - 1
            d = d - 1
            t = t - 1
        Next t

       If (n Mod 2 = 1) Then
            Range("A1").Offset(Int(n / 2) + 1, Int(n / 2) + 1) = n * n
        End If
End Sub
 
Upvote 0
PHP:
    a = 1
    b = 1
    c = n
    d = n
    t = 1
     For t = 1 To n * n
          If (t = n * n) Then Exit For
            For i = a To d - 1 Step 1
                Range("A1").Offset(b, i) = t
                t = t + 1
             Next i
    
            For i = b To d - 1
                Range("A1").Offset(i, c) = t
                t = t + 1
            Next i

            For i = c To a + 1 Step -1
                Range("A1").Offset(d, i) = t
                t = t + 1
            Next i

            For i = d To b + 1 Step -1
                Range("A1").Offset(i, a) = t
                t = t + 1
            Next i
            a = a + 1
            b = b + 1
            c = c - 1
            d = d - 1
            t = t - 1
        Next t

 ...
Hình như có gì chưa ổn

If (t = n * n) Then Exit For
Bạn chạy thử có OK. Tôi chưa run.
 
Upvote 0
Upvote 0
Sướng quá cuối cùng cũng làm được bài đếm số hậu trên bàn cờ rồi hihi, các cao thủ trên diễn đàn xem code và cho ý kiếm nha, xin cảm ơn, có file đính kèm
http://www.mediafire.com/?3wihn3w9985vlgl


PHP:
Sub nhap(A() As Integer, ByRef n As Integer)
    Dim i, j As Integer
    Randomize
    n = InputBox("nhap so nguyen duong n", "Nhap")
    For i = 1 To n
        For j = 1 To n
           A(i, j) = Round(Rnd * 100)
        Next j
     Next i
End Sub

Sub xuat(A() As Integer, n)
    Dim i, j As Integer
     For i = 1 To n
        For j = 1 To n
           Range("A1").Offset(i, j).Value = A(i, j)
        Next j
     Next i
End Sub
Function kthoanghau(A() As Integer, ByVal n As Integer, ByVal dong As Integer, ByVal cot As Integer)
    Dim flag As Byte
    Dim i, j As Integer
    flag = 1
    For i = 1 To n
        For j = 1 To n
            If (((i = dong) Or (j = cot) Or (i + j = dong + cot) Or (i - j = dong - cot)) And (A(i, j) > A(dong, cot))) Then
                   
             
                      flag = 0
             End If
         Next j
     Next i
   kthoanghau = flag
End Function
Function demhoanghau(A() As Integer, ByVal n As Integer)
    Dim i, j As Integer
    Dim dem As Byte
    dem = 0
     For i = 1 To n
        For j = 1 To n
           If (kthoanghau(A, n, i, j) = 1) Then
             dem = dem + 1
           End If
        Next j
     Next i
     demhoanghau = dem
End Function


PHP:
Private Sub CommandButton1_Click()
Dim A(100, 100) As Integer
Dim n As Integer
Range("A1:Z100").Clear
Call nhap(A(), n)
Call xuat(A(), n)
Range("c15").Value = demhoanghau(A, n)

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
for t=1 ...
t+t+1
không phải vậy đâu chị
t=t+1 đó
bài này em test rồi em mới đưa lên diến đàn đó chị
Ý anh ThuNghi là code của bạn có những dòng thừa không cần thiết có thể rút gọn. Ví dụ như trong đoạn này:
PHP:
t = 1
    For t = 1 To n * n
        If (t = n * n) Then Exit For
Dòng 1 thừa. Có thể bỏ đi
Dòng 2 và 3 sửa lại thành:
PHP:
For t = 1 To n * n - 1
Code của bạn có thể rút gọn lại thành như thế này:
PHP:
Sub xoanoc()
    Dim n As Long, a As Long, b As Long, i As Long, j As Long
    Range("A1:Z100").ClearContents
    n = InputBox("Nhap vao so nguyen, nho nhap dung nha", "Nhap")
    a = 1:    b = n:    t = 1
    For j = 1 To n \ 2
        For i = a To b - 1 Step 1
             Cells(a, i) = t
             Cells(i, b) = t + b - j
             Cells(b, n + 1 - i) = t + 2 * (b - j)
             Cells(n + 1 - i, a) = t + 3 * (b - j)
             t = t + 1
         Next i
         t = t + 3 * (b - j)
         a = a + 1:         b = b - 1
    Next
    If n Mod 2 Then Cells(n \ 2 + 1, n \ 2 + 1) = n * n
End Sub
Sướng quá cuối cùng cũng làm được bài đếm số hậu trên bàn cờ rồi hihi, các cao thủ trên diễn đàn xem code và cho ý kiếm nha, xin cảm ơn, có file đính kèm
Không hiểu code đó dùng để làm gì luôn. Chắc cao thủ mới hiểu được +-+-+-+
 
Upvote 0
tui làm mấy bài trên là ứng dụng vài vòng for cho tốt thôi, với lại tôi muốn học cách truyền tham số mảng vào hàm VBA , chỉ có vậy thôi,mỗi khi bạn viết bài nào đó thì bạn đã có thêm 1 tí tư duy cho mình rồi đó, còn ứng dụng thì chắc chắn sẽ có
 
Upvote 0
Vài bài thuật toán thực hành vòng lập for,
http://www.mediafire.com/?bls22f7bqo4xj74 không hiểu sao mà tôi up file này lên diễn đàn không được nó là file rar có 606k thôi
 
Upvote 0
bài mới không nhiều , mà ngồi không cũng buồn nên viết bài bài tập vòng For để học hỏi thêm VBA
Bài này là tô màu các số nguyên tô trong 1 dãy số
PHP:
Sub nhap(A() As Long, n As Integer)
      Dim i, j As Integer
    Randomize
    n = InputBox("nhap so nguyen duong n", "Nhap")
    For i = 1 To n
        For j = 1 To n
           A(i, j) = Round(Rnd * 100)
        Next j
     Next i
End Sub

PHP:
Sub xuat(A() As Long, n As Integer)
    Dim i, j As Integer
     For i = 1 To n
        For j = 1 To n
           Range("A1").Offset(i, j).Value = A(i, j)
          If (ISPRIME_NUMBER(A(i, j)) = True) Then
                Range("A1").Offset(i, j).Font.Color = -16776961
                Range("A1").Offset(i, j).Font.Size = 12
                Range("A1").Offset(i, j).Font.Bold = True
           End If
        Next j
     Next i
End Sub


PHP:
Function ISPRIME_NUMBER(n As Long, Optional i As Long = 2) As Boolean
      If (n < 2) Then
                           ISPRIME_NUMBER = False
                   Exit Function
      ElseIf ((n < 4) Or (i > Sqr(n))) Then
                           ISPRIME_NUMBER = True
                   Exit Function
      ElseIf (n Mod i = 0) Then
                          ISPRIME_NUMBER = False
                  Exit Function
      Else
                      ISPRIME_NUMBER = ISPRIME_NUMBER(n, i + 1)
   End If
End Function

Chương trình chính
PHP:
Private Sub CommandButton1_Click()
Dim A(100, 100) As Long
Dim n As Integer
Range("A1:Z100").Clear
Call nhap(A(), n)
Call xuat(A(), n)
End Sub
 
Upvote 0
Bài tập vòng lặp

Em có bài toán tính lặp như sau:
Tính giá trị min của hàm: F=3X1^3+2X1^2+4X2^2-12X2+8
Với các điều kiện ràng buộc sau: X1^2-3X2+1<=2 và X1-2X2<=5
Yêu cầu bài toán là tìm giá trị MinF bằng cách dùng hàm tạo số ngẫu nhiên sau đó sau n vòng lặp sẽ tìm ra minF sau n lần này.
(Không dùng Solver)
Em cám ơn.
Em nghĩ thuật toán như sau:
1.Khởi tạo bộ số (X1,X2) ngẫu nhiên
2. Qua n lần lặp sẽ tính và so sánh F và các điều kiện ràng buộc
3.Thoả mãn kết quả => MinF
Nhưng e làm mà không được.
 
Upvote 0
Vòng lặp For...Next

Nhập 1 giá trị N. Cho biết có bao nhiêu số nguyên tố trong dãy số 1,2,…,N. Cho hiển thị các số nguyên tố đó.

=> Câu này mình phải làm như thế nào đây mọi người. Mình thử dùng vòng lặp For...Next với hàm Select Case nhưng không dùng được.
 
Upvote 0
Web KT
Back
Top Bottom