Đếm số nguyên âm trong chuỗi kí tư (1 người xem)

Liên hệ QC

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

Conghoai

Thành viên mới
Tham gia
15/11/15
Bài viết
8
Được thích
0
Chào mấy anh chị, em không biết gì về excel ngoài mấy cái hàm đơn giản, mà cô giáo cho em bài tập về nhà mà e không biết sử lý như thế nào, nếu ai biết chỉ giúp em ạ.
Ví dụ ô B3 chứa chuối "corpus"
C3 "corporis"
1) em muốn đếm số nguyên âm trong chuỗi C3 trừ đi số nguyên âm trong chuỗi B3.
2) GIữa 2 nguyên âm cuối "i" và "o" có bao nhiêu phụ âm. Hơi khó hiểu ạ
ở đây là "corporis" thì giữa "i" và "o" có một phụ âm là "r" trong chuỗi "oris"
Cám ơn các anh chị trước.
 
Chào mấy anh chị, em không biết gì về excel ngoài mấy cái hàm đơn giản, mà cô giáo cho em bài tập về nhà mà e không biết sử lý như thế nào, nếu ai biết chỉ giúp em ạ.
Ví dụ ô B3 chứa chuối "corpus"
C3 "corporis"
1) em muốn đếm số nguyên âm trong chuỗi C3 trừ đi số nguyên âm trong chuỗi B3.
2) GIữa 2 nguyên âm cuối "i" và "o" có bao nhiêu phụ âm. Hơi khó hiểu ạ
ở đây là "corporis" thì giữa "i" và "o" có một phụ âm là "r" trong chuỗi "oris"
Cám ơn các anh chị trước.
Giúp bạn ý 1:
PHP:
Public Function Tong(ByVal St As String) As Long
    Dim n(9) As String
    Dim dem As Integer
    Dim j As Long
    Dim k As Long
    Dim i As Integer
    n(0) = "a": n(1) = "i": n(2) = "o": n(3) = "u": n(4) = "e"
    n(5) = "A": n(6) = "I": n(7) = "O": n(8) = "U": n(9) = "E"
    k = Len(St)
    For j = 1 To k
        For i = 0 To 9
            If Mid(St, j, 1) = n(i) Then
                dem = dem + 1

            End If
        Next i
    Next j
    Tong = dem
End Function
 
Lần chỉnh sửa cuối:
Chào mấy anh chị, em không biết gì về excel ngoài mấy cái hàm đơn giản, mà cô giáo cho em bài tập về nhà mà e không biết sử lý như thế nào, nếu ai biết chỉ giúp em ạ.
Ví dụ ô B3 chứa chuối "corpus"
C3 "corporis"
1) em muốn đếm số nguyên âm trong chuỗi C3 trừ đi số nguyên âm trong chuỗi B3.
2) GIữa 2 nguyên âm cuối "i" và "o" có bao nhiêu phụ âm. Hơi khó hiểu ạ
ở đây là "corporis" thì giữa "i" và "o" có một phụ âm là "r" trong chuỗi "oris"
Cám ơn các anh chị trước.
Hàm tự tạo
Cú pháp =NguyenAm(Chuỗi cần tìm, số 1 hoặc khác 1 )
Mã:
Public Function NguyenAm(DL, Loai)
Dim c As Integer, NA1, NA2, i

For c = Len(DL) To 1 Step -1
If InStr("AEIOU", UCase(Mid(DL, c, 1))) Then
i = i + 1
If i = 1 Then NA1 = c
If i = 2 Then NA2 = c
End If
Next c

If Loai = 1 Then
NguyenAm = IIf(i > 1, NA1 - NA2 - 1, "")
Else
NguyenAm = i
End If
End Function
 
Chào mấy anh chị, em không biết gì về excel ngoài mấy cái hàm đơn giản, mà cô giáo cho em bài tập về nhà mà e không biết sử lý như thế nào, nếu ai biết chỉ giúp em ạ.
Ví dụ ô B3 chứa chuối "corpus"
C3 "corporis"
1) em muốn đếm số nguyên âm trong chuỗi C3 trừ đi số nguyên âm trong chuỗi B3.
2) GIữa 2 nguyên âm cuối "i" và "o" có bao nhiêu phụ âm. Hơi khó hiểu ạ
ở đây là "corporis" thì giữa "i" và "o" có một phụ âm là "r" trong chuỗi "oris"
Cám ơn các anh chị trước.
Ý 1 đã có cao nhân chỉ giáo. Ý 2 mình xin mạn phép dùng:
Mã:
Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    .Pattern = "(O\w{1,3}\I)(?![\o])"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
    Rut = Replace(Rut, "A", "")
    Rut = Replace(Rut, "E", "")
    Rut = Replace(Rut, "I", "")
    Rut = Replace(Rut, "O", "")
    Rut = Len(Replace(Rut, "U", ""))
End Function
Nếu chuỗi ở A2, tại B2 = Rut(A2). Nếu thời gian nhiều có thể tổng quát lên thành Rut(A2, B, C) với B và C là nguyên âm cần rút.
 
Lần chỉnh sửa cuối:
Thêm 1 fương án cho bài 1:

PHP:
Option Explicit
Const NA As String = "AIEUOY"
Function HieuNA(Str1 As String, Str2 As String) As Integer
 Const NA As String = "AIEUOY"
 Dim J As Integer, Hai As Integer
 
 For J = 1 To Len(Str1) + Len(Str2)
    If J > Len(Str1) And J > Len(Str2) Then Exit For
    If InStr(NA, UCase$(Mid(Str1, J, 1))) And J <= Len(Str1) Then HieuNA = HieuNA + 1
    If InStr(NA, UCase$(Mid(Str2, J, 1))) And J <= Len(Str2) Then HieuNA = HieuNA - 1
 Next J
End Function
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Đề bài 2 chưa chặt chẽ, ở chỗ: Giữa 2 nguyên âm có thể không có fụ âm nào đã đành
Nhưng còn những trường hợp có vài khoảng trống hay kí số thì sao?
Hàm dười đây xác định khoảng cách giữa 2 nguyên âm cuối của từ hay 1 mệnh đề mà thôi.

Mã:
Function SoFAm(StrC As String)
 Dim J As Integer, BD As Boolean
 
 For J = Len(StrC) To 1 Step -1
    If InStr(NA, UCase$(Mid(StrC, J, 1))) Then
        If Not BD Then
            BD = True
            SoFAm = SoFAm + 1
        Else
            SoFAm = SoFAm - 1
            Exit Function
        End If
    Else
        If BD Then SoFAm = SoFAm + 1
    End If
 Next J
End Function
 
Ý 1 đã có cao nhân chỉ giáo. Ý 2 mình xin mạn phép dùng:
Mã:
Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    .Pattern = "(O\w{1,5}\I)(?![\o])"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
    Rut = Replace(Rut, "A", "")
    Rut = Replace(Rut, "E", "")
    Rut = Replace(Rut, "I", "")
    Rut = Replace(Rut, "O", "")
    Rut = Len(Replace(Rut, "U", ""))
End Function
Nếu chuỗi ở A2, tại B2 = Rut(A2). Nếu thời gian nhiều có thể tổng quát lên thành Rut(A2, B, C) với B và C là nguyên âm cần rút.

Với từ "corporis" theo bài 1, kết quả hàm rut =3
Chủ thớt cho =1: Là 1 phụ âm "r" giữa "i" và "o" của "oris"

---
Theo ý hàm này, có lẽ phải thay \w{1,5}=[^OI]*
 
Lần chỉnh sửa cuối:
Code chuẩn cho ý 2 sẽ là:
Mã:
Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    .Pattern = "(O(?!.*O)\w{1,10}\I)"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
     Rut = Len(Replace(Replace(Replace(Replace(Replace(Replace(Rut, "A", ""), "E", ""), "I", ""), "O", ""), "U", ""), " ", ""))
End Function
 
Code chuẩn cho ý 2 sẽ là:
Mã:
Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    .Pattern = "(O(?!.*O)\w{1,10}\I)"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
     Rut = Len(Replace(Replace(Replace(Replace(Replace(Replace(Rut, "A", ""), "E", ""), "I", ""), "O", ""), "U", ""), " ", ""))
End Function
Hàm này mà gặp từ "cooking oil" là teo
 
Dùng công thức nhé:

Yêu cầu 1:

Mã:
=SUMPRODUCT(--IFERROR(ISNUMBER(FIND(MID($C$3,ROW(INDIRECT("1:"&LEN($C$3))),1),"aeiouAEIOU")),0))-SUMPRODUCT(--IFERROR(ISNUMBER(FIND(MID($B$3,ROW(INDIRECT("1:"&LEN($B$3))),1),"aeiouAEIOU")),0))

Kết thúc bằng Ctrl-shift-enter

Yêu cầu 2:

Mã:
=LARGE(IF(ISNUMBER(FIND(MID($C$3,ROW(INDIRECT("1:"&LEN($C$3))),1),"aeiouAEIOU")),ROW(INDIRECT("1:"&LEN($C$3))),""),1)-LARGE(IF(ISNUMBER(FIND(MID($C$3,ROW(INDIRECT("1:"&LEN($C$3))),1),"aeiouAEIOU")),ROW(INDIRECT("1:"&LEN($C$3))),""),2)-1

Cũng kết thúc bằng Ctrl-shift-enter luôn.
 
Vì giữa o và i cuối cùng làm gì có phụ âm nào. He he

Hehe, thật ra thì mình đang học tiếng Latin.
MÀ quên bén mất cái vấn đề là "ae" "au" "eu" "oe" cũng được xem như một nguyên âm.
Bạn phulien1992 làm giúp mình bài 1, mà giờ gặp vấn đề với các nguyên âm kép ở trên. Ví dụ như từ coxae, thì chỉ có 2 nguyên âm là "o" và "ae", chứ không phải "o","a","e". Gặp mình ko biết Excel nên cũng không biết làm sao đề ưu tiên các nguyên âm kép.

Còn ý 2 thì mình cũng dùng code của bạn mà nó thành #Value :))))
Bạn có thể giúp mình làm thành một file và đính kèm được không? nhưng các nguyên âm thì cần thêm các nguyên âm kép nữa. Với không phải chỉ giữa o và i đâu.
Mình ví dụ
Bicipitis giữa 2 i là "t" là 1 phụ âm
frontis giữa o và i là" nt" là 2 phụ âm
cordis giữa o và i là "rd" là 2 phụ âm
laryngis giữa y và i là "ng" là 2 phụ âm


Còn "cooking oil" thì hài thật hehe.
 
Hehe, thật ra thì mình đang học tiếng Latin.
MÀ quên bén mất cái vấn đề là "ae" "au" "eu" "oe" cũng được xem như một nguyên âm.
Bạn phulien1992 làm giúp mình bài 1, mà giờ gặp vấn đề với các nguyên âm kép ở trên. Ví dụ như từ coxae, thì chỉ có 2 nguyên âm là "o" và "ae", chứ không phải "o","a","e". Gặp mình ko biết Excel nên cũng không biết làm sao đề ưu tiên các nguyên âm kép.

Còn ý 2 thì mình cũng dùng code của bạn mà nó thành #Value :))))
Bạn có thể giúp mình làm thành một file và đính kèm được không? nhưng các nguyên âm thì cần thêm các nguyên âm kép nữa. Với không phải chỉ giữa o và i đâu.
Mình ví dụ
Bicipitis giữa 2 i là "t" là 1 phụ âm
frontis giữa o và i là" nt" là 2 phụ âm
cordis giữa o và i là "rd" là 2 phụ âm
laryngis giữa y và i là "ng" là 2 phụ âm


Còn "cooking oil" thì hài thật hehe.
Mình đang bận xem tường thuật đế chế Việt Trung. Bạn có yêu cầu nào ghi thành file với kết quả mong muốn hơn 100 dòng thì mình mới giúp. Không nhắt lại yêu cầu thế này thế nọ thì nghe chừng không ổn lắm ^^
 
Hihi sửa cái đó dễ mà. Sao một cao thủ hàng đầu như bạn cũng phải thắc mắc nhỉ.
Chỉ là góp ý để pattern tốt hơn chứ không có gì.
---
Bạn nói vậy không dám nhận, giờ vẫn đang còn học hỏi.
Diễn đàn này cao thủ về Reg rất nhiều, họ không thể hiện thôi bạn.

Thân chào
 
Chỉ là góp ý để pattern tốt hơn chứ không có gì.
---
Bạn nói vậy không dám nhận, giờ vẫn đang còn học hỏi.
Diễn đàn này cao thủ về Reg rất nhiều, họ không thể hiện thôi bạn.

Thân chào
Hi tại hôm nay mình bận ra ngoài nên không có thời gian sửa được. Mình muốn viết một cái tổng quát hơn nữa. Về code thì với bài đếm có lẽ sửa thế này là hợp lý:
Mã:
Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    .Pattern = "(O(?!.*O)[^AEIOU]{0,100}\I)"
    .IgnoreCase = True
    On Error Resume Next
        Rut = .Execute(A)(0)
 End With
    If Len(Rut) <> 0 Then Rut = Len(Rut) - 2
End Function
 
Lần chỉnh sửa cuối:
Phải nhìn nhận quý vị siêng thật.
Đây là bài tập Excel của một cô giáo đưa ra để dạy tiếng Latin.
Trước khi biết tiếng Latin định nghĩa nguyên âm và phụ âm ra sao, tất cả các lời giải đều là giải ẩu, không có căn bản gì cả.
 
Phải nhìn nhận quý vị siêng thật.
Đây là bài tập Excel của một cô giáo đưa ra để dạy tiếng Latin.
Trước khi biết tiếng Latin định nghĩa nguyên âm và phụ âm ra sao, tất cả các lời giải đều là giải ẩu, không có căn bản gì cả.

Thực ra bài tập đưa cho mình thì phức tạp hơn, mình cũng cố gắng tìm hiểu marco, rồi viết code excel dựa trên kiến thức cơ bản của pascal mà học hồi 11. Mà gà mờ vẫn gà mờ. 2 vấn đề trên là cái quan trọng nhất để mình viết xong chương trình.
Thiệt là mấy bạn nhiệt tình thật :)). Mình cám ơn lắm nếu viết được chương trình. Còn không thì cũng ko quan trọng, tại đây chỉ là bài tập phụ để kiếm điểm thôi, vì đây là Latin chứ ko phải tin học, mặc dù đều là "tinh" haha.
 
[thongbao]Thiệt là mấy bạn nhiệt tình thật :)). Mình cám ơn lắm nếu viết được chương trình. Còn không thì cũng ko quan trọng, tại đây chỉ là bài tập phụ để kiếm điểm thôi, vì đây là Latin chứ ko phải tin học, mặc dù đều là "tinh" haha. [/thongbao]

Lần sao bạn nêu rõ hơn iêu cầu. Nếu không giống như là câu đố chứ đâu fải nhờ giúp; Bằng không không có lần sau nào nữa đâu bạn à!
 
Thực ra bài tập đưa cho mình thì phức tạp hơn, mình cũng cố gắng tìm hiểu marco, rồi viết code excel dựa trên kiến thức cơ bản của pascal mà học hồi 11. Mà gà mờ vẫn gà mờ. 2 vấn đề trên là cái quan trọng nhất để mình viết xong chương trình.
Thiệt là mấy bạn nhiệt tình thật :)). Mình cám ơn lắm nếu viết được chương trình. Còn không thì cũng ko quan trọng, tại đây chỉ là bài tập phụ để kiếm điểm thôi, vì đây là Latin chứ ko phải tin học, mặc dù đều là "tinh" haha.

Quả là một con la to
 
Phải nhìn nhận quý vị siêng thật.
Đây là bài tập Excel của một cô giáo đưa ra để dạy tiếng Latin.
Trước khi biết tiếng Latin định nghĩa nguyên âm và phụ âm ra sao, tất cả các lời giải đều là giải ẩu, không có căn bản gì cả.
Xin lĩnh giáo bạn VetMini. Ha ha. Mình thấy code cuối mình ở #18 khá ổn đấy chứ. Bạn VetMini có ý kiến đóng góp gì mình sửa. Mình không cần bạn phải viết code đâu. Ha ha
 
@chủ thớt:
Tôi đã nhắc nhở là ít nhất phải có một bảng định nghĩa thế nào là nguyên âm và thế nào là phụ âm rồi mới làm việc được.
Bạn không thể giao công việc lựa hàng cho người ta mà không có điều kiện để người ta xác định mặt hàng.

@doatmenhhon:
Ha với hót, lĩnh giáo với háng rộng. Bạn cũng lỳ không kém chủ thớt. Đã nói không có bảng phân biệt thì code của bạn hoàn toàn vô dụng.
Trong toán đại số, khi làm con toán thong thường, người ta ngầm hiểu là làm việc trên không gian véc tơ số thực. Nếu bài toán làm việc trên một vùng con của số thực, hoặc không gian véc tơ nào khác thì bài toán phải định nghĩa rõ ràng trước.

Nói thẳng, bạn chỉ là lập trình nghiệp dư. Tôi làm việc giao dịch với dân lập trình chuyên nghiệp nhiều năm, số năm giao dịch có thể lớn hơn số tuổi của bạn. Bất cứ thằng lập trình viên nào đưa code không có kèm bảng xác định phạm vi (scope) tôi đều xổ toẹt hết.
 
@chủ thớt:
Tôi đã nhắc nhở là ít nhất phải có một bảng định nghĩa thế nào là nguyên âm và thế nào là phụ âm rồi mới làm việc được.
Bạn không thể giao công việc lựa hàng cho người ta mà không có điều kiện để người ta xác định mặt hàng.

@doatmenhhon:
Ha với hót, lĩnh giáo với háng rộng. Bạn cũng lỳ không kém chủ thớt. Đã nói không có bảng phân biệt thì code của bạn hoàn toàn vô dụng.
Trong toán đại số, khi làm con toán thong thường, người ta ngầm hiểu là làm việc trên không gian véc tơ số thực. Nếu bài toán làm việc trên một vùng con của số thực, hoặc không gian véc tơ nào khác thì bài toán phải định nghĩa rõ ràng trước.

Nói thẳng, bạn chỉ là lập trình nghiệp dư. Tôi làm việc giao dịch với dân lập trình chuyên nghiệp nhiều năm, số năm giao dịch có thể lớn hơn số tuổi của bạn. Bất cứ thằng lập trình viên nào đưa code không có kèm bảng xác định phạm vi (scope) tôi đều xổ toẹt hết.
Hi mình chỉ làm việc ở phòng điều độ điện lực hông có liên quan gì đến lập trình cả. Công nhận bạn VetMini đanh đá kinh lên được ^^
 
Bạn là người thứ 1 triệu lẻ 1 chửi tôi đanh đá kiêu ngoa. Nếu mỗi lời rủa làm cho tôi giảm thọ 1 giây thì có thể giờ này tôi xuống lỗ rồi.

Người học mới cần khiêm tốn. Học mà còn tự ai vặt thì chỉ học được những trò múa rối, đem code về doạ thiên hạ. Là người chuyên môn xem phim tầu, đáng lẽ bạn phải học gương Chúa động Hoa Quả Sơn. Nếu chúa động tự ái khi bị Bồ Đề Lão Tổ gõ đầu 3 cái thì làm gì có ngày náo thiên cung doạt danh Tề Thiên Đại Thánh.
 
Bạn là người thứ 1 triệu lẻ 1 chửi tôi đanh đá kiêu ngoa. Nếu mỗi lời rủa làm cho tôi giảm thọ 1 giây thì có thể giờ này tôi xuống lỗ rồi.

Người học mới cần khiêm tốn. Học mà còn tự ai vặt thì chỉ học được những trò múa rối, đem code về doạ thiên hạ. Là người chuyên môn xem phim tầu, đáng lẽ bạn phải học gương Chúa động Hoa Quả Sơn. Nếu chúa động tự ái khi bị Bồ Đề Lão Tổ gõ đầu 3 cái thì làm gì có ngày náo thiên cung doạt danh Tề Thiên Đại Thánh.
Bạn nói thế mình không tự ái đâu. Mình chỉ kính nể bạn là người có tuổi uyên thâm. Code #18 test vẫn lỗi gắp 2 ý ở đấy lắp lại code cũ thì ổn. Mình lập lệnh rồi cắt điện giải tán nha ^^
 
Muốn giải loại bài này phải có một bảng chuyển ký tự. Có những ngôn ngữ có nguyên âm kép và có những ngôn ngữ có phụ âm kép (ví dụ tiếng Đức ss là một phụ âm)

Vì là loại đề chỉ tính nguyên/phụ âm cho nên ta có thể an toàn đổi tất cả các nguyên âm kép thành "a" và tất cả phụ âm kép thành "x". Sau đó đếm chúng bình thuờng. Và cách gải có những điểm đặc biệt sau đây:

- Trong các bài trước, có bài giải bằng cách chuyển thành Ucase để so sánh, cách này tốt nếu ta dùng đủ 26 ký tự. Ở đây chỉ có 5 (aeiou) thì ta dùng "AEIOUaeiou" quách cho khoẻ thân.

- Có một bạn dùng mảng cho dễ so sánh. Cách này rất mất công, Hàm InStr của VBA rất hiệu quả. Nhưng nếu bạn muốn dùng array thì cách gán trị cho bạn cũng rất khó kiểm soát. Có 3 cách khác để gán mảng:
1. Dúng hàm Array: a = array("A", "E", ...., "u")
2. Dùng hàm Evaluate: a = [ { "A", "E", ..., "u" } ] ' lưu ý: hàm evaluate là hàm worksheet cho nên chỉ số mảng bắt đầu từ 1
3. Dùng hàm Split: a = Split( "A,E,I,O,U,a,e,i,o,u", ",")

- Nếu dùng Regex thì dùng mẫu "[AEIOU ]" và chỉ cần đếm số matches : soNguyenAm = rx.Excutre("corrporus").Count : ignorecase = true

Đề thứ hai khó hơn nhiều. Cô giáo nào ra bài này có hơi bị khùng.

- Dùng InStr thì phải đọc ngược: Len(s) to 1 step -1
Tìm nguyên âm đầu tiên. Đọc hết dãy nguyên âm thì bắt đầu đếm số phụ âm cho đến khi gặp 1 nguyên âm khác.
Đề bài không cho biết nếu không có nguyên âm nào nữa thì sao? "scream" -> chỉ có 1 dãy nguyên âm.

- Dùng Regex thì mẫu là "[AEIOU][^AEIOU]+[AEIOU]". Lấy phần tử cuối cùng trong mảng kết quả, và bỏ đi ký tự đâu và cuối (vì kết quả sẽ là 1 chuỗi phụ âm kẹp giũa 2 nguyên âm).

=== đính chính:

Mẫu ở trên sai, ký tự nguyên âm thứ nhì sẽ bị ngốn mất trong lần match trước.
Ví dụ "aaabcdefghijkl" sẽ match ra "abcde" thay vì "efghi" (e bị ngốn vào "abcde" rồi, chỉ còn lại "fghi", không match)

Với dạng này, bắt buộc phải dùng kỹ thuật lookahead

"[AEIOU][^AEIOU]+(?=[AEIOU])" :---> ?= chỉ xét sự hiện hữu của chuỗi chứ không ngốn
"aaabcdefghijkl" sẽ match ra "efgh"
 
Lần chỉnh sửa cuối:
[thongbao]Thiệt là mấy bạn nhiệt tình thật :)). Mình cám ơn lắm nếu viết được chương trình. Còn không thì cũng ko quan trọng, tại đây chỉ là bài tập phụ để kiếm điểm thôi, vì đây là Latin chứ ko phải tin học, mặc dù đều là "tinh" haha. [/thongbao]

Lần sao bạn nêu rõ hơn iêu cầu. Nếu không giống như là câu đố chứ đâu fải nhờ giúp; Bằng không không có lần sau nào nữa đâu bạn à!
Ok, cám ơn bạn đã nhắc nhở.
 
Ok, cám ơn bạn đã nhắc nhở.
Bạn dùng tạm:
Mã:
 Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    On Error Resume Next
    .Pattern = "(O(?!.*O)\w{0,100}\I)"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
     Rut = Len(Replace(Replace(Replace(Replace(Replace(Replace(Rut, "A", ""), "E", ""), "I", ""), "O", ""), "U", ""), " ", ""))
End Function
khi nào nghĩ ra cách ngắn hơn mình sẽ chuyển cho bạn. Mình nhắc bạn gửi nhiều dòng vì nhiều ý tưởng của bạn có thể mâu thuẫn với nhau. Bài này mình đếm phụ âm giữa hai nguyên âm o và i cuối cùng
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn dùng tạm:
Mã:
 Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    On Error Resume Next
    .Pattern = "(O(?!.*O)\w{0,100}\I)"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
     Rut = Len(Replace(Replace(Replace(Replace(Replace(Replace(Rut, "A", ""), "E", ""), "I", ""), "O", ""), "U", ""), " ", ""))
End Function
khi nào nghĩ ra cách ngắn hơn mình sẽ chuyển cho bạn. Mình nhắc bạn gửi nhiều dòng vì nhiều ý tưởng của bạn có thể mâu thuẫn với nhau. Bài này mình đếm phụ âm giữa hai nguyên âm o và i cuối cùng

Cám ơn bạn rất nhiều, nếu lần sau mình có nhờ làm bài giúp thì mình sẽ ghi chi tiết hơn. Cám ơn bạn lần nữa
 
Bạn dùng tạm:
Mã:
 Function Rut(ByVal A As String) As String
A = UCase(A)
With CreateObject("VBscript.Regexp")
    On Error Resume Next
    .Pattern = "(O(?!.*O)\w{0,100}\I)"
    .IgnoreCase = True
    Rut = .Execute(A)(0)
End With
     Rut = Len(Replace(Replace(Replace(Replace(Replace(Replace(Rut, "A", ""), "E", ""), "I", ""), "O", ""), "U", ""), " ", ""))
End Function
khi nào nghĩ ra cách ngắn hơn mình sẽ chuyển cho bạn. Mình nhắc bạn gửi nhiều dòng vì nhiều ý tưởng của bạn có thể mâu thuẫn với nhau. Bài này mình đếm phụ âm giữa hai nguyên âm o và i cuối cùng

Không hiểu do version excel hay sao mà nó toàn #value ấy. Mình đang dùng excel macos Phiền bạn quá, nếu bạn bận thì không sao đâu bạn :))
 

File đính kèm

  • Screen Shot 2015-11-16 at 21.47.50.jpg
    Screen Shot 2015-11-16 at 21.47.50.jpg
    22.6 KB · Đọc: 33
Lần chỉnh sửa cuối:
Chủ thớt muốn học thì phải biết tự sửa code lấy.
Hiện tại thì có vẻ muốn ngồi mát ăn bát vàng, lấy bài dọn sẵn A-Z về kiếm điểm.

Đó cũng là lý do tôi nói "cô giáo này có hơi khùng". Ra bài tập kiểu này chả dạy được học sinh chỗ nào cả. Chỉ cần biết 1 vài diễn đàn chuyên nghiệp là ăn điểm gọn ơ.
 
Không hiểu do version excel hay sao mà nó toàn #value ấy. Mình đang dùng excel macos Phiền bạn quá, nếu bạn bận thì không sao đâu bạn :))
Mình chuyển thành đuôi .exe cho bạn hi vọng được. Khi nào có file tối ưu hơn mình sẽ gửi riêng cho bạn.
 

File đính kèm

Mình chuyển thành đuôi .exe cho bạn hi vọng được. Khi nào có file tối ưu hơn mình sẽ gửi riêng cho bạn.
Viết bài này là để biết chỗ nào cần trân trọng

- Nếu dùng Regex thì dùng mẫu "[AEIOU ]" và chỉ cần đếm số matches : soNguyenAm = rx.Excutre("corrporus").Count : ignorecase = true

Mã:
Public Function TIM(DL)
With CreateObject("vbscript.regexp")
.Global = True
.IgnoreCase = False
.Pattern = "[AEIOU]"
TIM = .Execute(UCase(DL)).Count
End With
End Function
Đề thứ hai khó hơn nhiều. Cô giáo nào ra bài này có hơi bị khùng.
- Dùng Regex thì mẫu là "[AEIOU][^AEIOU]+[AEIOU]". Lấy phần tử cuối cùng trong mảng kết quả, và bỏ đi ký tự đâu và cuối (vì kết quả sẽ là 1 chuỗi phụ âm kẹp giũa 2 nguyên âm)
Từ gợi ý này, đảo ngược chuỗi sẽ là xong
Mã:
Function Tach(ByVal A As String) As String
A = UCase(StrReverse(A))
With CreateObject("VBscript.Regexp")
.Global = True
.Pattern = "[AEIOU]"
If .Execute(A).Count > 1 Then Tach = .Execute(A)(1).firstindex - .Execute(A)(0).firstindex - 1
End With
End Function
---
Chỉ là trao đổi học thuật, không phải là với chủ thớt. Vì bài của chủ thớt chẳng có gì khó khăn cả.
Một cái ly nước đầy có lẽ sẽ không thể chứa thêm giọt nước nào nữa cả.
 
Chủ thớt muốn học thì phải biết tự sửa code lấy.
Hiện tại thì có vẻ muốn ngồi mát ăn bát vàng, lấy bài dọn sẵn A-Z về kiếm điểm.

Đó cũng là lý do tôi nói "cô giáo này có hơi khùng". Ra bài tập kiểu này chả dạy được học sinh chỗ nào cả. Chỉ cần biết 1 vài diễn đàn chuyên nghiệp là ăn điểm gọn ơ.
Bạn nói vậy mình cảm thấy rất buồn và có vẻ bạn không đọc kid hoặc không đọc những gì mình đã post ở trên. Có thể cho mình là ngồi mát ăn bát vàng cũng chẳng sao, nhưng ở trên mình đã nói là bài của mình phức tạp hơn, và 2 yêu cầu ở trên là cái mà mình không thể làm được nên mình mới nhớ người khác. Mình không phải hạng người mà tất cả mọi thứ đều phải đi nhờ vả, chẳng phải là mình đã nói là ai giúp đuợc mình thì tốt còn ai không giúp được mình thì thôi.
Thứ 2 điều cần nói ở đây là cô giáo mình là Giáo Sư giỏi nhất dạy môn Latin trường mình, và cái yêu cầu ở trên không phải hoàn toàn là đề của cô. Bạn có học chung với mình không, có được cô chỉ từng li từng tí không mà bạn bảo cô mình bị khùng. Điểm của mình không phải là thấp đến nỗi phải bức thiết đi năn nỉ để làm cái bài không thuộc chuyên ngành của mình, ở đây mình chỉ muốn chứng tỏ là sinh viên Việt Nam cũng cần cù, cũng chịu khó. Bạn có biết là mình phải dịch, rồi dùng phần mềm excel tiếng Nga để sữa lại nhũng code trên bằng hiểu biết cơ bản của mình không, cũng mấy tiênga đồng hồ ngồi mỏi mắt.
Thôi không than với bạn nữa, tóm lại là mình muốn nói, con người cũng có giới hạn, không phải cái gì cũng giỏi, việc bạn giúp mình để mình đạt điểm coi như giúp người khác, nó cũng chẳng thiệt hại gì cho bạn, ngoài trừ còn nhận được sự nệ phục của mình. Nhưng wua đây thì mìn chỉ thấy bạn khá trẻ con với việc đi chỉ trích người khác. Việc của mình với bạn tới đây có thế dừng được ròii.
 
@CongHoai:
Quyết định và đánh giá là do bạn nhưng mọi việc đều có tiến trình thời gian của nó.
Bạn xem lại thứ tự bài viết trong chủ đề này xem sao.
 
...
Từ gợi ý này, đảo ngược chuỗi sẽ là xong
....

Không cần phải đảo ngược chuỗi.

Mã:
Function LayPhuAmGiuaHaiNguyenAm(ByVal s As String) As String
[COLOR=#008000]' hàm lấy chuỗi phụ âm cuối cùng giữa 2 nguyên âm[/COLOR]
Const NGUYENAM = "aeiou" [COLOR=#008000]' bởi vì cái này sẽ lặp lại nhiều lần cho nên dùng const để dễ chỉnh sửa, nếu muốn gồm cả y thì chỉ việc cho vào đây
[/COLOR]With CreateObject("VBScript.RegExp")
    .Global = True
    .ignoreCase = True
    .Pattern = Replace("[COLOR=#0000ff][N][^N]+(?=[N])[/COLOR][COLOR=#a52a2a](?!.*[N][^N]+(?=[N]))[/COLOR]", "N", NGUYENAM) [COLOR=#008000]' thay const vào[/COLOR]
    If .test(s) Then LayPhuAmGiuaHaiNguyenAm = Mid(.Execute(s)(0), 2)
End With
End Function

Để ý, cái mẫu gồm 2 phần. Phần màu xanh là lấy phụ âm nằm giữa 2 nguyên âm. Phần màu nâu lặp lại phần màu xanh, thêm điều kiện "không", chủ ý của "negative lookahead". Mục đích của phần này bảo rằng: không có cái nào giống vậy đi theo sau -> như vậy theo lô gíc, tức là cái cuói cùng.

Sau khi match xong rồi thì dùng hàm Mid để loại ký tự đầu. Bởi vì cái mẫu này sẽ lấy cả ký tự nguyên âm dẫn đầu nó.

LayPhuAmGiuaHaiNguyenAm("abce") = "bc"
LayPhuAmGiuaHaiNguyenAm("abcef") = "bc"
LayPhuAmGiuaHaiNguyenAm("abcdef") = "bcd" (giữa a và e)
LayPhuAmGiuaHaiNguyenAm("axyzaeibcdef") = "bcd" (giữa i và e)
LayPhuAmGiuaHaiNguyenAm("axyzaeibcd") = "xyz" (giữa 2 ký tự a)

...
Chỉ là trao đổi học thuật,...

Thì đúng vậy. Trao đổi là chính. Thực sự tôi chỉ cần người sẵn sàng trao đổi thì tôi nói chuyện.
 
@chủ thớt:
Tôi là dân chuyên về dữ liệu và đồ án. Tôi chỉ cần nhìn đề bài thì biết mức độ khó của nó.
Bài này phải dân có kinh nghiệm về sử lý chuỗi (*) trong lập trình mới làm được. Không phải là loại đề của dân mới học code. Và nó chả liên quan gì đến việc học ngôn ngữ (trừ ngôn ngữ VBA). Vì vậy có thể nói thẳng cô giáo này không biết cách thử sức học sinh.

(*) tôi nói "sử lý chuỗi" trên nghĩa bao quát. Tức là muốn dùng các hàm chuỗi của VBA cũng được, không nhất thiết phải dùng RegEx. Tôi chỉ đề nghị cái mẫu cho các bạn thích học regex thôi. Rất tiếc là cái bạn kia (bài #30) quá cố chấp cho nên phân tích trật vấn đề.
 
@chủ thớt:
Tôi là dân chuyên về dữ liệu và đồ án. Tôi chỉ cần nhìn đề bài thì biết mức độ khó của nó.
Bài này phải dân có kinh nghiệm về sử lý chuỗi (*) trong lập trình mới làm được. Không phải là loại đề của dân mới học code. Và nó chả liên quan gì đến việc học ngôn ngữ (trừ ngôn ngữ VBA). Vì vậy có thể nói thẳng cô giáo này không biết cách thử sức học sinh.

(*) tôi nói "sử lý chuỗi" trên nghĩa bao quát. Tức là muốn dùng các hàm chuỗi của VBA cũng được, không nhất thiết phải dùng RegEx. Tôi chỉ đề nghị cái mẫu cho các bạn thích học regex thôi. Rất tiếc là cái bạn kia (bài #30) quá cố chấp cho nên phân tích trật vấn đề.
Hi chuyên môn của mình là lập trình mạch điện không liên quan đến lập trình chuỗi gì cả. Cho mình hỏi bạn VetMini thế lập trình excel này ứng cho công việc ngành nghề gì cụ thể không bạn, mình vẫn chưa hình dung ra.
 

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

Back
Top Bottom