Code xử lý chuỗi ký tự

Trạng thái
Không mở trả lời sau này.

Euler

Administrator
Thành viên BQT
@Euler a) và b) nếu gần nhau thì tương đương (anh em); i) và ii) cũng vậy nhưng "a)" rồi đến "i)" thì "a)" là cha của "i)" và ngược lại.
Mơ hồ lắm. Có chuyển được hêt các thể loại về một kiểu a) cho mình thì chuyển.
 

BKKBG

Yêu THVBA nhất
Tài liệu không có chuẩn. Chỉ riêng sử dụng list của word, đó đã là bài toán để giải quyết rồi.
Bạn cần đăng nhập để thấy hình ảnh

Bây giờ lại thêm tình huống người dùng tự ý gõ thò thụt, hay căn lề văn bản, và phải hiểu được đấy là ý đồ tạo thành list, quả là không dễ chơi.
Tình được thò thụt so với căn lề trái thì sao? Vẫn phải chạy về bên phải và xác định đó có phải là từ khóa item hay không? Do đó mà bác Euler muốn chuẩn hóa tất cả các thể loại về a) để dễ bề thuật toán cho phía sau.
Một bài toán không có chuẩn, tùm lum, thì đầu tiên em nghĩ phải tìm cách chỉnh cho nó chuẩn lại đã.
 

BKKBG

Yêu THVBA nhất
Nếu theo tài liệu trong topic này thì nó đang có quy luật.
Bạn cần đăng nhập để thấy hình ảnh

Vậy phiền bên phía ra yêu cầu, đưa ra file demo cho các tình huống mà quý vị nêu người ta gõ dấu cách thò thụt như nào, để anh em có cơ sở phán đoán cho được chính xác.
 

mathvn

Yêu THVBA
Nếu theo tài liệu trong topic này thì nó đang có quy luật.
Bạn cần đăng nhập để thấy hình ảnh

Vậy phiền bên phía ra yêu cầu, đưa ra file demo cho các tình huống mà quý vị nêu người ta gõ dấu cách thò thụt như nào, để anh em có cơ sở phán đoán cho được chính xác.
Để bài toán được đơn giản hơn, tôi chỉ nhờ giải quyết tình huống câu 1 người dùng đánh thủ công, câu 2 họ dùng list. Các lỗi đánh máy tôi sẽ tự fix. Dấu hiệu mỗi item là trước mặt có tab hoặc xuống dòng (có 2 hay 3 trường hợp trong thực tế tôi quên ghi lại) hoặc xuống dòng cộng cách. Có một loại nhiều item trên 1 dòng, 1 loại mỗi item có một dòng. Trong các item có thể có nhiều đoạn.
 

NhanSu

SMod
Thành viên BQT
@Euler Code của mình chưa hoàn chỉnh, post để các bạn tham khảo vì mình không có thời gian tham gia. Mình chưa làm ListEX do không kịp thời gian nhưng việc xử lý cũng chỉ thêm vài bước thôi. Mình cũng không thụt lề vì không rõ đây có phải yêu cầu bắt buộc không. Code mình đã xét trường hợp câu hỏi có nhiều dấu xuống dòng. Mình đã sửa "Cau 1" thành "Câu 1" (nếu Cau 1 mới đúng thì sửa lại Const trong code). Mình cũng chưa test các lỗi có thể xảy ra.
- Bước 1: SaveAs file Word thành plain text.
- Bước 2: Mở file bằng Notepad, dùng chức năng Replace (Ctrl-H) thay ký tự tab bằng một chuỗi không có trong văn bản, ví dụ "tuhocvba.net".
- Bước 3: Copy vào Excel rồi chạy code:
Mã:
Option Explicit
Const c1 As String = ")"
Const c2 As String = "."
Const c3 As String = "\begin"
Const c4 As String = "\end"
Const c5 As String = "%========>tuhocvba.net>=========%"
Const c6 As String = "tuhocvba.net"

Function CheckLvl(s As String, s1 As String) As Long
    Dim n&, k&, i&
    Static Dic As Dictionary
    If Dic Is Nothing Then
        Set Dic = New Dictionary
        Dic.CompareMode = TextCompare
        Dic.Add "a", 3
        Dic.Add "b", 3
        Dic.Add "c", 3
        Dic.Add "d", 3
        Dic.Add ChrW(273), 3
        Dic.Add "e", 3
        Dic.Add "f", 3
        Dic.Add "g", 3
        Dic.Add "h", 3
      
        Dic.Add "i", 4
        Dic.Add "ii", 4
        Dic.Add "iiii", 4
        Dic.Add "iv", 4
        Dic.Add "v", 4
        Dic.Add "vi", 4
        Dic.Add "vii", 4
        Dic.Add "viii", 4
        Dic.Add "ix", 4
        Dic.Add "x", 4
      
      
    End If
    Do While Left(s, Len(c6)) = c6
        s = Right(s, Len(s) - Len(c6))
    Loop
    s = Application.WorksheetFunction.Trim(Application.WorksheetFunction.Clean(s))
    If InStr(s, "Câu h" & ChrW(787) & "i ") = 1 Then
        If IsNumeric(Mid(s, 9, 1)) Then CheckLvl = 1 Else CheckLvl = 0
    ElseIf InStr(s, "Câu ") = 1 Then
        If IsNumeric(Mid(s, 5, 1)) Then CheckLvl = 1 Else CheckLvl = 0
    Else
        i = InStr(s, c1)
        k = InStr(s, c2)
        If (k > 0 And i > k) Or (i = 0) Then i = k
        If i > 0 Then
            s1 = Left(s, i - 1)
            If IsNumeric(s1) Then
                CheckLvl = 2
            ElseIf Dic.Exists(s1) Then
                CheckLvl = Dic.Item(s1)
            End If
        Else
            CheckLvl = 0
        End If
    End If
              
      
End Function

Sub Convert()
    Dim r As Range, arr(), kq(), arrS
    Dim n&, i&, j&, k&, LastLvl&
    Dim LastString$, s$, s1$
    Set r = Range("A1").CurrentRegion
    arr = r
    n = UBound(arr, 1)
    ReDim kq(1 To n * 2, 1 To UBound(arr, 2))
    arrS = Array("{cau}", "{enumerate}", "\item ")
  
    LastLvl = -1
    For i = 1 To n
        s = arr(i, 1)
        k = CheckLvl(s, s1)
        If k = 1 Then
            If j > 0 Then
                kq(j + 1, 1) = c4 & arrS(0)
                kq(j + 2, 1) = c5
                j = j + 2
            End If
            j = j + 1
            kq(j, 1) = c3 & arrS(0)
            LastLvl = k
      
        ElseIf k > 1 Then
            If k = LastLvl Then
                j = j + 1
                kq(j, 1) = arrS(2) & Right(s, Len(s) - Len(s1) - 1)
            ElseIf k > LastLvl Then
                kq(j + 1, 1) = c3 & arrS(1)
                kq(j + 2, 1) = arrS(2) & Right(s, Len(s) - Len(s1) - 1)
                j = j + 2
            Else
                kq(j + 1, 1) = c4 & arrS(1)
                kq(j + 2, 1) = arrS(2) & Right(s, Len(s) - Len(s1) - 1)
                j = j + 2
            End If
            LastLvl = k
        Else
            j = j + 1
            kq(j, 1) = arr(i, 1)
        End If
    Next
    j = j + 1
    kq(j, 1) = c4 & arrS(0)
  
    Range("M1").Resize(j, UBound(arr, 2)).Value = kq
End Sub
 
Để bài toán được đơn giản hơn, tôi chỉ nhờ giải quyết tình huống câu 1 người dùng đánh thủ công
1- Bạn cho xin file demo đánh thủ công như thế nào.
Những người ở đây không hiểu chuyên môn của bạn, vì vậy trình bày dễ hiểu để ngay cả những người không có chuyên môn hiểu bạn muốn gì, code cho chính xác là điều quan trọng.
Chẳng hạn dựa vào danh sách bạn đưa ra thì @NhanSu có lẽ đang code theo hướng a) , b) , c) mặc định là cha của i) ii)
trong khi đó trên word thì đây là hai kiểu list khác nhau và bình đẳng. i) cũng có thể là cha của a). Còn tùy thuộc vào cách gõ của người dùng. Nhưng tôi nghĩ chúng ta có thể thống nhất với nhau rằng, cái nào thò ra ngoài thì là cha của đứa thụt vào trong.

2-Tôi nghĩ nhận thức của tôi là đúng, nếu sai hãy phản hồi lại.
3-Phải xác định được dấu hiệu của một item. Từ đầu topic tới giờ nói là (tôi tạm không nói tới phía trước là tab hay dấu xuống dòng nhé): 1/, 1-, 1. hay a/, a-, a., hay a)
Ngoài ra tôi đang có băn khoăn rằng: Liệu người ta còn sử dụng:
1.
1.1
1.1.1 hay không?

Phải làm rõ toàn bộ các điều kiện trước khi code để tránh việc code trở thành lãng phí.

Nếu như bạn cũng có thể chuẩn hóa input đầu vào luôn, item chỉ có môt dạng cấu trúc như là a) thì người code sẽ nhanh chóng đi vào code chính. Nếu như bạn không làm được chuẩn hóa này, tôi đề xuất: ở mỗi dạng item lấy ra 20 bạn. Không biết bạn gõ đề như thế nào, chứ một câu hỏi mà có tới 20 ý đã là kinh lắm rồi đấy.
Khi đó ta đưa các dạng này vào bộ dữ liệu nhận dạng item:

1) ~ 20)
a) ~ t)
i) ~ xx)
Có thể thay dấu ) thành các dấu - hay /.
Vậy bạn có đồng ý đề xuất này hay không?

Tôi tán thành ý kiến với bác Euler coi mức độ thò thụt làm cơ sở xác định cha-con.
 

mathsdongthap

Yêu THVBA
1- Bạn cho xin file demo đánh thủ công như thế nào.
Những người ở đây không hiểu chuyên môn của bạn, vì vậy trình bày dễ hiểu để ngay cả những người không có chuyên môn hiểu bạn muốn gì, code cho chính xác là điều quan trọng.
Chẳng hạn dựa vào danh sách bạn đưa ra thì @NhanSu có lẽ đang code theo hướng a) , b) , c) mặc định là cha của i) ii)
trong khi đó trên word thì đây là hai kiểu list khác nhau và bình đẳng. i) cũng có thể là cha của a). Còn tùy thuộc vào cách gõ của người dùng. Nhưng tôi nghĩ chúng ta có thể thống nhất với nhau rằng, cái nào thò ra ngoài thì là cha của đứa thụt vào trong.

2-Tôi nghĩ nhận thức của tôi là đúng, nếu sai hãy phản hồi lại.
3-Phải xác định được dấu hiệu của một item. Từ đầu topic tới giờ nói là (tôi tạm không nói tới phía trước là tab hay dấu xuống dòng nhé): 1/, 1-, 1. hay a/, a-, a., hay a)
Ngoài ra tôi đang có băn khoăn rằng: Liệu người ta còn sử dụng:
1.
1.1
1.1.1 hay không?

Phải làm rõ toàn bộ các điều kiện trước khi code để tránh việc code trở thành lãng phí.

Nếu như bạn cũng có thể chuẩn hóa input đầu vào luôn, item chỉ có môt dạng cấu trúc như là a) thì người code sẽ nhanh chóng đi vào code chính. Nếu như bạn không làm được chuẩn hóa này, tôi đề xuất: ở mỗi dạng item lấy ra 20 bạn. Không biết bạn gõ đề như thế nào, chứ một câu hỏi mà có tới 20 ý đã là kinh lắm rồi đấy.
Khi đó ta đưa các dạng này vào bộ dữ liệu nhận dạng item:

1) ~ 20)
a) ~ t)
i) ~ xx)
Có thể thay dấu ) thành các dấu - hay /.
Vậy bạn có đồng ý đề xuất này hay không?

Tôi tán thành ý kiến với bác Euler coi mức độ thò thụt làm cơ sở xác định cha-con.
Đã có file mẫu rồi bạn. Link đầu tiên ah.
Mình chỉ hy vọng xử lý được như file mẫu. Các trường hợp phân cấp tôi tự xử lý được.
Kỳ vọng của tôi với đầu vào là word ra là word hay Tex. Tôi sợ chuyển về string xử lý bị mất đi một số thuộc tín của word.
 
Sửa lần cuối:
Đã có file mẫu rồi bạn. Link đầu tiên ah.
Mình chỉ hy vọng xử lý được như file mẫu. Các trường hợp phân cấp tôi tự xử lý được.
File mẫu của bạn không có trường hợp ngoại lệ nào hết. Tất cả đều sử dụng list. Như vậy nếu code mà đưa cái file mẫu ra output như bạn muốn là được? Sau này nếu phản biện, các file phải tuân thủ theo cấu trúc như file mẫu bạn đưa ra có đúng không?
Có nghĩa là tôi không chấp nhân việc không sử dụng list mà sử dụng dấu tab hay khoảng trắng để thò thụt đầu dòng nữa, hiểu như vậy có đúng không?
 

Euler

Administrator
Thành viên BQT
Trong file mẫu vẫn có những chỗ chưa dùng list.
Câu 1:
Bạn cần đăng nhập để thấy đính kèm

Xin hỏi tác giả @mathvn là bên đưa yêu cầu, tại sao đây lại là một item.
Giả sử như chỗ này là ă) phía trước có dấu tab.
Hoặc: căn) phía trước có dấu tab.
Thì có coi đó là một item hay không?
Hoặc a1) phía trước có dấu tab, thì có coi đó là một item hay không?
 

mathsdongthap

Yêu THVBA
Trong file mẫu vẫn có những chỗ chưa dùng list.
Câu 1:
Bạn cần đăng nhập để thấy đính kèm

Xin hỏi tác giả @mathvn là bên đưa yêu cầu, tại sao đây lại là một item.
Giả sử như chỗ này là ă) phía trước có dấu tab.
Hoặc: căn) phía trước có dấu tab.
Thì có coi đó là một item hay không?
Hoặc a1) phía trước có dấu tab, thì có coi đó là một item hay không?
Chính xác đó là khó khăn của tôi. [a-z,0-9]{1,2}) là trước là xuống dòng hoặc tab là item.
 

mathsdongthap

Yêu THVBA
File mẫu của bạn không có trường hợp ngoại lệ nào hết. Tất cả đều sử dụng list. Như vậy nếu code mà đưa cái file mẫu ra output như bạn muốn là được? Sau này nếu phản biện, các file phải tuân thủ theo cấu trúc như file mẫu bạn đưa ra có đúng không?
Có nghĩa là tôi không chấp nhân việc không sử dụng list mà sử dụng dấu tab hay khoảng trắng để thò thụt đầu dòng nữa, hiểu như vậy có đúng không?
Bạn xem không kĩ rồi. Trong đó có ngoại lệ, có gõ sai, các list không theo qui luật. Bạn xem lại đúng thế không.
 

mathsdongthap

Yêu THVBA
Trong file mẫu vẫn có những chỗ chưa dùng list.
Câu 1:
Bạn cần đăng nhập để thấy đính kèm

Xin hỏi tác giả @mathvn là bên đưa yêu cầu, tại sao đây lại là một item.
Giả sử như chỗ này là ă) phía trước có dấu tab.
Hoặc: căn) phía trước có dấu tab.
Thì có coi đó là một item hay không?
Hoặc a1) phía trước có dấu tab, thì có coi đó là một item hay không?
Nó là item vì nó là một ý hỏi của câu.
 

Euler

Administrator
Thành viên BQT
Nó là item vì nó là một ý hỏi của câu.
Máy tính không hiểu thế nào là một ý của câu hỏi.
Nó phải có logic rõ ràng.
Ví dụ: tab + số + )
Hoặc tab + chữ + ) thì phải quy định chữ là chữ nào. Bao nhiêu chữ.
Chứ VBA biết cái gì là ý của câu hỏi, khái niệm ý của câu hỏi là một khái niệm mơ hồ, máy tính không hiểu được.
 

tuhocvba

Administrator
Thành viên BQT
Tôi biết mọi người đều đang nóng lòng giải quyết vấn đề. Tuy nhiên cần bình tĩnh xác nhận với thái độ nhã nhặn.
1. Không code gì cho tới khi xác nhận xong.
2. Khi xác nhận, dùng từ ngữ nhẹ nhàng, hình ảnh trực quan.

Về phía yêu cầu:
1. Cần khoanh vùng, hoặc tô đỏ vào vị trí mà anh chị cho là đặc biệt, cần xử lý. Ví dụ, không sử dụng list mà gõ tay.
2. Những nơi này cần làm rõ logic, vì vậy phía code khi đặt ra các câu hỏi không gì khác là để việc code được trơn tru, mong anh chị lý giải và hợp tác cũng như lượng thứ nếu khi xác nhận, mọi người có sử dụng ngôn từ chưa được thân thiện. Mục đích không gì hơn là đưa ra output chính xác, tránh trường hợp hiểu sai, hay bỏ sót trường hợp, dẫn tới kết quả thiếu chính xác.
 

mathvn

Yêu THVBA
Máy tính không hiểu thế nào là một ý của câu hỏi.
Nó phải có logic rõ ràng.
Ví dụ: tab + số + )
Hoặc tab + chữ + ) thì phải quy định chữ là chữ nào. Bao nhiêu chữ.
Chứ VBA biết cái gì là ý của câu hỏi, khái niệm ý của câu hỏi là một khái niệm mơ hồ, máy tính không hiểu được.
Các item được xác định bởi 1 trong các trường hợp sau:
1) Xuống dòng + cách hoặc không + số 1,2,.. hoặc số la mã + một trong các dấu .,/, ), :
2) tab + cách hoặc không + số 1,2,.. hoặc số la mã +một trong các dấu .,/, ), :
3) Xuống dòng + cách hoặc không +chữ cái nhỏ + số 1,2,.. hoặc số la mã +một trong các dấu .,/, ), :
4) tab + cách hoặc không +chữ cái nhỏ + số 1,2,.. hoặc số la mã +một trong các dấu .,/, ), :
Cấp độ 1: Câu + số -> \begin{cau}..
Cấp độ 2: Số 1,2,3 + một trong các dấu .,/, ), :
Cấp độ 3: Chữ cái nhỏ + một trong các dấu .,/, ), :
Cấp độ 4: Số la mã i, ii,.... + một trong các dấu .,/, ), : hoặc chữ cái nhỏ + số 1, 2, 3,..+ một trong các dấu .,/, ), :
Cấp độ 2, 3, 4 -> enumerate nếu mỗi dòng nhiều nhất 1 item, ->{listEX}[số] nếu có 1 hoặc nhiều dòng liên tiếp chứa nhiều item. [n] số item lớn nhất trên các dòng đang xét.
Mỗi item có thể là 1, một đoạn hoặc nhiều đoạn.
Đây là các thông tin mà tôi có thể mô tả được.
 

tuhocvba

Administrator
Thành viên BQT
Nhờ @NhanSu code hàm chuyển đổi số la mã thành thập phân.
INPUT: IV
OUTPUT @LM4@
Hoặc:
INPUT: V
OUTPUT: @LM5@
Tham khảo:
Bảng số la mã và một số quy tắc chuyển đổi.
1. Bảng số la mã

I V X L C D M
1 5 10 50 100 500 1000

2. Quy tắc chuyển đổi
a/ Số thập phân được cấu thành từ các chữ số đơn lẻ. Ví dụ: 1989 được ghép bởi 1,9,0,8. Còn đối với cách biểu diễn chữ số la mã thì mỗi chữ số khác 0 ở mỗi hàng ( hàng đơn vị, hàng chục, hàng trăm,…) sẽ được biểu diễn bởi 1 kí tự số la mã. 1000 = M, 900 = CM, 0 không được biểu diễn, 8 = VIII. 1908 = MCMVIII

b/ “I”, “X”, “C”, “M” có thể được xuất hiện liên tiếp (cạnh nhau) tối đa 3 lần. Tuy nhiên, các kí tự này có thể xuất hiện nhiều hơn. (Ví dụ: XXXIX). Các kí tự “D”, “L”, “V” không được phép lặp lại.

c/
Chữ số đi sau chữ số khác lớn hơn hoặc bằng thì cộng thêm vào:
VI = V + I = 5 + 1 = 6
LX = L + X = 50 + 10 = 60
XX = X + X = 10 + 10 = 20

Chữ số đi trước chữ số khác lớn hơn thì trừ bớt đi:
IV = V – I = 5 – 1
XL = L – X = 50 – 10 = 40

“I” chỉ có thể bị trừ bởi “V”, “X”. ( IV = V – I = 5 – 1 = 4, IX = X – I = 10 – 1 = 9)
“X” chỉ có thể bị trừ bởi “C”, “L”. ( XC = 100 – 10 = 90, XL = 50 – 10 = 40)
“C” chỉ có thể bị trừ bởi “D” và “M”. (CD = 500 – 100 = 400, CM = 1000)
“V”, “L”, “D” không bao giờ bị trừ.

d/ Nếu thêm 1 dấu gạch ngang trên đầu thì giá trị của nó bằng giá trị hiện tại nhân với 1000
C:
#include<stdio.h>
#include<string.h>
#include "stdlib.h"
#include<conio.h>
void main()
{
    int a[20], len, i = 0, j, k;
    char roman[20];
    printf("Nhap day chu so La Ma(Note: chi su dung I,V,X,L,C,D,M): ");
    gets(roman);
    len = strlen(roman);
    for(i = 0; i < len; i++)
    {
        if(roman[i] == 'I')
            a[i] = 1;
        else if(roman[i] == 'V')
            a[i] = 5;
        else if(roman[i] == 'X')
            a[i] = 10;
        else if(roman[i] == 'L')
            a[i] = 50;
        else if(roman[i] == 'C')
            a[i] = 100;
        else if(roman[i] == 'D')
            a[i] = 500;
        else if(roman[i] == 'M')
            a[i] = 1000;
        else
        {
            printf("\nXin nhap lai day so la ma");
            getch();
            exit(1);
         }
    }
    k = a[len-1];
    for(i = len-1; i > 0; i--)
    {
        if(a[i] > a[i-1])
            k = k - a[i-1];
        else if(a[i] == a[i-1] || a[i] < a[i-1])
            k = k + a[i-1];
    }
    printf("\nGia tri thap phan tuong ung la: %d ", k);
    getch();
}
 

Euler

Administrator
Thành viên BQT
Euler xác nhận code ở #57 khi chuyển sang VBA cho thấy kết quả không đúng. Logic ở các dòng code 38~41 cũng không đúng.
Code dưới đây đã test cho kết quả rất chính xác:
Mã:
Sub test2()
    Dim s As String
    s = "viii"
    MsgBox Arabic(s)
End Sub
Function Arabic(Roman)
    Dim Arabicvalues() As Integer, convertedvalue As Long, currentchar As String * 1
    Dim i As Integer, message As String, numchars As Integer
    Roman = LTrim(RTrim(Roman))
    numchars = Len(Roman)
    
    If numchars = 0 Then    'if arg is null, we're outta here
        Arabic = ""
        Exit Function
    End If
    
    ReDim Arabicvalues(numchars)
    
    For i = 1 To numchars
        currentchar = Mid(Roman, i, 1)
        Select Case UCase(currentchar)
            Case "M": Arabicvalues(i) = 1000
            Case "D": Arabicvalues(i) = 500
            Case "C": Arabicvalues(i) = 100
            Case "L": Arabicvalues(i) = 50
            Case "X": Arabicvalues(i) = 10
            Case "V": Arabicvalues(i) = 5
            Case "I": Arabicvalues(i) = 1
            Case Else
            Arabic = "Sorry, " & Roman & " is not a valid Roman numeral!  "
            Exit Function
        End Select
    Next i
    For i = 1 To numchars - 1
        If Arabicvalues(i) < Arabicvalues(i + 1) Then
            Arabicvalues(i) = Arabicvalues(i) * -1
        End If
    Next i
    For i = 1 To numchars
        Arabic = Arabic + Arabicvalues(i)
    Next i
End Function
Nguồn:
 

NhanSu

SMod
Thành viên BQT
Số La Mã thì MS đã có công thức rồi, chỉ việc áp dụng. Mọi người test chuỗi làm gì cho khổ vì dù sao cũng chỉ là liệt kê các trường hợp thôi.
Mã:
application.roman(num)
application.arabic(txt)
Chú ý nên dùng application.roman thay vì worksheetfunction để bẫy lỗi.
 

PTHhn

Yêu THVBA như điếu đổ
Số La Mã thì MS đã có công thức rồi, chỉ việc áp dụng. Mọi người test chuỗi làm gì cho khổ vì dù sao cũng chỉ là liệt kê các trường hợp thôi.
Mã:
application.arabic(txt)
Chú ý nên dùng application.roman thay vì worksheetfunction để bẫy lỗi.
Có vẻ như arabic chỉ có từ phiên bản Excel 2013, 2016,...
Như vậy với Excel 2010 thì không xài được. Ai kiểm chứng dùm. Nếu đúng như vậy thì việc làm ra hàm tự tạo không phải là không có lý do, code sẽ chủ động hơn khi chia sẻ và mang ra cộng đồng.
Nguồn:
 
Trạng thái
Không mở trả lời sau này.
Top