Sắp xếp thứ tự tên ?

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị ^^
Hiện tại em đang gặp một bài như sau nhưng chưa có ý tưởng gì cho bài đó cả nhưng mà thời hạn nộp của em nó gần hết rồi . Mong các anh giúp em viết một đoạn code đơn giản , dễ hiểu (dùng vòng lặp và hàm split)) để giải quyết nó. Rồi em sẽ học hỏi nội dung code sau ạ ^^
Đề bài:
Sắp xếp cột Họ và tên theo đúng thứ tự alphabet của tiếng Việt (tên Nguyễn Văn An đứng trước Nguyễn Văn Bình; tên Nguyễn Văn Bình đứng sau Nguyễn Tất Bình, …). Kết quả lưu vào một sheet tên là xap_sep. Ví dụ sắp xếp sau đây là đúng :
  1. Nguyễn Văn An
  2. Nguyễn Tất Bình
  3. Nguyễn Văn Bình
  4. Trần Tất Bình
(cách sắp xếp alphabet tiếng Việt : ưu tiên tên đầu tiên, sau đó xét chuỗi họ và tên đệm)
 
Lần chỉnh sửa cuối:
Gợi ý thuật toán so sánh đơn giản
Tạo một từ điển chuẩn bao gồm các ký tự Unicode và La tinh cùng với thứ tự tương ứng cho mục đích so sánh (Có thể dùng chuỗi (aáàảãạăắằẳẵặâấầẩẫậbc...) và truy xuất bằng hàm InStr hoặc dùng Dictionary...)

So sánh 2 ký tự
  • Nếu 2 ký tự cùng xuất hiện trong thư viện: Truy xuất thứ tự của 2 ký tự và so sánh với nhau
  • Nếu 1 ký tự xuất hiện trong thư viện và 1 ký tự không xuất hiện trong thư viện: So sánh ký tự không xuất hiện trong thư việc với 1 ký tự La tinh bất kỳ trong thư viện
  • Nếu cả 2 ký tự không xuất hiện trong thư viện: So sánh 2 ký tự với nhau
So sánh 2 chuỗi
  • So sánh 2 chuỗi bằng cách so sánh từng cặp ký tự ở cùng vị trí trên 2 chuỗi từ đầu chuỗi đến cuối chuỗi
 
Upvote 0
Code trong Module2 có 2 cái sai. Thứ nhất là mảng có 11 phần tử nên phải có To 10 và To 11 chứ không phải là To 8 và To 9. Sai thứ 2 là j chạy từ i+1 chứ không phải chạy từ 2. Chạy từ 2 là thuật toán sai.

Phải là

Mã:
Sub Test()
Dim i As Long, j As Long, min
Dim A As Range
Dim Arr()
    Set A = Range("A17:A27")
    Arr = A.Value
 
    For i = 1 To 10
        For j = i + 1 To 11
            If Arr(j, 1) < Arr(i, 1) Then
                min = Arr(j, 1)
                Arr(j, 1) = Arr(i, 1)
                Arr(i, 1) = min
            End If
        Next
    Next
 
    Range("B17:B27").Value = Arr
End Sub

hoặc

Sub Test()
Dim i As Long, j As Long, min
Dim A As Range
Dim Arr()
    Set A = Range("A17:A27")
    Arr = A.Value
 
    For i = 1 To UBound(Arr, 1) - 1
        For j = i + 1 To UBound(Arr, 1)
            If Arr(j, 1) < Arr(i, 1) Then
                min = Arr(j, 1)
                Arr(j, 1) = Arr(i, 1)
                Arr(i, 1) = min
            End If
        Next
    Next
 
    Range("B17:B27").Value = Arr
End Sub


Trước hết ta thống nhất với nhau là chỉ xét chuỗi các ký tự có mã >= 32 (dấu cách) và <= 127. So sánh 2 chuỗi thực ra cũng là so sánh 2 ký tự lần lượt. Cụ thể như sau:
1. So sánh 2 ký tự. Ký tự nào có mã nhỏ hơn thì nhỏ hơn.

2. So sánh 2 chuỗi. Hai chuỗi a và b được so sánh như sau:
- gọi các ký tự lần lượt của chuỗi a là a1, a2, ..., an, còn các ký tự của b là b1, b2, ..., bm
- so sánh a1 và b1. Nếu a1 < b1 thì a < b và kết thúc việc so sánh. Tương tự khi a1 > b1 thì a > b. Nếu a1 = b1 thì so sánh a2 và b2. Nếu vẫn chưa kết luận được chuỗi nào lớn hơn thì cứ tiếp tục sẽ tới lúc cặp ký tự cuối cùng được so sánh là (an, bn) và an = bn. Nếu bn cũng là ký tự cuối của b, tức m = n, thì kết luận là 2 chuỗi bằng nhau, tức a = b (2 chuỗi có cùng số ký tự và tất cả các ký tự ở vị trí tương ứng đều bằng nhau) Nếu m > n thì chuỗi b > a (nói nôm na thì chuỗi a là "đoạn đầu" của chuỗi b)

Vd.
a = "Nguyễn An", b = "Nguyễn An". Trường hợp an = bn với n = 1, 2, ... -> a = b

a = "Nguyễn An", b = "Nguyễn Anh". Trường hợp an = bn với n = 1, 2, ... và m > n -> b > a

Nói nôm na thì khi so sánh 2 chuỗi ta so sánh từng cặp ký tự ở cùng vị trí cho tới khi hoặc 2 ký tự đó không bằng nhau hoặc vị trí so sánh là ở cuối của một chuỗi. Nếu đó cũng là cuối của chuỗi thứ 2 thì 2 chuỗi bằng nhau, ngược lại thì chuỗi có nhiều ký tự hơn sẽ lớn hơn.
Dạ vâng ạ ! Em đã đọc bài của anh rồi ^^ . Đúng là em có bất cẩn lúc mà tạo module 2 thật ^^ (cái sai rất nhiều ngày của em đã được anh lôi ra và khắc phục ) . Em cảm ơn anh nhiều :> . Thật ra bài này em chỉ muốn sắp xếp theo tiếng anh thôi nhưng mà để tiếng việt cho nó tổng quát (lúc nào em thực sự cần hiểu cơ chế của sắp xếp tiếng việt thì em sẽ lôi bài này lên sau ^^)
Em cảm ơn mọi người nhiều .
Cảm ơn mọi người vì đã dành thời gian và tâm trí để giúp em :>
 
Upvote 0
Web KT

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

Back
Top Bottom