Taner Şenyurt

Kişisel gelişim sitesi…

Ruby’de Sayiyi Yaziya Ceviren Program

March31

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 :

  • Sifir sayi icinde gecerse okunmaz tek oldugunda okunur.
  • Normalde iki yuz,uc yuz,dort yuz gibi okundugu halde bir yuz okunmaz
  • Ustteki duruma benzer olarak bir bin okunmaz buna ragmen bir milyon ve sonrari okunur
  • 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.

    1. while true
    2.  
    3.    puts "Okunacak sayiyi  : "
    4.     a=gets
    5.     a=a.to_i
    6.     eksi=a
    7.     i=0
    8.     katsayi=1
    9.     sayi_oku =[]
    10.     b=[]
    11.     rakam=[]
    12.  
    13.           #eksi sayiyi handle etme
    14.            a=a.abs
    15.            sayi=a
    16.           #eksi sayiyi handle etme
    17.  
    18.           if a == 0
    19.                 sayi_oku.push( "sifir" )
    20.           end
    21.  
    22.     while  a!=0
    23.       katsayi=katsayi * 10            #
    24.       b[i]=a.modulo(katsayi)          #basamaksal deger bulma
    25.       a=a-b[i]                        #
    26.       rakam[i] =(b[i]/(katsayi/10))   #rakamsal deger bulma
    27.  
    28.       i=i+1                           #basamak sayisi
    29.     end
    30.  
    31.     birler= { 0 =>"", 1 => "bir",2  => "iki",3 => "uc" ,4  => "dort",5  =>  "bes",6  =>  "alti",7  =>  "yedi", 8  => "sekiz", 9 => "dokuz"}
    32.     onlar= { 0 =>"",1 => "on",2  => "yirmi",3 => "otuz" ,4  => "kirk",5  =>  "elli",6  =>  "altmis",7  =>  "yetmis", 8  => "seksen", 9 => "doksan"}
    33.     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"]
    34.  
    35.     #kac haneli oldugunu bildigimiz sayinin hanelerini 3erli ayirmam lazim icinde kac tane 3 erli grup
    36.     #oldugunu i sayisini 3 e bolerek bulup  daha sonrada 3 e gore modunu alip sayiyi tamamlamak gerek
    37.  
    38.      if i>2
    39.      kac_grup =(i/3)
    40.      else
    41.      kac_grup = 0
    42.      end
    43.      #puts "Kac grup :" + kac_grup.to_s
    44.      artan=i.modulo(3)
    45.  
    46.     z=0
    47.     c=0
    48.  
    49.           #3 hane veya buyukse gir
    50.               if  i >2
    51.                   while z!=kac_grup
    52.                             if rakam[c+2]==0 && rakam[c+1]==0 && rakam[c]==0
    53.                             else
    54.                                sayi_oku.push( hane[z] + " ")
    55.                             end
    56.  
    57.           # print  birler[rakam] + " yuz " + onlar[rakam] + " " +birler[rakam] + " "
    58.                     if rakam[c+2]==1
    59.                           sayi_oku.push( " yuz " + onlar[rakam[c+1]] + " " +birler[rakam[c]] + " " )
    60.                     elsif rakam[c+2]==0
    61.                           sayi_oku.push( onlar[rakam[c+1]] + " " +birler[rakam[c]] + " " )
    62.                     else
    63.                        sayi_oku.push( birler[rakam[c+2]] + " yuz " + onlar[rakam[c+1]] + " " +birler[rakam[c]] + " " )
    64.                     end
    65.  
    66.                     #puts "bir sekilde yazdirdiktan sonra 3 arttirrip artan degiskenini eklemek lazim"
    67.                    c=c+3
    68.                    z=z+1
    69.                   end
    70.               end
    71.           #3 hane veya buyukse cik
    72.  
    73.           if artan == 0
    74.  
    75.             elsif artan == 1
    76.               #puts "Sonraki  " + birler[rakam] + " " + hane[z]
    77.               if rakam[c] == 1
    78.                             if sayi == 1
    79.                               sayi_oku.push( "bir " )
    80.                             else
    81.                                 if sayi>1000
    82.                                    sayi_oku.push( " bir "+ hane[z] + " ")
    83.                                 else
    84.                                    sayi_oku.push( "bin ")
    85.                                 end
    86.  
    87.                             end
    88.  
    89.                   else
    90.                     sayi_oku.push( birler[rakam[c]] + " " + hane[z] + " ")
    91.                   end
    92.                #sayi_oku.push( birler[rakam] + " " + hane[z] )
    93.             elsif artan == 2
    94.               # puts "Sonraki 2 " + onlar[ rakam ] + " " +birler[ rakam ] + " " + hane[z]
    95.                 sayi_oku.push( onlar[ rakam[c+1] ] + " " +birler[ rakam[c] ] + " " + hane[z] + " ")
    96.           end
    97.  
    98.     if eksi<0
    99.       sayi_oku.push( "Eksi " )
    100.     end
    101.  
    102.     puts "================================================================="
    103.     print eksi.to_s + " = " + sayi_oku.reverse.to_s
    104.     puts ""
    105.     puts "================================================================="
    106.     puts ""
    107.  
    108. end

    This program basically gets the number from console and writes to screen how its pronounce in Turkish.

    Comments are closed.