Tìm mảng trong chuỗi (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

conghoangxd037

Thành viên chính thức
Tham gia
16/1/13
Bài viết
54
Được thích
2
Hiện em đang có chuỗi như sau:
ví dụ: string= "0.3,2*0.2,3*0.5,4*0.6" . Giờ em muốn đưa các số liệu này thành 1 mảng:
- Mảng 1 (0.3,0.2,0.2,0.5,0.5,0.5,0.6,0.6,0.6,0.6) ( ví dụ 3*0.5 thì được 3 lần trong mảng là 0.5,0.5,0.5)
Ở chuỗi đầu tiên thì 0.3 thì hiểu là 1*0.3
Mong mấy cao thủ giúp em tìm thuật toán này với.
 
Giải thuật:

Tách ra theo dấu phẩy, thành nhiều vế.
Mỗi vế tách ra theo dấu sao, thành 2 phần. Nếu vế nào tách ra chỉ được 1 phần thì thêm 1 vào làm phần đầu
Ghi lại mảng, dùng phần thứ nhất để ghi số lần cho phần thứ hai.

Cách bạn đưa ví dụ ra có thể hiểu là: vế thứ nhất hệ sô 1, vế thứ 2 hệ số 2, vế thứ 3 hệ sô 3, ...
Khi cho ví dụ thì chịu khó suy nghĩ một chút để tránh sự ngẫu nhiên trở thành hiểu lầm.
 
Upvote 0
Giải thuật:

Tách ra theo dấu phẩy, thành nhiều vế.
Mỗi vế tách ra theo dấu sao, thành 2 phần. Nếu vế nào tách ra chỉ được 1 phần thì thêm 1 vào làm phần đầu
Ghi lại mảng, dùng phần thứ nhất để ghi số lần cho phần thứ hai.

Cách bạn đưa ví dụ ra có thể hiểu là: vế thứ nhất hệ sô 1, vế thứ 2 hệ số 2, vế thứ 3 hệ sô 3, ...
Khi cho ví dụ thì chịu khó suy nghĩ một chút để tránh sự ngẫu nhiên trở thành hiểu lầm.

Về lý thuyết là như vậy, tuy nhiên để thực hiện chúng thì hơi khó khăn cho bạn ấy. Thôi thì để tôi làm một hàm tổng quát cho bạn ấy xem luôn:

1) Về cấu trúc chuỗi số:

string= "0.3, 2*0.2, 3*0.5, 4*0.6"

- Tôi gọi các số màu đỏ là Thừa số 1 và các số sau dấu sao (*) là Thừa số 2

- Phải đảm bảo rằng Thừa số 1 phải luôn luôn là 1 số NGUYÊN DƯƠNG (nếu có số lẽ nó tính sai ráng chịu) và luôn luôn đứng trước dấu sao (*).

- Dấu phân cách giữa các mục phải là dấu phẩy (,)

- Có khoảng trắng (space) hay không cũng không ảnh hưởng đến công thức, khi ta viết chuỗi số, nên có dấu cách khoảng để tránh nhầm lẫn.

2) Về hàm tự tạo:

Mã:
Function StringSplitting(ByVal Series As String, _
                Optional ByVal IsString As Boolean)
                
    Dim Asterisk As Long, Factor1 As Long, Factor2 As Double, _
        c As Long, i As Long, n As Long, _
        NumItm As Variant, SplitArr As Variant, SeriesArr()
        
        Series = Replace(Series, " ", "")
        
        SplitArr = Split(Series, ",")
    
    For i = LBound(SplitArr) To UBound(SplitArr)
        NumItm = SplitArr(i)
        If IsNumeric(NumItm) Then
            ReDim Preserve SeriesArr(0 To n)
            SeriesArr(n) = Val(NumItm)
            n = n + 1
        Else
            Asterisk = InStr(NumItm, "*")
            Factor1 = Val(NumItm) - 1
            Factor2 = Right(NumItm, Len(NumItm) - Asterisk)
            For c = n To n + Factor1
                ReDim Preserve SeriesArr(0 To n)
                SeriesArr(n) = Factor2
                n = n + 1
            Next
        End If
    Next
    
    If n Then
        If IsString Then
            StringSplitting = Join(SeriesArr, ", ")
        Else
            StringSplitting = SeriesArr
        End If
    End If
    
End Function

Hàm trên khi muốn kết quả trả về là một mảng, thì mảng này là mảng 1 chiều chạy từ 0 đến n, nên khi tính toán cần phải nắm rõ điều này.

3) Về cách thực hiện:

Mã:
Sub Test()
    Dim s As String, arr
    s = "0.1, 0.15, 0.3, 2*0.2, 3*0.5, 4*0.6"
    [COLOR=#0000ff]''Neu muon ket qua la mot String:[/COLOR][COLOR=#ff0000]
    MsgBox StringSplitting(s, [/COLOR][COLOR=#800080][B]True[/B][/COLOR][COLOR=#ff0000])
    [/COLOR][COLOR=#0000ff]''Neu muon ket qua la mot Array (1D):[/COLOR][COLOR=#ff0000]
    arr = StringSplitting(s)[/COLOR]
    Sheet1.Range("A1").Resize(, UBound(arr)+1) = arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom