Đếm số nguyên âm trong chuỗi kí tư

Liên hệ QC

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.
 
Web KT
Back
Top Bottom