9
Integer Sınıfı
Ruby’de tamsayılar için kullanılan Fixnum ve Bignum sınıflarını üreten
sınıftır.
Integer Literal
Tamsayı gösteren metinler,
1
0,
1,
123 ,
123456789012345678901234567890
biçiminde yalnızca 0 − 9 aralığındaki sayakları (digits) içeren dizimlerdir.
Ruby tamsayının tipini kendisi belirler. Sayı 31 bite sığıyorsa, onu Fixnum, değilse Bignum olarak algılar ve işlemleri ona göre yapar. Çok haneli
sayıların okunurluğunu ve algılanırlığını artırmak için, sayı binler bölüklerine ayrılabilir ve binlik bölüklerin arasına alt çizgi (_) konulabilir. Bu
gösterim yalnızca kaynak programı okuyanlar için kolaylık sağlar; Kaynak
kodda sayının binliklerine ayrılıp ayrılmaması Ruby için önem taımaz.
1
x= 3_123_456_789
9.1
# => 3123456789
Integer Sınıfına Uygulanan Başlıca Metotlar
Integer sınıfı Numeric sınıfından türetilen bir nesnedir. Dolayısıyla Object
ve Numeric sınıflarının bütün metotlarını kalıtsal alır. Integer sınıfının metotlarının tam listesi http://www.ruby-doc.org/core-2.1.2/Integer.html web
104
BÖLÜM 9. INTEGER SINIFI
sayfasından görülebilir. Burada çok kullanılan bazı metotlara örnekler vermekle yetineceğiz.
to_i –> integer
Binary, octal ya da hexadecimal sayıları onlu sistemde (decimal) yazılmış
tamsayıya (integer) dönüştürür.
Liste 9.1.
0 b111 . t o _ i
0123. to_i
0 x1a2b . t o _ i
# => 7
# => 83
# => 6699
chr([encoding]) –> string
Kodu verilen harfi, parametredeki kodlama sistemine göre verir. encode parametresi yazılmazsa, genişlemiş ASCII kodlaması öntanımlı (default) olur.
Binary, octal ya da hexadecimal sayıları onlu istemde (decimal) yazılmış
tamsayıya (integer) dönüştürür.
Liste 9.2.
2
65. chr
# => "A"
230. chr
# => " \ 3 4 6 "
2 5 5 . c h r ( Encoding : : UTF_8)
# => " \ 3 0 3 \ 2 7 7 "
chr –> string
Verilen ascii koduna karşılık olan karakteri verir. ord metodunun karşıtıdır.
Liste 9.3.
2
i r b ( main ) : 0 5 7 : 0 >
65. chr
# => A
32. chr
# => " "
ord –> integer
Verilen bir karakterin ASCII kodunu verir. chr metodunun karşıtıdır.
Liste 9.4.
2
i r b ( main ) : 0 5 7 : 0 > => 65
? a . ord
# => 97
? ? . ord
# => 63
?#. ord
# => 35
9.1. INTEGER SINIFINA UYGULANAN BAŞLICA METOTLAR
105
integer? –> true
Verilen tamsayının integer olup olmadığını söyler. Tamsayılar için daima
true verir. Tamsayı olmayan verilere uygulanırsa hata verir.
Liste 9.5.
1
4. integer ?
’4 ’ . integer ?
" 4": String
# => t r u e
# => NoMethodError : u n d e f i n e d method ‘ i n t e g e r ? ’ f o r
even? –> true ya da false
Verilen tamsayı çift ise true, tek ise false verir. Tamsayı olmayan veriler
için hata verir. odd metodunun karşıtıdır.
Liste 9.6.
3
2 4 . even
2 5 . even
" abc " . even ?
String
# => t r u e
# => f a l s e "
# => NoMethodError : u n d e f i n e d method ‘ even ? ’ f o r " abc " :
odd? –> true ya da false
Verilen tamsayı tekse true çiftse false verir. even metodunun karşıtıdır.
Liste 9.7.
2
1 . odd ?
2 . odd ?
−10. odd
# => t r u e
# => f a l s e
# => f a l s e
gcd(int2) –> integer
Uygulandığı tamsayı ile argümanının en büyük ortak bölenini (ebob) verir.
Liste 9.8.
2
2 . gcd ( 2 )
3 . gcd ( −7)
((1 < <31) −1) . gcd ((1 < <61) −1)
# => 2
# => 1
# => 1
106
BÖLÜM 9. INTEGER SINIFI
gcdlcm(int2) –> integer
Uygulandığı tamsayı ile argümanının en büyük ortak bölenini (ebob) ve en
küçük ortak katını (ekok) bir array biçiminde verir.
Liste 9.9.
2
2 . gcdlcm ( 2 )
3 . gcdlcm ( −7)
((1 < <31) −1) . gcdlcm ((1 < <61) −1)
# => [ 2 , 2 ]
# => [ 1 , 2 1 ]
# => [ 1 , 4 9 5 1 7 6 0 1 5 4 8 3 5 6 7 8 0 8 8 2 3 5 3 1 9 2 9 7 ]
next –> integer
Verilen tamsayının ardışığını verir. Verilen sayı x ise sonuç x + 1 olur.
Liste 9.10.
2
1. next
( −1) . n e x t
10. next
# => 2
# => 0
# => 11
pred –> integer
Verilen tamsayının öncülünü verir. Verilen sayı x ise sonuç x − 1 olur.
Liste 9.11.
2
1 . pred
( −1) . pred
1 0 . pred
# => 0
# => −2
# => 9
rand –> float
Seçkisiz (random) sayı üretir.
Liste 9.12.
2
r = Random . new
r . rand ( 1 0 0 )
# => 18
9.2. INTEGER <==> FLOAT DÖNÜŞÜMLERI
107
seed -> integer
seed metodu seçkisiz (random) tamsayı üretir. Aynı sonuçları tekrar verir.
Liste 9.13.
3
r 1 = Random . new ( 1 2 3 4 )
r1 . seed
#=> 1234
r 1 . rand ( 1 0 0 ) #=> 47
r 2 = Random . new ( prng1 . s e e d )
r 2 . rand ( 1 0 0 ) #=> 47
round([ndigits]) –> integer or float Verilen tamsayıyı istenen duyarlığa (precision) yuvarlar. Öntanımlı duyarlığı 0 dır.
İstenen duyarlık negatif olabilir. ndigits duyarlığı pozitif ise bir float
sayı verir, 0 ise sayının kendisini, negatif ise skalada alttaki değeri verir.
Örnekler:
Liste 9.14.
1 . round
1 . round ( 2 )
1 5 . round ( −1)
#=> 1
#=> 1 . 0
#=> 20
succ –> integer n sayısından sonra gelen tamsayıyı verir; n tamsayısı
için n+1 sayısını verir. next ile aynıdır.
Liste 9.15.
2
1. succ
( −1) . s u c c
9.2
#=> 2
#=> 0
Integer <==> Float Dönüşümleri
Integer tipi Float tipe dönüştürme
Integer tipler Float tipe dönüşürken sağ yanlarına .0 eklenir.
1 2 3 . to_f
# => 1 2 3 . 0
108
BÖLÜM 9. INTEGER SINIFI
Float tipi Integer tipe Dönüştürme
to_i metodu F loat tipi Integer tipe dönüştürür. Dönüşümde kesir kısmı
atılır. Yuvarlama yapılmaz. Tam kısmın tabanını verir.
1 2 3 . 4 5 6 . to_i
=> 123
9.3
Sayıların Farklı Tabanlara Göre Yazılması
Bilindiği gibi her sayı istenilen bir pozitif q tabanına göre yazılabilir. 10
tabanına göre tamsayılar 1, 2, 3, 4, 5, 6, 7, 8, 9 sayaklarından birisiyle başlar.
Tamsayı gösteren bir metnin (numeric literal) önüne 0b ya da 0 ya da 0x
gelirse Ruby onu, sırasıyla binary, octal ve hexadecimal sayı olarak algılar.
Binary sayılar 2 tabanına göre yazılmış sayılardır. octal sayılar 8 tabanına
göre yazılmış sayılardır. Hexadecimal sayılar 16 tabanına göre yazılmış sayılardır.
binary: 2 tabanlı
Binary sayılarda sayaklar (digits) 0,1, simgeleridir. Dolayısıyla binary gösteriminde 0 ve 1 sayaklarından başka karakterler kullanılamaz. Örneğin,
0b10 binary sayısının onlu (decimal) sistemdeki değeri 2 ’dir. Bu dönüşümü, etkileşimli irb kabuğunda kolayca yapabiliriz. Ruby binary sayıları
to_i metodu ile onlu (decimal) tipe dönüştürür.
Liste 9.16.
3
0 b000
0B111
0 b0101
# => 0
# => 7
# => 5
0 b111_111 . t o _ i n t
( 0 b1_111_11 ) . t o _ i n t
# => 63
# => 63
octal: 8 tabanlı
Onlu sayıtlama sisteminde sayının soluna yazılan 0 ların basamak değeri
yoktur; yani sayının değerini değiştirmezler. Bunu "solda sıfır" deyimiyle
ifade ederiz. Onlu sayıtlama sisteminde 00123 sayısı 123 sayısına eşittir.
Ancak bir çok programlama dilinde solda sıfır 10 tabanına göre yazılan
(decimal) sayının 8 tabanına (octal) dönüştürülmesini sağlar. Ruby dili de
9.3. SAYILARIN FARKLI TABANLARA GÖRE YAZILMASI
109
onlardan biridir. Tamsayı gösteren bir metnin önüne sıfır 0 simgesi konulursa, Ruby onu 8 tabanına göre algılar.
Octal sayılarda sayaklar (digits) 0,1,2,3,4,5,6,7 simgeleridir. Dolayısıyla octal yazılışta 0 − 7 aralığı içinde olmayan karakterler kullanılamaz.
Örneğin, 012345 octal sayısının onlu (decimal) sistemdeki değeri 5349 olur.
Bu dönüşümü, etkileşimli irb kipinde kolayca yapabiliriz. Ruby octal sayıları to_i metodu ile decimal tipe dönüştürür.
Liste 9.17.
012345
0256
0255
#5349
# => 174
# => 173
0111 _111
0111111
01234567
# => 37449
# => 37449
# => 342391
4
9
14
07 7 7 7 7 7 7 7 7 7 7 7 7 7 7
0777 _777_777_777_777
0 1 2 3 4 5 . t o \ _i
0 2 5 6 . t o \ _i
0111 _111 . t o \ _i
9.3.1
# => 351843 720888 31
# => 351843 720888 31
# => 5349
# => 174
# => 37449
hexadecimal: 16 tabanlı
Hexadecimal sayılar 16 tabanına göre yazılmış sayılardır. Hexadecimal sayıların önüne 0X ya da 0x konulur. Ruby bir sayısal literalin önünde 0X ya
da 0x simgesini görünce onu hexadecimal olarak algılar. Hexadecimal sayılarda sayaklar (digits) 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F simgeleridir. Burada A sayağı 10, B sayağı 11, C sayağı 12, D sayağı 13, E sayağı 14 ve
F sayağı 15 yerine geçer. 0x deki x karakteri küçük harf ise 9dan sonraki
sayaklar a, b, c, d, e, f gibi küçük harflerle yazılır. Karşıt olarak, 0X deki X
karakteri büyük harf ise 9dan sonraki sayaklar A, B, C, D, E, F gibi büyük
harflerle yazılır. Örneğin, oxabc == 0XABC == 2748 olur.
Liste 9.18.
Ruby hexadecimal sayıları to_i metodu ile decimal tipe dönüştürür.
1
6
0 x12345
0X1ABC5D2E0F
0XA
0 xa
0 Xf
0x1AB3
#74565
# => 114829372943
# => 10
# => 10
# => 15
# => 6835
110
BÖLÜM 9. INTEGER SINIFI
0XA. t o \ _i
# => 10
0 xabc . t o \ _i
#=> 2748
x=0x123_456_abc_789
# => 20 01600 169767 3
9.3.2
min, max bulma
İki sayının ya da bir sayı arrayinin enküçük ve ve enbüyük değerleri array
sınıfının min ve max metotları ile bulunabilir.
Liste 9.19.
1
6
[ 5 , 1 7 ] . min
[ 5 , 1 7 ] . max
[ 2 3 4 , − 9 8 7 ] . min
[ 2 3 4 , − 9 8 7 ] . max
[ 9 , 7 , − 3 , − 7 , 2 ] . min
[ 9 , 7 , − 3 , − 7 , 2 ] . max
9.3.3
#
#
#
#
#
#
=>
=>
=>
=>
=>
=>
5
17
−987
234
−7
9
Bignum
Ruby’da Bignum tipi (type) 31 bit’e sığmayan tamsayılar içindir. Bignum
sayıların bir sınırı yoktur. Kullanılan sistemin tahsis edebildiği bellek adresiyle sınırlıdır. Bunun anlamı, Bignum sayıların sınırsız olduğudur. Uygulamada bu tip sayılar ancak ağır bilimsel hesaplamalarda kullanılır.
Ruby’de Integer tipler, büyüklüklerine göre kendiliğinden Fixnum ya
da Bignum tipine dönüşür. Kullanılan sayı 31 bite sığıyorsa, ona ana bellekte 31 bitlik bir yer ayrılır. Sığmıyorsa o sayı otomatik olarak Bignum
tipe dönüşür. Bazı dillerde olduğu gibi, Bignum sayıların sonuna L ya da l
yazmak gerekmiyor. Örneğin,
Liste 9.20.
m= 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
m. c l a s s
# => Fixnum ( 1 8 basamak )
4
n= 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
n. class
# => Bignum ( 1 9 basamak )
Download

Integer Sınıfı 9.1 Integer Sınıfına Uygulanan Başlıca Metotlar