12 Mayıs 2012 Cumartesi

GİRİLEN SAYIYI SESLİ OKUYAN PROGRAM



Ses Dosyaları :
--------------------------------------------------------------------------------
Bu program, girdiğimiz bir sayıyı bize sesli olarak okuyacak. Tabiki bunun için daha önceden gerekli ses dosyalarını hazırlamanız gerekir. Sayı okutma işlemi için 7 basamak sınırımız olsun. Bu durumda aşağıdaki ses dosyalarına ihtiyacımız olacak :

bir.wav on.wav yüz.wav
iki.wav yirmi.wav bin.wav
üç.wav otuz.wav milyon.wav
dört.wav kırk.wav
beş.wav elli.wav
altı.wav altmış.wav
yedi.wav yetmiş.wav
sekiz.wav seksen.wav
dokuz.wav doksan.wav

Tabiki herbir wav dosyası, ismindeki sayıyı saklayacak. Program içerisinde istediğimiz yerde bu dosyaları arka arkaya çağırarak sayımızı seslendireceğiz. Bu şekilde 7 basamaklı bir sayıya kadar tüm sayıları okutabiliriz.
Sayıların Parçalanması :
--------------------------------------------------------------------------------
Önemli olan şey, rakamları düzgün ve kurallı olarak parçalayabilmektir. İlkokul 1. sınıfı hatırlayalım.
1. Basamaktaki Sayı : Sıfır rakamı haricinde sayı olduğu gibi okunur.
 
2. Basamaktaki Sayı : Sıfır rakamı haricinde sayı "Onluk" isimleriyle çağrılır. (10-20-30..vb)
 
3. Basamaktaki Sayı : Sıfır rakamı zaten okunmaz. 1 rakamında sadece "Yüz" denir. Diğer rakamlarda ise Rakam + "Yüz" denir.
 
Örnek :
 
302 : Üç + Yüz + İki
257 : İki + Yüz + Elli + Yedi
4. Basamaktaki Sayı : Eğer 4. basamak sıfır ise boş bırakılamaz. 5. ve 6. basamaklara da bakılır. Eğer 5. ve 6. basamaklarda sayı varsa o sayılar okunur ve sadece "Bin" denir. Eğer 4. basamakta sayı varsa 5. ve 6. basamaklara bakmaya gerek kalmaz. Onlar zaten okunacaktır. Sadece 4. basamağa bakılır. Sayı + "Bin" denir.
 
Ayrıca eğer sayı 4 basamaktan büyükse ve 4.basamakta "1" varsa "Bir" + "Bin" denir. Yani "Bir" okunur. Ama sayı 4 basamaklı ise ve 4. basamak "1" ise sadece "bin" denir. Bunun haricinde Sayı + "Bin" olarak okunur.
 
Örnek :
 
1302 : Bin + Üç + Yüz + İki
6257 : Altı + Bin + İki + Yüz + Elli + Yedi
 
5600051 : Beş + Milyon + Altı + Yüz + Bin + Elli + Bir (5. ve 6. basamaklar burada önemli)
 
5000051 : Beş + Milyon + Elli + Bir (4 boş olduğundan 5 ve 6 ya bakılır. Onlar da boş olduğunda "bin" denmez.)
5. Basamaktaki Sayı : Sıfır rakamı haricinde sayı "Onluk" isimleriyle çağrılır. (10-20-30..vb)
 
6. Basamaktaki Sayı : Sıfır rakamı zaten okunmaz. 1 rakamında sadece "Yüz" denir. Diğer rakamlarda ise Rakam + "Yüz" denir.
 
7. Basamaktaki Sayı : Direkt Sayı + "Milyon" denir.
Programın Hazırlanması :
--------------------------------------------------------------------------------
Yukarıda sayıların parçalanma kurallarını gördük. Bu kurallara uygun olarak sayı basamakları tek tek incelenip karar verilecek. Ben algoritmamda sayıyı STRING olarak okuyacağım. Hiçbir şekilde INTEGER veya LONG olarak kullanmayacağım. Bunun avantajı, sayı üzerinde String işlemlerini kullanmanın kolaylığıdır. Programda kullandığım 3 adet String fonksiyonunun açıklamaları :
Kod:
Mid$ : Bir String değişken içerisinden istediğiniz kısmı koparıp almanızı sağlar. Parametreleri : ( MetinDeğişken ), ( BaşlangıçNoktası ), (İlerleme Sayısı)
Örnek:
Mid$ ( "Gökhan", 3 , 2 ) = "kh"
Mid$ ( "Gökhan" , 2 , 4 ) = "ökha"
Kod:
Left$ - Right$ : Bir String değişkenin Sağdan veya Soldan istediğiniz sayıda karakterini verir. Parametreleri : ( MetinDeğişken ) , (İlerleme Sayısı)
Örnek:
Left$ ( "Gökhan", 3 ) = "Gök"
Right$ ( "Gökhan" , 3 ) = "han"
Bu fonksiyonlar içiçe kullanılabilir. Mesela metnin 3. harfini elde etmek için:
Right$ ( Left$ ( "Gökhan" , 3 ) , 1 ) = "k" döner.
Kod:
Len : Bir String ifadenin karakter sayısını verir.
Len ( "Gökhan" ) = 6
Şimdi programımızda kullanacağımız iki adet dizi tanımlayalım. Dizilerin içerikleriyle ses dosyalarının isimlerinin aynı olmasına özen gösterin. Çünkü, dizilerdeki bilgileri hem ekrana yazmak için hem de ses dosyalarının ismini oluşturmak için kullanacağız.
Kod:
Dim Onlar As Variant
Dim Sayilar As Variant
Sayilar = Array ( "", "bir", "iki", üç", "dört", "beş", "altı", "yedi", "sekiz", "dokuz" )
Onlar = Array ( "", "on", "yirmi", "otuz", "kırk", "elli", "altmış", "yetmiş", "seksen", "doksan" )
İşte programın tamamı. Programda sayı, kullanıcı tarafından textbox içine yazılacak. Sayının okunuşu da bir Listbox nesnesine yazılacak. Sayının okunuşu için iki buton bulunur. Bunlardan biri sayının okunuşunu listbox listesine yazar. Diğer buton ise listede yazılı sayıyı okutmak içindir
Kod:
Sayi = Trim(Text1.Text)
   
For i = 1 To Len(Sayi) ' Sayıdaki Rakamlar Tek Tek Okunur
       
Select Case Len(Sayi) - i + 1 ' Alınan Rakamın Matematikteki Basamağına Göre Seçim
           
Case 7:
                If Mid$ ( Sayi , i , 1 ) <> "0" Then
                    List1.AddItem Sayilar ( Val( Mid$( Sayi , i , 1 )))
                    List1.AddItem "milyon"
                End If
' ------------------------------------------------------------------------------------
Case 6:
                If Mid$( Sayi, i , 1 ) <> "0" Then
                    If Mid$( Sayi, i , 1 ) <> "1" Then List1.AddItem Sayilar( Val( Mid$( Sayi, i , 1 )))
                    List1.AddItem "yüz"
                End If
' ------------------------------------------------------------------------------------
       Case 5: If Mid$( Sayi, i, 1 ) <> "0" Then List1.AddItem Onlar( Val( Mid$( Sayi, i, 1 )))
' ------------------------------------------------------------------------------------
     Case 4:
                    If Mid$(Sayi, i, 1) <> "0" And Mid$(Sayi, i, 1) <> "1" Then
                        List1. AddItem Sayilar(Val(Mid$(Sayi, i, 1)))
                    End If
               
                    If Mid$(Sayi, i, 1) = "1" Then
                        If Len(Sayi) >= 6 Then
                            If Mid$(Sayi, i - 1, 1) <> "0" Or Mid$(Sayi, i - 2, 1) <> "0" Then
                                List1. AddItem "bir"
                            End If
                          ElseIf Len(Sayi) = 5 Then
                            If Mid$(Sayi, i - 1, 1) <> "0" Then
                                List1. AddItem "bir"
                            End If
                        End If
                    End If
                   
                    List1. AddItem "bin"
' ------------------------------------------------------------------------------------
       Case 3:
                If Mid$(Sayi, i, 1) <> "0" Then
                    If Mid$( Sayi, i, 1 ) <> "1" Then List1.AddItem Sayilar( Val( Mid$( Sayi, i, 1 )))
                    List1.AddItem "yüz"
                End If
' ------------------------------------------------------------------------------------
       Case 2: If Mid$( Sayi, i, 1 ) <> "0" Then List1.AddItem Onlar( Val( Mid$( Sayi, i, 1 )))
' ------------------------------------------------------------------------------------
       Case 1: If Mid$( Sayi, i, 1 ) <> "0" Then List1.AddItem Sayilar( Val( Mid$(Sayi, i, 1 )))
End Select
Next
Yukarıdaki kodlarda, sayının rakamları tek tek okunarak, en başta anlatılan okuma kuralları uygulanır. Oluşan metin parçaları List1 nesnesine eklenir. Aşağıda ise Okuma komut düğmesine basıldığında ses dosyalarının çağrılması anlatılmıştır. Ses dosyalarını çağırmak için SndPlaySound Api'sini kullandım.

Kod:
For i = 0 To List1.ListCount - 1
        sndPlaySound App.Path & "/sesler/" & Trim$(List1.List(i)) & ".wav", 2
Next
SndPlaySound Api'si iki parametre alır. ( Dosya Adresi ) , ( Mod ). Mod Ayarının 2 olması, bir ses dosyasının okunması bitmeden bir sonrakine geçmemesini ve beklemesini sağlar. Yukarıda bir For-Next döngüsü ile List1 listesinde yazılmış kelimelere ait wav dosyaları sırasıyla çağrılmaktadır.
Bu şekilde girdiğimiz bir tamsayıyı parçalayıp okutabiliriz.

Hiç yorum yok:

Yorum Gönder