Ruby’de Sayiyi Yaziya Ceviren Program
Ruby ile yapilmis sadece algoritma gelistirmeye yonelik bir calisma .Konsol programi olmakla beraber eger istenirse glade ile arayuz yapilip ve ya bir kac degisiklik yapilarak eklenti haline getirilebilir.Ornegin doviz birolari icin verilen paranin miktarini gonderip turkce okunus karsiligini geri gonderen bir fonksiyona donusturulebilir.Herneyse olayin genel mantigini anlatmak gerekirse eger turkce sayilarin okunusuna dikkat ederseniz,ilk uc haneden sonra bundan sonra gelen hanelerin sonuna basamak adi getirilerek devam edilir.Bir kac ornek ;
321 = Uc yuz + yirmi + bir
234754 = iki yuz +otuz +dort - bin – yedi yuz+ elli +dort // goruldgu gibi uc hane seklinde tekrarlaniyor sadece her uc hanede bir basamak adi ekleniyor.
Ozel durumlar :
Bu durumlar goz onunde bulundurularak bir kod yazmak istersek kisaca yazacagimiz kod soyle olmalidir.Sayimiz kac tane uclukten olusuyor.Bu uclukleri sirasiyla yazdirdiktan sonra (sayi degerini basamak degerini falan bulduktan sonra).Push yapip stack’a atiyoruz her atma olayindan once kacinci basamakta oldugumuzuda konrol edip sonuna ekliyoruz ki pop yaptigimizda sonucumuz sirali gelsin.Peki ama sayimiz ucun kati degilse bu olusacak ucluler patlamayacakmi bunuda en sondaki kalan kisminda tekrar baska uclu varmiscasina ama kac haneli olduguna bakarak ve ozel durumlarin ustesinden geliyoruz.
-
while true
-
-
puts "Okunacak sayiyi : "
-
a=gets
-
a=a.to_i
-
eksi=a
-
i=0
-
katsayi=1
-
sayi_oku =[]
-
b=[]
-
rakam=[]
-
-
#eksi sayiyi handle etme
-
a=a.abs
-
sayi=a
-
#eksi sayiyi handle etme
-
-
if a == 0
-
sayi_oku.push( "sifir" )
-
end
-
-
while a!=0
-
katsayi=katsayi * 10 #
-
b[i]=a.modulo(katsayi) #basamaksal deger bulma
-
a=a-b[i] #
-
rakam[i] =(b[i]/(katsayi/10)) #rakamsal deger bulma
-
-
i=i+1 #basamak sayisi
-
end
-
-
birler= { 0 =>"", 1 => "bir",2 => "iki",3 => "uc" ,4 => "dort",5 => "bes",6 => "alti",7 => "yedi", 8 => "sekiz", 9 => "dokuz"}
-
onlar= { 0 =>"",1 => "on",2 => "yirmi",3 => "otuz" ,4 => "kirk",5 => "elli",6 => "altmis",7 => "yetmis", 8 => "seksen", 9 => "doksan"}
-
hane =[ "" , "bin", "milyon", "milyar", "tirilyon", "katrilyon", "kentilyon", "seksilyon", "septilyon", "oktilyon", "nonilyon", "desilyon", "undesilyon", "dodesilyon", "tredesilyon", "kattuordesilyon", "kendesilyon", "sexdesilyon", "septendesilyon", "oktodesilyon", "novemdesilyon", "vigintilyon", "unvigintilyon", "dovigintilyon", "trevigintilyon", "kattuorvigintilyon", "kenvigintilyon"]
-
-
#kac haneli oldugunu bildigimiz sayinin hanelerini 3erli ayirmam lazim icinde kac tane 3 erli grup
-
#oldugunu i sayisini 3 e bolerek bulup daha sonrada 3 e gore modunu alip sayiyi tamamlamak gerek
-
-
if i>2
-
kac_grup =(i/3)
-
else
-
kac_grup = 0
-
end
-
#puts "Kac grup :" + kac_grup.to_s
-
artan=i.modulo(3)
-
-
z=0
-
c=0
-
-
#3 hane veya buyukse gir
-
if i >2
-
while z!=kac_grup
-
if rakam[c+2]==0 && rakam[c+1]==0 && rakam[c]==0
-
else
-
sayi_oku.push( hane[z] + " ")
-
end
-
-
# print birler[rakam] + " yuz " + onlar[rakam] + " " +birler[rakam] + " "
-
if rakam[c+2]==1
-
sayi_oku.push( " yuz " + onlar[rakam[c+1]] + " " +birler[rakam[c]] + " " )
-
elsif rakam[c+2]==0
-
sayi_oku.push( onlar[rakam[c+1]] + " " +birler[rakam[c]] + " " )
-
else
-
sayi_oku.push( birler[rakam[c+2]] + " yuz " + onlar[rakam[c+1]] + " " +birler[rakam[c]] + " " )
-
end
-
-
#puts "bir sekilde yazdirdiktan sonra 3 arttirrip artan degiskenini eklemek lazim"
-
c=c+3
-
z=z+1
-
end
-
end
-
#3 hane veya buyukse cik
-
-
if artan == 0
-
-
elsif artan == 1
-
#puts "Sonraki " + birler[rakam] + " " + hane[z]
-
if rakam[c] == 1
-
if sayi == 1
-
sayi_oku.push( "bir " )
-
else
-
if sayi>1000
-
sayi_oku.push( " bir "+ hane[z] + " ")
-
else
-
sayi_oku.push( "bin ")
-
end
-
-
end
-
-
else
-
sayi_oku.push( birler[rakam[c]] + " " + hane[z] + " ")
-
end
-
#sayi_oku.push( birler[rakam] + " " + hane[z] )
-
elsif artan == 2
-
# puts "Sonraki 2 " + onlar[ rakam ] + " " +birler[ rakam ] + " " + hane[z]
-
sayi_oku.push( onlar[ rakam[c+1] ] + " " +birler[ rakam[c] ] + " " + hane[z] + " ")
-
end
-
-
if eksi<0
-
sayi_oku.push( "Eksi " )
-
end
-
-
puts "================================================================="
-
print eksi.to_s + " = " + sayi_oku.reverse.to_s
-
puts ""
-
puts "================================================================="
-
puts ""
-
-
end
This program basically gets the number from console and writes to screen how its pronounce in Turkish.