C# Mantıksal veri türü (Boolean)
Mantıksal veri türü (Boolean) Gerçek hayattaki doğruların çoğu anlaşılması güç kavramlardır. Oysaki bilgisayar programlarında doğruların anlaşılması çok daha kolaydır. Örneğin bilinen bir tamsayının 100’den daha büyük olup olmadığını veya bilinen bir string ifadenin “kitap” kelimesiyle özdeş olup olmadığını bilmek son derece kolaydır.
C#’ta mantıksal bir veri tipi aşağıdaki gibi tanımlanır:
bool buyuk;
C#’ta bool anahtar kelimesini kullanarak bir değişkeni mantıksal bir değişken olarak tanımlayabilirsiniz. Nasıl int kelimesi System.Int32 sınıfının bir aliası , string de System.String sınıfının bir aliası ise, bool da System.Boolean sınıfının bir aliasıdır.
Mantıksal türlerin 0 ve 1 değerlerinden oluştuğunu düşünebilirsiniz. Aşağıdaki atama işlemi yanlıştır.
buyuk=0; //Çalışmaz
Bir tamsayıyı mantıksal bir değişkene atamaya çalışıyorsunuz. 0 ya da 1 yerine true ve false anahtar kelimelerini kullanmanız gerekiyor.
buyuk=true;
Yine tamsayılarda olduğu gibi mantıksal türde bir değişken tanımlanırken ilk değer ataması da yapılabilir.
bool buyuk=true;
true ve false anahtar kelimeleri küçük harfle yazılmalıdır.
Yine sayısal türlerde olduğu gibi mantıksal türde de sabit tanımlamak mümkündür.
const bool buyuk=true;
Bu durumda buyuk isimli değişkenin değeri programın ilerleyen kısımlarında false olarak değiştirilemez.
Sayısal ifadeler yalnızca rakamlardan oluşurlar. Mantıksal ifadeler de mantıksal değerlerden oluşurlar (true ve false). Mantıksal değişkenler ile normal aritmetik operatörleri (+, -, %, /) kullanamazsınız. Bunların yerine C#’ta üç tane mantıksal operatör kullanılır. Bunlar: AND,OR ve XOR operatörleri.
C#, mantıksal operatörleri de C’den miras almıştır. AND işlemi için ampersand işareti (&) ya da kısaca söyleyecek olursak “ve” işareti kullanılır.
İngilizce kısaltmada genel olarak VE olarak bilinen mantıksal AND’i kullanmak için ampersand (&) kullanılır. Boolean ifade:
Yagmurlu & Karli;
Yukarıdaki ifadenin sonucu hem Yagmurlu hem de Karli değerli true olduğu zaman true olur.
bool KarlaKarisikYagmur = Yagmurlu & Karli;
Mantıksal ifadeler arasında yapılan AND işleminin sonuç tablosu aşağıdaki gibidir:
Mantıksal İfade 1
Mantıksal İfade 2
AND İşlemi Sonucu
false
false
false
false
true
false
true
false
false
true
true
true
İkinci mantıksal operatör ise OR (veya) operatörüdür. Bu operatör klavyedeki dikey bar çubuğu (|) işareti ile gösterilir.
Yagmurlu | Karli
Yukarıdaki ifadenin sonucu, herhangi birisinin değeri true olduğu zaman true olur.
bool Yagislimi = Yagmurlu | Karli
Mantıksal ifadeler arasında yapılan OR işlemin sonuç tablosu aşağıdaki gibidir:
Mantıksal İfade 1
Mantıksal İfade 2
OR İşlemi Sonucu
false
false
false
false
true
true
true
false
true
true
true
true
Üçüncü mantıksal operatör Exclusive OR (Özel Veya) operatörüdür. Kısaca XOR olarak kullanılır. Bütün C temelli dillerde şapka işareti ya da inceltme işareti olarak bilinen (^) işareti ile gösterilir. Bir XOR işleminin sonucunun true olabilmesi için sadece bir tanesinin true olması gerekir, her ikisi de true ya da her ikisi de false olursa sonuç false olur. Şimdi bu ifadeyi daha iyi anlamak için aşağıdaki tabloyu inceleyelim.
Mantıksal İfade 1
Mantıksal İfade 2
XOR İşlemi Sonucu
false
false
false
false
true
true
true
false
true
true
true
false
Aklımızda kalması için şu şekilde de düşünebilirsiniz: Eğer mantıksal ifadelerin ikisi birbirinden farklı ise sonuç true olur, aynı iseler false olur.
Şimdi iki tane atom düşünelim. Birisi negatif diğeri pozitif olan iki atom birbirini çeker, her ikisinin de işareti aynı ise birbirini iterler. Bunun için Cekim diye bir değişken tanımlayalım. Atomlarımızın değerlerine bakarak birbirlerini çekip çekmeyeceklerini inceleyelim.
bool Cekim = Atom1 ^ Atom2;
AND, OR ve XOR operatörlerinin her üçü de ikili operatörlerdir, şimdi de tekli operatörleri inceleyelim. NOT (Değil) operatörü tekli bir operatördür. Mantıksal tersleme operatörü de diyebilirsiniz. Ünlem işareti ile temsil edilir.
Kisa = !Uzun;
Eğer Uzun değeri true ise Kisa değeri false olacaktır, tersi durumda da Kisa değeri true olacaktır.
XOR işleminin sonucunu diğer operatörleri kullanarak da elde edebilirsiniz.
C = (A - B) & !(A & B);
C = A ^ B;
Yukarıda verilen işlemlerin her ikisi de aynı sonucu verir.
Yukarıda verilen ilk ifadede birkaç tane parantez kullandık. Bu ifadeyi operatörlerin işlem önceliği kurallarına göre inceleyecek olursak, NOT işlemi (! İşareti), tekli operatördür ve yüksek bir önceliğe sahiptir. AND işlemi ise ikili operatördür ve NOT işlemine göre daha düşük bir önceliği vardır. Eğer bu kuralları iyi bilmezseniz gereksiz parantezler kullanmak zorunda kalırsınız. AND işlemi ile NOT işlemi arasındaki işlem önceliğini bilmeseydik, gereksiz bir tane daha parantez kullanacaktık.
AND, OR ve XOR operatörlerini bitişik atama operatörü olarak da kullanmak mümkündür.
bToggle = bToggle ^ true;
bToggle ^= true;
Yukarıdaki her iki işlemin de sonucu aynıdır. Yeri gelmişken bahsedelim, yukarıda verdiğimiz örnek çok özel bir durum örneğidir. bToggle değeri ne ise bu işlemin sonucunda değeri tersi olur. Eğer bToggle true ise false olur, false ise true olur.
Boolean ifadelerin dizisi de yapılabilir.
bool abYagmurluGunler = new bool[31];
Burada önceden bahsettiğimiz bir konuyu da hatırlatmakta yarar var. Diziler daima belleğin heap bölgesinde tutulur. heap bölgesinde tutulan değişkenlerin de daima bir ilk değeri olur. Mesela sayısal ifadeler 0’a eşittir. string ifadeler null değerine sahiptir. Bir bool dizisinde de ilk değerler daima false değerine eşit olacaktır.
.Net Framework içerisindeki bütün yapılar gibi System.Boolean yapısının da bir ToString yöntemi vardır. Ama bu yöntemden True ve False kelimeleri döner. Eğer Console.WriteLine yöntemine bir bool ifadeyi gönderirseniz ekranda True ya da False görünecektir. Bildiğiniz gibi, C# anahtar kelimeleri olan true ve false ise küçük harfle başlarlar.
bool b = Boolean.Parse(str);
System.Boolean yapısının static olan bir de Parse yöntemi vardır. Bir string argüman alır. Büyük küçük harf duyarlılığı olmaksızın true ya da True, false ya da False geçebilirsiniz argüman olarak.
Çok güçlü bir sınıf olan Convert sınıfı bütün türleri birbirine dönüştürebildiği için, bir sayısal ifadeyi bool bir ifadeye dönüştürebilir.
bool b = Convert.ToBoolean(mValue);
0 değeri false ifadesine dönüşür, 0 olmayan ifadeler ise true ifadesine dönüşür. Bir boolean değeri sayıya dönüştürürsek, true ifadesi 1 değerine, false ifadesi de 0 değerine dönüşür.
decimal mValue = Convert.ToDecimal(b);
Şimdi sadece bool değişkenlerden oluşan bir program yazalım. Kedi satan bir evcil hayvan satıcısına gittiğinizi düşünün. Kısırlaştırılmış, beyaz ya da kahverengi bir erkek kedi istiyorsunuz; ya da kısırlaştırılmış, beyaz haricinde herhangi bir renkte olan bir dişi kedi istiyorsunuz ya da bir kedi istiyorsunuz sadece siyah renkli olması yeterli. Şimdi programı yazmaya başlayalım.
using System;
classKediSecimi
{
staticvoid Main()
{
bool bErkek, bKisir, bSiyah, bBeyaz, bKahverengi, bUygun;
Console.Write("Kedi erkek mi? true ya da false: ");
bErkek = Boolean.Parse(Console.ReadLine());
Console.Write("Kedi kısırlaştırılış mı? true ya da false: ");
bKisir = Boolean.Parse(Console.ReadLine());
Console.Write("Kedi siyah mı? true ya da false: ");
bSiyah = Boolean.Parse(Console.ReadLine());
Console.Write("Kedi beyaz mı? true ya da false: ");
bBeyaz = Boolean.Parse(Console.ReadLine());
Console.Write("Kedi kahverengi mi true ya da false: ");
bKahverengi = Boolean.Parse(Console.ReadLine());
bUygun = (bErkek & bKisir & (bBeyaz | bKahverengi)) |
(!bErkek & bKisir & !bBeyaz) |
bSiyah;
Console.WriteLine("Uygunluk Durumu: " + bUygun);
}
}
Programda kullanıcıya bir dizi soru soruluyor ve true ya da false olarak cevap bekleniyor. Kullanıcının girdiği string değerleri Boolean.Parse yöntemi yardımıyla bool değerlere dönüştürüyoruz. bUygun ifadesi de girdiğimiz kriterlere göre sonucu bulup bize bildiriyor.
Programda renklerle ilgili bir problem var aslında. Kullanıcı sadece bir tane renk içni true demesi gerekirken birden çok renk için true diyebilir, bunu engelleyebiliriz ama detaya girmeyelim, kullanıcıya doğru bilgiler gireceği konusunda güvenelim şimdilik.
Boolean cebirinde bazı kolaylıklar sağlayan De Morgan kuralları diye bir dizi kural var. İngiliz matematikçi Augustus De Morgan adı aynı zamanda ADA programlama dili ve ilk bilgisayar programı ifadeleri ile de birlikte anılır.
De Morgan der ki, “OR işleminin olumsuzu her bir değerin olumsuzunun alınıp AND işlemine tabi tutulmasına eşittir.” ve “AND işleminin olumsuzu, her bir değerin olumsuzunun alınıp OR işlemine tabi tutulmasına eşittir.”
!(A| B) eşittir !A & !B
!(A & B) eşittir !A | !B
bool YagisliHava = Yagmurlu | Karli
Şimdi AcikHava durumunu düşünelim, YagisliHava durumunun olumsuzudur.
bool AcikHava = !(Yagmurlu | Karli)
Şimdi De Morgan kuralı ile yazalım bu ifadeyi daha açıklayıcı olur.
bool AcikHava = !Yagmurlu & !Karli
Cümle olarak yazarsak “Hava yağmurlu değilse ve karlı da değilse açıktır.” Gayet anlaşılır oldu.