7 Mantıksal İşlemler 7.1 true, false, nil Doğru ya da Yanlış değer alan önermelere (ifadelere) mantıksal (logic) deyimler ya da boolean deyimler denilir ([5]). Bir çok dilde mantıksal işlemler true ve false değerlerinden oluşan bir sınıfa ait metotlarla yapılır. Bunlara mantıksal ya da boolean değerler denilir. Bu değerleri içeren sınıfa, çoğu dilde Bool sınıfı adı verilir. and, or, not temel mantıksal bağlaçlardır. Ruby’deki durum oldukça farklıdır. Ruby’de Bool ya da Boolean adında bir veri tipi (sınıf) yoktur. true ve false nesnelerine ek olarak nil nesnesi de mantıksal değer olarak kullanılır. Daha doğrusu mantıksal deyimin değeri yok anlamına gelir. Ruby’nin true, false, nil anahtar sözcükleri bir tek sınıftan üretilmez. Her birisinin kendi sınıfı vardır. Her birisi kendi sınıfının biricik (singleton) nesnesidir. Onların hangi sınıftan türetildiğini görmek için class metodunu kullanabiliriz. Liste 7.1. true . class false . class nilclass # => T r u e C l a s s # => F a l s e C l a s s # => N i l C l a s s false ve nil olmayan mantıksal ifadeler true (doğru) sayılır. nil terimi boş, yani değer yok anlamındadır. Bazı dillerdeki null teriminin oynadığı rolü oynar; atanmış bir değer olmadığı anlamına gelir. BÖLÜM 7. MANTIKSAL İŞLEMLER 88 Gerçekte, Ruby’nin true, false, nil anahtar sözcükleri birer nesneyi işaret eden pointerlerdir. Birer sayı işaret etmezler. Başka bir deyişle, bazı dillerde olduğu gibi, yanlış anlamına gelen false ve nil nesneleri 0 değildir, doğru anlamına gelen true 1 değildir. Ruby’de her şey nesne olduğuna göre, mantıksal ifadeler de birer nesnedir. Bir obj nesnesinin nil olup olmadığını anlamak için 2 o b j == n i l obj . n i l l ? deyimleri kullanılabilir. Örneğin, 3 == nil ya da 3.nil? deyimleri aynı işlevi görür; her ikisinin karşılığı false olur. Liste 7.2. 3 0. class 1. class 0 == f a l s e 0. n i l ? 0 == n i l n i l == f a l s e 1 == t r u e # # # # # # # => => => => => => => Fixnum Fixnum false false false false false #=> simgesinin sağındaki çıktı ifadesi false ise, solundaki mantıksal ifadenin yanlış olduğu anlamı çıkar. 6.satırdan görüldüğü gibi, mantıksal işlemlerde yanlış rolünü oynayan nil nesnesi false nesnesinden farklıdır. Ruby’nin true, false, nil anahtar sözcüklerinin işaret ettikleri nesneler biriciktirler (singleton). Bu demektir ki, true, false ve nil birer tanedir. Birer taneden çok true, false ve nil değerleri olamaz. Her ad bir nesneyi işaret bir pointerdir. Ancak, sözel ifadeyi kısaltmak için pointer ile işaret ettiği nesneyi çoğunlukla aynı sayacak ve "x pointerinin işaret ettiği nesne" demek yerine, kısaca "x nesnesi" diyeceğiz. Ruby’de bir değeri olmayan her nesne nil’dir. Örneğin çok kullandığımız puts, print, inspect gibi metotlar nil’dir. String nesneleri nil’dir, sayılar nil’dir. Bunu görmek için 3 puts puts puts puts puts put print inspect 12 " abc " # # # # # => => => => => nil nil nil 12 abc => n i l => n i l olduğunu görmek yetecektir. 4.satırda puts metodu 12 sayısını yazıyor, sonra onun nil olduğunu belirtiyor. 5.satırda puts metodu "abc" stringini yazıyor, sonra o stringin nil olduğunu belirtiyor. Ruby’de nil olmayan nesneler de vardır. Sınıflar ve modüller nil değildir. Örneğin, 7.1. TRUE, FALSE, NIL 89 Liste 7.3. 5 10 String . n i l ? S t r i n g == n i l Numeric . n i l ? Numeric == n i l Float . n i l ? F l o a t == n i l TrueClass . n i l ? T r u e C l a s s == n i l NilClass . n i l ? nil . nil ? # # # # # # # # # # => => => => => => => => => => false false false false false false false false false true Buradan anlaşıldığı üzere, ilk 9 satırdaki sınıflar nil değildir, ama nil’in kendisi de nil’dir. Örnekler: nil? metodu, öntakısının nil olup olmadığını soruyor. Örneğin, x nesnesi için, x.nil? true ise x nesnesi nil’dir. 5 p u t s ( " Merhaba Ruby " ) . n i l ? 42. n i l ? # false 0. n i l ? # false "" . nil ? # false nil . nil ? # true # true Liste 7.4. 5 10 BasicOject . n i l ? B a s i c O b j e c t == n i l Object . n i l ? O b j e c t == n i l Module . n i l ? Module == n i l Math . n i l ? Math == n i l IO . n i l ? IO == n i l ? # # # # # # # # # # => => => => => => => => => => false false false false false false false false false false Ruby’de true, false ve nil nesnelerinin sayı olmadıklarını anlamak için onlarla aritmetik işlemler yapmayı deneyebiliriz: Liste 7.5. true + 1 false + 0 nil + 1 # => u n d e f i n e d method # => u n d e f i n e d method # => u n d e f i n e d method Benzer eylemi String için de yapabiliriz. Liste 7.6 nil’in String nesnesi olmadığını gösterir. Liste 7.6. BÖLÜM 7. MANTIKSAL İŞLEMLER 90 2 " abc " + n i l # => TypeError : no i m p l i c i t c o n v e r s i o n o f n i l i n t o S t r i n g n i l + " abc " # => NoMethodError : u n d e f i n e d method ‘+ ’ f o r n i l : N i l C l a s s Ruby’de mantıksal bir ifade içindeki nil değeri false gibi davranır. Liste 7.7. 1 true & n i l true | n i l false & nil false | nil 6 t r u e and n i l true or n i l f a l s e and n i l f a l s e or n i l 7.1.1 # # # # => => => => # # # # false false false false => => => => false false false false Mantıksal İşlemler (boolean operations) VEYA (OR) İşlemi p ile q iki mantıksal deyim ise p VEYA q (p||q) işlemi iki mantıksal deyimi birleştirir, birleşik bir deyim yapar. true yerine T , false yerine F koyarsak p ile q ’nun değerlerine göre (p||q) birleşik deyiminin doğruluk değerlerini bir tablo biçiminde daha kolay görebiliriz (bkz. Tablo 7.1). Buna kısa devre V EY A denilir. Gerçekten, p p T T F F q T F T F p || q T T T F Tablo 7.1: [|| işlemi] doğru ise q’yu denetlemeye gerek kalmaz. VE (AND) İşlemi p ile q iki mantıksal deyim ise p ve q (p&q) işlemi iki mantıksal deyimi birleştirir, birleşik bir deyim yapar. 7.1. TRUE, FALSE, NIL 91 p T T F F q T F T F p&q T F F F Tablo 7.2: [& işlemi] p ile q ’nun değerlerini bir tablo biçiminde yazarsak, (p&q) birleşik deyiminin doğruluk değerlerini daha kolay görebiliriz (bkz. Tablo 7.2). Buna kısa devre V E denilir. Gerçekten, p yanlış ise q’yu denetlemeye gerek kalmaz. değil (not) İşlemi p bir mantıksal deyim ise (!p) işlemi p nin değerini true ise false, false ise true yapar. (!) operatörünün öncelik sırası, boolean olmayan operatörlerden sonradır. p ’nin değerlerini bir tablo biçiminde yazarsak, (!p) deyiminin doğruluk değerlerini daha kolay görebiliriz (bkz. Tablo 7.3). p T F !p F T Tablo 7.3: değil işlemi true değerini T , false değerini F ve nil değerini N ile gösterirsek p, q ve r = p & q ve r = p || q mantıksal ifadelerinin alacağı değerler aşağıdaki tablolarda gösterilmiştir. p N N F q N F N p&q N N F Tablo 7.4: [nil ile AND işlemleri] BÖLÜM 7. MANTIKSAL İŞLEMLER 92 p N N F q N F N p || q N F N Tablo 7.5: [nil ile OR işlemleri] 7.2 Karşılaştırma Operatörleri Karşılaştırma (mukayese) Operatörleri, hemen her programlama dilinde olan ve Liste 7.8’de görülen operatörlerdir. Bazı kaynaklarda bunlara ilişkisel (relational) operatörler denilir. Karşılaştırma operatörlerini mantıksal deyimler oluştururken kullanırız. Ruby’de bütün nesnelere mukayese operatörleri uygulanabilir. Hepsi için öncelik sırası aynıdır ve boolean operatörlerinden öncedirler ([1]). Liste 7.8. <, <=, >, >=, ==, !=, is, is not Bu operatörler, soldaki nesneyi sağdaki ile karşılaştırır. Sözdizimleri ve açıklamaları Tablo 7.6’de görülmektedir. Sözdizimi x<y x <= y x>y x >= y x == y x != y x is y x is not y Açıklama x nesnesi y x nesnesi y x nesnesi y x nesnesi y x nesnesi y x nesnesi y x nesnesi y x nesnesi y nesnesinden küçük mü? nesnesinden küçük mü ya da ona eşit mi? nesnesinden büyük mü? nesnesinden büyük mü ya da ona eşit mi? nesnesine eşit mi? nesnesinden farklı mı? nesnesi ile aynı mı? nesnesinden farklı mı? Tablo 7.6: Karşılaştırma Operatörlerinin Sözdizimi Karşılaştırma İçin Genel Kurallar • Karşılaştırılan nesneler birbirleriyle mukayese edilebilir olmalıdır. Çoğunlukla karşılaştırılan nesneler aynı tipten olur. • < ,<=, >, >= operatörlerinin öncelik sıraları, karşılaştırılan nesnelere bağlıdır. 7.3. ALIŞTIRMALAR 93 • Sayılar için standard sıralama kullanılır. • Boolean değerler için false önce, true sonra gelir. • String tipler için alfabetik sıra kullanılır. ascii stringleri için, karekterlerin ascii kodları sıralamayı belirler. • Kümeler için altküme üstkümeden önce gelir. • Değişemez (immutable) tiplerde is operatörü == operatörüne, is not operatörü != operatörüne denk işleve sahip olur. • Değişebilir (mutable) tiplerde x == y olmak üzere, x değişirse y de değişir. 7.3 Alıştırmalar Liste 7.9. 1 6 2 < 5 3 < 3 " abc " <= " ad " 3 <= 3 5 > 2 3 == 3 2 != 4 # # # # # # # => => => => => => => true false true true true true true && ile and ve= operatörlerinin öncelik sıraları farklıdır. Önceden sonraya doğru sıralama şöyledir: 3 1 . \&\& 2. = 3 . and Aşağıdaki iki programı karşılaştırınz. Parantezlerle doğru önceliğin nasıl belirlenebileceğini görünüz. Liste 7.10. 2 > > > > t e s t = f a l s e and t r u e test # => f a l s e t e s t = t r u e and f a l s e test # => t r u e # => f a l s e # => f a l s e Açıklamalar: Atama (=) operatörü ikisi arasındadır. O nedenle, 1. satırda öncelik (=) operatörünündür Dolayısyla bütün ifade [(test = false) and true] BÖLÜM 7. MANTIKSAL İŞLEMLER 94 olur. 1.satır (false and true) == false olur. 2.satır için test == false değeri yazılıyor; false çıktısı gelir. 3.satır ise [(test = true) and false] ifadesine eşittir. 3.satır true and false== false değerini veriyor. 4.satır ise test=true değerini yazıyor. Liste 7.11. 1 b = f a l s e && t r u e b # => f a l s e b = t r u e && f a l s e b # => f a l s e # => f a l s e # => f a l s e Açıklamalar: Bu örnekte && operatörü atama operatörünün önüne geçtiği için, daima eşitliğin sağındaki değerler yazılıyor. Önceliği Belirlemek && ile and ve= operatörlerini içeren bir ifade yazarken, parantez kullanarak öncelikleri istediğimiz gibi yapabiliriz; çünkü () parantezi sözkonusu operatörlerden önce gelir. Örneğin Liste 7.10 için önceliği eşitliğin sağındaki ifadelere vermek için, test = (true and false) yazmak yetecektir. Liste 7.12. 1 n i l . to_s n i l . to_i # => " " # => 0 Liste 7.13. 3 4 && 5 n i l && t r u e t r u e && n i l true | | n i l nil || "" # # # # # => => => => => 5 nil nil true "" Liste 7.14 içindekileri irb’de tek tek deneyiniz. Liste 7.14. 7.3. ALIŞTIRMALAR t r u e && t r u e # => f a l s e && t r u e # => 1 == 1 && 2 == 1 # => " t e s t " == " t e s t " # => 1 == 1 | | 2 != 1 # => t r u e && 1 == 1 # => f a l s e && 0 != 0 # => t r u e | | 1 == 1 # => " Ankara " == " A n k a r a l ı " # => 1 != 0 && 2 == 1 # => " Ankara " != " A n k a r a l ı " # => " t e s t " == 1 # => ! ( t r u e && f a l s e ) # => ! ( 1 == 1 && 0 != 1 ) # => ! ( 1 0 == 1 | | 1000 == 1 0 0 0 ) ! ( 1 != 10 | | 3 == 4 ) # => 1 == 1 && ( ! ( " A n k a r a l ı " == 1 5 10 15 95 true false false true true true true true false false true false true false # => f a l s e false | | 1 == 0 ) ) # => t r u e Ruby’de mantıksal değerlerin true, false ve nil değer aldığını biliyoruz. Mantıksal ifade içinde yer alan nil, öteki mantıksal değerlerle and, or, && ve || operatörleriyle etkileşebilir: Liste 7.15. t r u e and n i l t r u e && n i l # => n i l # => n i l true or n i l true | | n i l # => t r u e # => t r u e f a l s e and n i l f a l s e && n i l # => f a l s e # => f a l s e f a l s e or n i l false || nil # => n i l # => n i l ! nil not n i l # => t r u e # => t r u e 3 8 13 Değişkenler nil olabilir Değerler nil olabilir Değerler true ya da false değer alabilirler nil bir nessnenin değerinin olmadığı anlamına gelir Sayılar, string’ler, true, false ve nil’in kendisi nil’dir. Sınıflar ve modüller nil değildir. Liste 7.16. 96 1 6 BÖLÜM 7. MANTIKSAL İŞLEMLER if false print "a" e l s i f true print "b" else print " c " end Liste 7.17. if 0 3 print "a" elsif 1 print "b" else print " c " end Aşağıdaki programı eğlence diye çalıştırınız. Sonra da hangi kodun çalıştığını anlamaya çalışınız. Liste 7.18. if 3 true p u t s " e v r e n s e l d o ğ r u l a r v a r d ı r , yok mu? " else puts " e v r e n s e l y a n l ı ş l a r var mıdır ? " end if 8 13 nil p u t s " n i l : y o k l u k doğrudur ; " else puts " n i l : yokluk y a n l ı ş t ı r " end if false puts " f a l s e mantıksal deyimdir " else p u t s " f a l s e m a n t ı k s a l deyim d e ğ i l d i r " end
© Copyright 2024 Paperzz