Tách số trong chuỗi rồi thực hiện phép tính (1 người xem)

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

daivanhung

Thành viên mới
Tham gia
16/11/12
Bài viết
25
Được thích
2
Nghề nghiệp
Kỹ sư Kết Câu XDDD & CN
Em chào các bác.
Em nhờ các bác viết hộ cái function tính tổng các tích của số trong chuỗi như sau:
- chuỗi: "số 1 chuỗi số 2 chuỗi số 3 chuỗi số 4...."
- hàm tính: Tổng tích = số 1 * số 2+ số 3 * số 4.............

Ví dụ e có chuỗi sau: " 2F20 + +++ 3F2 + abc + 4D18 "
hàm sẽ tính được: Tổng tích = 2*20 + 3*2 + 4*18

Em cảm ơn các bác nhé
 
Em chào các bác.
Em nhờ các bác viết hộ cái function tính tổng các tích của số trong chuỗi như sau:
- chuỗi: "số 1 chuỗi số 2 chuỗi số 3 chuỗi số 4...."
- hàm tính: Tổng tích = số 1 * số 2+ số 3 * số 4.............

Ví dụ e có chuỗi sau: " 2F20 + +++ 3F2 + abc + 4D18 "
hàm sẽ tính được: Tổng tích = 2*20 + 3*2 + 4*18

Em cảm ơn các bác nhé
Bạn nên đưa File nên trong đó có dữ liệu giả định và kết quả mong muốn!
 
Upvote 0
Em chào các bác.
Em nhờ các bác viết hộ cái function tính tổng các tích của số trong chuỗi như sau:
- chuỗi: "số 1 chuỗi số 2 chuỗi số 3 chuỗi số 4...."
- hàm tính: Tổng tích = số 1 * số 2+ số 3 * số 4.............

Ví dụ e có chuỗi sau: " 2F20 + +++ 3F2 + abc + 4D18 "
hàm sẽ tính được: Tổng tích = 2*20 + 3*2 + 4*18

Em cảm ơn các bác nhé
Thử hàm này xem sao
Mã:
Public Function Tach(Str)
Dim Tam(), c As Long
ReDim Tam(1 To Len(Str))

Str = Replace(Str, " ", "")

c = 1
Do While c <= Len(Str) - 1
If IsNumeric(Mid(Str, c, 1)) = True Or Mid(Str, c, 1) = "+" Then
Tam(c) = Mid(Str, c, 1)
Else
If IsNumeric(Mid(Str, c, 1)) = False And IsNumeric(Mid(Str, c + 1, 1)) = True Then
Tam(c) = "*"
End If
End If
c = c + 1
Loop

Tach = Evaluate(Replace(Join(Tam), " ", ""))
End Function

Cú pháp: Tach( chuỗi cần tính )
 
Upvote 0
Thử hàm này xem sao
Mã:
Public Function Tach(Str)
Dim Tam(), c As Long
ReDim Tam(1 To Len(Str))

Str = Replace(Str, " ", "")

c = 1
Do While c <= Len(Str) - 1
If IsNumeric(Mid(Str, c, 1)) = True Or Mid(Str, c, 1) = "+" Then
Tam(c) = Mid(Str, c, 1)
Else
If IsNumeric(Mid(Str, c, 1)) = False And IsNumeric(Mid(Str, c + 1, 1)) = True Then
Tam(c) = "*"
End If
End If
c = c + 1
Loop

Tach = Evaluate(Replace(Join(Tam), " ", ""))
End Function

Cú pháp: Tach( chuỗi cần tính )
Tôi thử với chuỗi ví dụ của tác giả (2F20 + +++ 3F2 + abc + 4D18) thì hàm cho kết quả sai.
Kết quả đúng phải là: 118
 
Upvote 0
Thử chuỗi khác vẫn thấy sai bạn ạ!
Đầu bài, chủ thớt có yêu cầu thế này ( phần tô đậm )
Em chào các bác.
Em nhờ các bác viết hộ cái function tính tổng các tích của số trong chuỗi như sau:
- chuỗi: "số 1 chuỗi số 2 chuỗi số 3 chuỗi số 4...."
- hàm tính: Tổng tích = số 1 * số 2+ số 3 * số 4.............

Ví dụ e có chuỗi sau: " 2F20 + +++ 3F2 + abc + 4D18 "
hàm sẽ tính được: Tổng tích = 2*20 + 3*2 + 4*18
Giờ không có file giả định---> nên cũng chưa có căn cứ để xác định nhưng
theo mẫu bạn đưa ra "1z22c + + 12ds2" thì phép tính kết quả sau khi xử lý sẽ là thế nào( Chuỗi phép tính sau khi xử lý )
 
Upvote 0
Đầu bài, chủ thớt có yêu cầu thế này ( phần tô đậm )

Giờ không có file giả định---> nên cũng chưa có căn cứ để xác định nhưng
theo mẫu bạn đưa ra "1z22c + + 12ds2" thì phép tính kết quả sau khi xử lý sẽ là thế nào( Chuỗi phép tính sau khi xử lý )
Bạn thử với chuỗ này xem sao?
12a2 ++ 2a123 tôi dùng hàm của bạn nó ra kết quả là 48
 
Upvote 0
Bạn thử với chuỗ này xem sao?
12a2 ++ 2a123 tôi dùng hàm của bạn nó ra kết quả là 48

OK, lỗi không quét phần tử cuối cùng
Mã:
Public Function Tach(Str)
Dim Tam(), c As Long
ReDim Tam(1 To Len(Str))

Str = Replace(Str, " ", "")

c = 1
Do While c <= Len(Str)'Lỗi chỗ này vì ban đầu định dùng thuật toán khác ( phép tính - 1 )
If IsNumeric(Mid(Str, c, 1)) = True Or Mid(Str, c, 1) = "+" Then
Tam(c) = Mid(Str, c, 1)
Else
If IsNumeric(Mid(Str, c, 1)) = False And IsNumeric(Mid(Str, c + 1, 1)) = True Then
Tam(c) = "*"
End If
End If
c = c + 1
Loop

Tach = Evaluate(Replace(Join(Tam), " ", ""))
End Function
---
Về chuỗi này "1z22c + + 12ds2", ý kiến của bạn thế nào ( Chuỗi phép tính sau khi xử lý )
 
Upvote 0
OK, lỗi không quét phần tử cuối cùng
Mã:
Public Function Tach(Str)
Dim Tam(), c As Long
ReDim Tam(1 To Len(Str))

Str = Replace(Str, " ", "")

c = 1
Do While c <= Len(Str)'Lỗi chỗ này vì ban đầu định dùng thuật toán khác ( phép tính - 1 )
If IsNumeric(Mid(Str, c, 1)) = True Or Mid(Str, c, 1) = "+" Then
Tam(c) = Mid(Str, c, 1)
Else
If IsNumeric(Mid(Str, c, 1)) = False And IsNumeric(Mid(Str, c + 1, 1)) = True Then
Tam(c) = "*"
End If
End If
c = c + 1
Loop

Tach = Evaluate(Replace(Join(Tam), " ", ""))
End Function
---
Về chuỗi này "1z22c + + 12ds2", ý kiến của bạn thế nào ( Chuỗi phép tính sau khi xử lý )
Giờ thì ok rồi! Tuyệt vời!
 
Upvote 0
Cảm ơn bác đã giúp em. Bác giúp e cái function này nhé:
Ví dụ: Chuỗi = "2F20 + 2F10 + 3F13 +...."
Tính: T= 2*20^2 + 2*10^2 +3*10^2 +.....

Em có xem code bác nhưng ko biết làm thế nào để sửa như bài toán này ạ. Thanks bác nhé /-*+//-*+//-*+/
 
Upvote 0
Cảm ơn bác đã giúp em. Bác giúp e cái function này nhé:
Ví dụ: Chuỗi = "2F20 + 2F10 + 3F13 +...."
Tính: T= 2*20^2 + 2*10^2 +3*10^2 +.....

Em có xem code bác nhưng ko biết làm thế nào để sửa như bài toán này ạ. Thanks bác nhé /-*+//-*+//-*+/

Con số 10 tô đỏ ở trên lấy từ đâu ra?
(nếu bạn còn dùng tiếng ngoại - dear, thanks - thì tôi sẽ từ chối không giao thiệp nữa)
 
Upvote 0
E gõ nhầm bác ạ. E sửa lại là
Ví dụ: Chuỗi = "2F20 + 2F10 + 3F13 +...."
Tính: T= 2*20^2 + 2*10^2 +3*13^2 +.....

E xin rút kinh nghiệm ạ. Mong các bác bỏ qua nhé.
 
Upvote 0
Hàm của HungQuoc49 hơi khó sửa. Tôi chỉ cho bạn hàm khác:

Mã:
Function CongTich(ByVal chuoi As String) As Long
Static rx As Object
Dim var1 As Variant
If rx Is Nothing Then
    Set rx = CreateObject("VBScript.Regexp")
    rx.Global = True
    rx.Pattern = "\+\s*([0-9]+)[A-Za-z]([0-9]+)\s*"
End If
For Each var1 In rx.Execute("+" & chuoi & "+")
    CongTich = CongTich + Val(var1.submatches(0)) * Val(var1.submatches(1))
Next var1
End Function

Function CongTichCoMu(ByVal chuoi As String) As Double
Static rx As Object
Dim var1 As Variant
If rx Is Nothing Then
    Set rx = CreateObject("VBScript.Regexp")
    rx.Global = True
    rx.Pattern = "\+\s*([0-9]+)[A-Za-z]([0-9]+)\s*"
End If
For Each var1 In rx.Execute("+" & chuoi & "+")
    CongTichCoMu = CongTichCoMu + Val(var1.submatches(0)) * Val(var1.submatches(1)) * Val(var1.submatches(1))
Next var1
End Function
 
Upvote 0
Cảm ơn bác nhé. Em làm được rồi ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác đã góp ý. Em xin nhận kiểm điểm ạ. Em xin rút kinh nghiệm ạ
 
Upvote 0
Hàm của HungQuoc49 hơi khó sửa. Tôi chỉ cho bạn hàm khác:

Mã:
Function CongTich(ByVal chuoi As String) As Long
Static rx As Object
Dim var1 As Variant
If rx Is Nothing Then
    Set rx = CreateObject("VBScript.Regexp")
    rx.Global = True
    rx.Pattern = "\+\s*([0-9]+)[A-Za-z]([0-9]+)\s*"
End If
For Each var1 In rx.Execute("+" & chuoi & "+")
    CongTich = CongTich + Val(var1.submatches(0)) * Val(var1.submatches(1))
Next var1
End Function

Function CongTichCoMu(ByVal chuoi As String) As Double
Static rx As Object
Dim var1 As Variant
If rx Is Nothing Then
    Set rx = CreateObject("VBScript.Regexp")
    rx.Global = True
    rx.Pattern = "\+\s*([0-9]+)[A-Za-z]([0-9]+)\s*"
End If
For Each var1 In rx.Execute("+" & chuoi & "+")
    CongTichCoMu = CongTichCoMu + Val(var1.submatches(0)) * Val(var1.submatches(1)) * Val(var1.submatches(1))
Next var1
End Function
Anh Vietmini có thể giải thích giúp em ý nghĩa của dòng lệnh:
TongTichCoMu = CongTichCoMu + Val(var1.SubMatches(0)) * Val(var1.SubMatches(1)) * Val(var1.SubMatches(1))
và của phương thức "Execute" được không ạ! Cảm ơn anh!
 
Upvote 0
Anh Vietmini có thể giải thích giúp em ý nghĩa của dòng lệnh:

và của phương thức "Execute" được không ạ! Cảm ơn anh!

Execute là một hàm của Regular Expression. Nó trả về một collection gồm tất cả các chuỗi con mà nó tìm được trong chuỗi đầu vào.
Pattern được định là tìm các chuỗi con khởi đầu bắng "+", và số dấu cách tuỳ ý, tìếp theo là một chuỗi số, kế đó là một ký tự không phải số, tìếp theo là một chuỗi số, và số dấu cách tuỳ ý, kết thúc bằng một "+". Các dấu () trong pattern dùng để bắt các chuỗi con của chuỗi con, trong trường hợp này là chuỗi số thứ nhất và chuỗi số thứ hai.

For each var1... duyệt từng phần tử của collection (tức là từng chuỗi con). submatches(0) và (1) là các chuỗi con của chuỗi con.

(Chuỗi đầu vào cộng với hai dấu "+" ở đầu để chắc ăn là các mẫu ở đầu và cuối chuỗi đều match)
 
Upvote 0
Execute là một hàm của Regular Expression. Nó trả về một collection gồm tất cả các chuỗi con mà nó tìm được trong chuỗi đầu vào.
Pattern được định là tìm các chuỗi con khởi đầu bắng "+", và số dấu cách tuỳ ý, tìếp theo là một chuỗi số, kế đó là một ký tự không phải số, tìếp theo là một chuỗi số, và số dấu cách tuỳ ý, kết thúc bằng một "+". Các dấu () trong pattern dùng để bắt các chuỗi con của chuỗi con, trong trường hợp này là chuỗi số thứ nhất và chuỗi số thứ hai.

For each var1... duyệt từng phần tử của collection (tức là từng chuỗi con). submatches(0) và (1) là các chuỗi con của chuỗi con.

(Chuỗi đầu vào cộng với hai dấu "+" ở đầu để chắc ăn là các mẫu ở đầu và cuối chuỗi đều match)
Em cảm ơn anh nhiều!
 
Upvote 0

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

Back
Top Bottom