C# dilinin yapıtaşlarından sayılan değişkenlere önceki yazımızda değinmiştik. Farklı kullanımlar için çeşitli tipleri bulunan değişkenleri inceledikten sonra, yazdığımız programın akışına yön verecek karar verme mekanizmalarından bahsetmenin zamanı geldi. Program kodları yorumlanmaya başladıktan sonra düz bir akışı takip ederek satır satır işlenirler. Ancak programın gerektirdiği bazı kararlar, girdiler ve mantıksal nedenlerden ötürü bu akışın dallara ayrılarak farklı yönlere gitmesini sağlamak isteyebiliriz. Bu durumda program yürütülürken önceki satırlara geri dönebilir veya ilerideki kod parçalarını çalıştırabilir.

Öncelikle şunu söylemek gerekir ki program akışının yön değiştirmesini sağlayan karar ve kontrol mekanizmaları olmasaydı, bilgisayarların pahalı bir metal yığınından farkı kalmazdı. Programların çeşitli koşullara göre farklı işlemler yapabilmesi, insanların gerçek hayatta farklı koşullar altında farklı davranışlar göstermesi gibidir. Gerçekleştireceği bir eylemde birçok seçenek arasından bulunduğu koşula uygun olanını seçerek tamamlamasına neden olur. Örneğin sabah uyandığınızda nasıl kıyafet seçtiğimizi düşünelim. Dolabımızda birçok çeşit kıyafet olabilir, ancak biz dışarıdaki hava durumuna bakıp karar verir, güneşli ve sıcak bir günde kazak ya da yağmurluk yerine ince bir t-shirt giymeyi tercih ederiz. Bilgisayar programları da amacı doğrultusunda değişik koşulları göz önünde bulundurarak çalışmasını sürdürür.

Karar verme mekanizmalarının çalışması, belli bir koşulun mantık değeri olarak doğru veya yanlış olarak değerlendirilmesiyle ilgili kod bloğunun işlenmesine dayanır. Mantıksal ifadelerin koşul içerisinde değerlendirilmesi, önceki yazımızda bahsettiğimiz mantıksal (boolean) değişkenler kullanılarak yapılır. Hatırlatmak gerekirse, doğru (true) veya yanlış (false) olabilen bu ifade türleri, koşullarını durumunu belirlemek için kullanılır. Bir ifadenin doğru veya yanlış olduğu, programcılar tarafından tanımlanan boolean değişkenler ile belirlenebildiği gibi, mantık öğeleri veya ilişkisel operatörler kullanılarak da belirlenebilir.

Mantıksal İfadeler

Belirli koşulların sağlanması için, sonucu doğru ya da yanlış olan ifadeler kullanırız. Bu ifadelerin doğru ya da yanlış olması ilişkisel operatörler ve mantık öğeleri ile belirlenir. İlişkisel operatörler rakam, harf gibi temel değişkenleri veya nesneleri karşılaştırmaya yarayan, karşılaşma sonucunda bir mantık değeri (true veya false) döndüren operatörlerdir. Tablo 1 de (yazının hemen altında) inceleyebileceğiniz bu operatörler, sağda yazılan değeri soldaki ile karşılaştırarak bir sonuç verirler. Bir değerin diğerine göre büyüklüğü veya eşit olması, program kontrollerinde ve ileride değineceğimiz iterasyon (yenileme) kontrolleri içerisinde sürekli kullanacağımız karşılaştırma yapılarıyla belirlenir.

Koşullar içerisinde birden fazla mantıksal ifade kullanmamız gerekebilir. Bu gibi durumlarda “VE operatörü” olan “&&” ile “VEYA operatörü” olan “||” kullanarak mantıksal değerleri bağlayabiliyoruz. Bir şartın gerçekleşebilmesi için bütün mantıksal değerlerin doğru olması gereken durumlarda VE operatörünü kullanarak bu doğruluğu sınayabiliriz. Şartlardan birinin doğru olması koşulun doğru olması için yeterli ise VEYA operatörü kullanarak bu koşulun doğru sonuç vermesini sağlayabiliriz. Ayrıca mantıksal bir değeri (boolean) tam tersine çevirmek için değil (NOT)  operatörü olan ünlem “!” işaretini ifadenin başına yazmamız yeterlidir. Örneğin iki sayı değişkeninin 10 ile 100 arasında olup olmadığını kontrol etmek istiyoruz. Bu durumda aşağıdaki gibi bir ifade kullanarak iki karşılaştırma ifadesiyle istediğimizi gerçekleştirebiliriz:

int sayi = 30;

Boolean sonuc = (sayi > 10) && (sayi < 100);

Buradaki sonuç değişkeni, üst satırda girilen sayı değişkeninin hem 10’dan büyük hem de 100’den küçük olması koşulunun doğruluğunu bir arada arayacaktır. Bizlere boolean değer döndüren son mantıksal öğemiz ise, değişkenlerin türünü kontrol etmemize yarayan “is” anahtar sözcüğü. Diğer anlattığımız mantıksal ifadeler kadar çok kullanmayacağımız bu komut ile, tanımlı olan değişkenlerin hangi nesne türüne veya sınıfına dahil olduğunu anlayabiliriz. Küçük bir örnek vermek gerekirse:

int sayi = 30;
Console.WriteLine(sayi is int);

şeklinde basit bir ifade yazarsak, “sayi” isimli değişken int tipinde olduğu için konsola doğru (True) değerini yazdırdığını görebiliriz.

IF & ELSE Kontrolleri

Buraya kadar program kontrol elemanlarından bahsettikten sonra, sıra geldi bu kontrollerin nasıl yapıldığını görmeye. İngilizcede “eğer” anlamına gelen if kelimesi, birçok programlama dilinde olduğu gibi C# içerisinde de en çok kullanılan kontrol söz dizimi olarak karşımıza çıkıyor. Kullanımı if(koşul) şeklinde olan bu yapı, “eğer” parantez içerisindeki koşul doğru ise önünde bulunduğu kod bloğunu çalıştırıyor. Süslü parantezler ile oluşturduğumuz kod bloğu, eğer koşul sağlanamazsa es geçiliyor ve içerisindeki komut satırları çalıştırılmıyor. Hemen ilk örneğimize bakarsanız (Kod 1) burada tanımladığımız “hava” ismindeki string değişken, if içerisinde ilişkisel operatörler kullanılarak kontrol ediliyor ve eğer değeri koşul içinde belirtilen değere eşit ise altındaki kod bloğunun çalıştırılması sağlanıyor.

Oldukça basit hazırladığımız ilk örneğimizde değişkenimizin değeri koşul içerisinde belirtilen ile aynı olursa ekrana bir satır yazı yazdırıyoruz. (Yazının altında örnek kodları bulabilirsiniz.)

İkinci örneğimize bakacak olursak, birbirini tamamlayan iki if kontrolünün iç içe kullanıldığını görebiliriz. Dışarıdaki if, cinsiyet değişkenini kontrol ederken, içerideki if kontrolleri yaşın 18’in üzerinde olup olmadığını kontrol ediyor. Eğer üzerinde ise ilk if içerisindeki kod bloğu çalışıyor ve askere gitmek için uygun olduğunuz mesajını alıyorsunuz. Yaş değişkeninin 18’in altında olması durumda ise diğer kod bloğu içerisindeki komut satırı çalışıyor. Buradaki sorun, bizim farklı koşullar için farklı if kontrolleri yazarak gereksiz yere işlem yapıyor olmamız. Elinizde yapacak birden çok seçeneğiniz olduğunda, hepsi için bir if kontrolü yazmadan tek bir ifade ile bu koşulları değerlendirmemiz için, Türkçeye “aksi halde” olarak çevirebileceğimiz “else” komutu yardımımıza koşuyor.

Kontrol ifadesinin koşulu olarak verdiğimiz boolean ifade yanlış (false) bir değer döndürdüğünde, yani aradığımız koşul olmadığında else ifadesinin ardından yazdığımız bir kod bloğunun çalıştırılması mümkün Üçüncü örneğimizde bir sayı değişkeninin % operatörüyle 2’ye bölümünden kalan sayıyı buluyoruz ve bu sayıyı 1’e eşitleyerek tek ya da çift sayı olduğunu belirliyoruz. Üstelik iki eylem için tek bir if kontrolü kullanarak işlem zamanını da azaltmış oluyoruz.

Programımızda yapılan işlem sayısını azaltmak için birbiri ile ilişkili koşulları yine else komutu ile birbirine bağlamamız mümkün. Yazılan ilk if bölümünden sonra “eğer böyle değil ise” anlamında “else if(koşul)” yapısında kontrolü bir zincir halinde uzatmamız mümkün. Bu tür zincirlerde gerekli koşul sağlandığında zincirin alt elemanları değerlendirmeye alınmayacağından işlemden tasarruf edebiliyoruz. Lise yıllarımızdaki not sistemini hatırlayabildiğim kadarıyla dördüncü örneğimizde kullanmaya çalıştım. Burada not isimli bir sayı değişkeni ile not baremimizi bulmaya yarayan bir if zinciri oluşturduk. Mantıksal bağlayıcı VE operatörü (&&) ile not aralıklarını belirlediğimiz koşullar çalışacak kod bloğunu belirliyor ve buradaki yazının konsola yazılması sağlanıyor. Eğer not değeri else if ile oluşturduğumuz bloklara giremeyecek kadar düşük ise en sona yazdığımız else ifadesindeki kod çalışıyor.

Kontrollerin işlem sayısını önemli ölçüde azaltan zincirleme koşullar yapısına değinmişken, bu yapıyı daha kolay bir biçimde kullanmamıza imkân veren switch yapısından da bahsedelim. Tek bir değişkeninize bağlı birden fazla koşul olduğu ve bu koşulların hepsinde bir eşitliğin arandığı durumlarda switch kontrolü yazdığınız kodu oldukça kısaltacaktır. Switch(değişken) yapısıyla koşulların bağlı olduğu değişkenin ismini alır ve süslü parantezler arasına değişkenin alabileceği değerler “case DEĞER:” şeklinde yeni bir durum olarak ifade edilir. Farklı değerler için yeni “case”ler oluşturmalı ve çalışacak kod bloğunu bu sefer süslü parantezler kullanmadan “case”lerin altına yazmalısınız. Süslü parantez olmadığı için gereken kodları yazdıktan sonra bitirdiğinizi en sona yazacağınız “break” komutu ile belirtiyoruz.

Switch kullanarak her yeni durum (case) oluşturduğunuzda ilk dikkat etmeniz gereken, yazdığınız değerlerin türleri olacaktır. Tipi int olan bir değeri direkt yazabiliyorken, char tipler için tek tırnak (‘’), string tipindeki değerler için çift tırnak  (“”) kullanmamız gerektiğini unutmamalıyız. Son kod örneğimizi incelerseniz, burada string tipindeki il değerlerinin switch komutuyla eşini bulmasını sağlıyoruz. Öncelikle bahsetmemiz gereken, zincirleme else-if serilerinde verdiğiniz değer hiçbir koşula uymuyorsa geçerli olan koşulu belirlemek için en sona yazdığımız else ifadesi, switch yapısı içerisinde “default” anahtar sözcüğüyle aynen kullanılabiliyor. Kullanımı zorunlu olmayan default komutunu kullanırsanız, verdiğiniz değer mevcut “case”ler içerisinde bulunamazsa çalıştırılacak bölümü belirlemekte. Ayrıca aynı kod bloğuna birden fazla koşulda erişilebilmesi gibi durumlarda, birden fazla case başlığını üst üste yazarak kullanabilirsiniz. Bizde örneğimizde küçük harf ve büyük harf yazılan şehir isimleri de aynı değeri verdiği için bu tür bir yol izledik.

Bütün kontrol yapılarına değindikten sonra artık C# ile kendi kararlarını verebilen işlevsel programlar yazmaya başlayabileceğinizi rahatlıkla söyleyebiliriz. Mevcut örneklerimizi değiştirip geliştirerek ilk etapta denetimlerin nasıl çalıştığı konusunda tecrübe edinmenizi tavsiye ederim. İyi çalışmalar!

p.s. Bu makale Eylül 2008 tarihinde yazılmıştır.

Tablo 1:

Karşılaştırma Türü Operatör Örnek Sonuç
Eşittir == 1 == 2 Yanlış
Eşit Değildir != 1 != 2 Doğru
Büyüktür > 1 > 2 Yanlış
Küçüktür < 1 < 2 Doğru
Büyük Eşittir >= 1 >= 2 Yanlış
Küçük Eşittir <= 1 <= 2 Doğru

Örnek Kod 1:


static void Main(string[] args)

{

string hava = "GÜNEŞLİ";

if (hava == "GÜNEŞLİ")

{

Console.WriteLine("Bugün t-shirt giyeceğim.");

}

}

Örnek Kod 2:


string cinsiyet = "ERKEK";

int yas = 21;

if (cinsiyet == "ERKEK")

{

if (yas >= 18)

{

Console.WriteLine("Askere gitme vaktiniz gelmiş.");

}

if (yas < 18)

{

Console.WriteLine("Askerlik için henüz erken.");

}

}

Örnek Kod 3:


static void Main(string[] args)

{

int sayi = 30;

if (sayi % 2 == 1)

{

Console.WriteLine("Tek Sayı!");

}

else

{

Console.WriteLine("Çift Sayı!");

}

}

Örnek Kod 4:


int not = 71;

if (not <= 100 &amp;&amp; not >= 85)

{

Console.WriteLine("5 Pekiyi");

}

else if (not < 85 &amp;&amp; not >= 70)

{

Console.WriteLine("4 İyi");

}

else if (not < 70 &amp;&amp; not >= 60)

{

Console.WriteLine("3 Orta");

}

else if (not < 60 &amp;&amp; not >= 50)

{

Console.WriteLine("2 Zayıf");

}

else

{

Console.WriteLine("1 Geçmez");

}

Örnek Kod 5:


string il = "İSTANBUL";

switch (il)

{

case "ANKARA":

case "ankara":

Console.WriteLine("Plaka: 06");

break;

case "İSTANBUL":

case "istanbul":

Console.WriteLine("Plaka: 34");

break;

case "İZMİR":

case "izmir":

Console.WriteLine("Plaka: 35");

break;

default:

Console.WriteLine("Hatalı giriş.");

break;

}

Kodlar tam olarak buna benzemeli! :))

Related posts:

  1. C# Dersleri – 2: Programciliga Giris
  2. C# Dersleri – 1: .Net Framework
  3. Ajax Extender nesnelerinin kullanimi
  4. Web Sayfaniza Virtual Earth Haritalari Ekleyin
  5. ASP.NET Ajax kullanarak iletisim formu hazirlamak