9 Eylül 2012 Pazar

C# 'da Döngüler - While, Do-While Döngüleri


            Merhaba arkadaşlar. Daha önceki yazılarımda da c shrap 'ta bu iki döngüyü ele almıştım. Bu yazımda da daha zengin bir anlatım ile while ve do-while döngülerini sizlere sunmaya çalıştım.

WHILE Döngüsü
While döngüsü de yine c sharp programlama dilinde sıkça kullanılan ve çok kullanışlı bir döngü tipidir. Parantezler içerisine for döngüsünün 2. bölümünde olduğu gibi bool tipine bir ifade (expression) isteyecektir. Bu bool ifede sağlandığı sürece döngünün dönmesi devam edecektir. Bu yüzden while kelimesinin türkçe anlamı “iken” olduğuna dikkat edersek; while döngüsü, döngü koşulu sağlandığı sürece dönmesi istenilen senaryolarda tercih edilir.

Kullanım şekli ise aşağıdaki gibidir.
         
     while (koşul)
            {
                //Koşul sağlandığı sürece çalışacak olan kod bloğu
            }

Bu bool tipindeki ifadenin, for döngüsündeki gibi tam olarak belirli bir bitiş noktası olmaması ile birlikte, yine for döngüsünün 3. bölümü (iteration)  gibi döngü değişkeni üzerinde bir öteleme ve yahut berilemeye ihtiyaç duyulmaz. Zaten hali hazırda while döngüsünde döngü değişkeni bulunmaz. Fakat istenirse bir değişken tanımlanıp ve while döngüsü içerisinde bu değişkenin değeri arttırılarak veya azaltılırak, for döngüsünün çalışma prensibi gibi çalıştırılabilir. Aşağıdaki örnekte bir while döngüsünün, for döngüsü gibi nasıl kullanılacağını görmekteyiz.

     int i = 0;
            while (i < 100)
            {
                i++;
                //Döngü içerisinde tekrar edilmesi istenen kodlar.
            }

Fakat tam ters mantık ile düşündüğümüzde for döngüsü, while döngüsü gibi kullanılamaz. Çünkü for döngüsünde bir bitiş noktası ve iteration part bulunmak zorundadır. Bu nokta da while döngüsünün diğer döngülere göre ayırt edici özelliğini ve güzelliğini görmekteyiz.
Aşağıdaki örnekte program, kullanıcıdan bir tuş basmasını istiyor ve basana kadar da  Console.ReadKey() kod satırı ile program akışını bu satırda bekletiyor. RaedKey metodu kullanıcıdan her hangibir tuşa basmasını bekler. Console.ReadLine () ise sadece enter tuşuna basılmasını bekler. Daha sonra CapsLock tuşu aktif mi yoksa değil mi kontrol ediyor. Bu kontrolü Console sınıfının geriye bool değer dönen CapsLock özelliği sayesinde yapıyor. While döngüsündeki koşulun başında ! (değil operatörü) olduğu için CapsLock tuşu False yani pasif olduğu sürece döngü dönmesine devam ediyor.
  
     while (!Console.CapsLock)
            {
                Console.Write("Lütfen bir tuşa basınız..");
                readline enter a basılmasını bekler
                Console.ReadKey(); 
                Console.WriteLine();
                Console.WriteLine("CapsLock: {0}", Console.CapsLock);
                Console.WriteLine();
            }

Ekran Çıktısı

           
C sharp ta başka kullanım alanlarını düşündüğümüzde, Sql Server ‘daki bir veritabanındaki bir tablodan tüm birden fazla kaydın (satırın) gelmesi istendiğinde: Ado.Net teknolojisinin bize sunmuş olduuğu System.Data.SqlClient kütüphanesinin altındaki sınıflardan bir tanesi olan SqlDataReader nesnesinin Read() metodunun kullanılması gerekir. Bu metod satırı okuyabildiği sürece alt satıra geçer ve aynı zamanda da yine okuyabildiği sürece geriye bool değer döndürür. Bu örnekte geliştiricinin, while döngüsünü kullanmasının gerekliliği, veri tabanına sorulan sorgu sonucunda kaç adet satır döneceği geliştirici tarafından kesin olarak kestirilememesidir. Bu yüzden aşağıdaki gibi bir while döngüsü kullanmak gerekir.

SqlConnection con = new SqlConnection("Server=.;Database=Northwind;UID=sa;PWD=1");
SqlCommand com = new SqlCommand("Select FirstName, LastName from Employees", con);
con.Open();
SqlDataReader dr = com.ExecuteReader();
while (dr.Read())
{
string isim = dr.GetString(0);
string soyisim = dr.GetString(1);
       listBox1.Items.Add(isim + " " + soyisim);
}
con.Close();

Böylece veri tabanından sorulan sorgu sonucunda kaç satır dönüyorsa, while döngüsündeki Raed metodu sayesinde hepsi karşılanabilir. Bu metod okuayabildiği satırı okur ve tek satırlık tablo tutar. Diğer while döngü adımında ise sorgu sonucuna göre sıradaki satırı hafızasında tutar. Bunu sağlayan da SqlDataReader nesnesidir. Uygulamadan veritabanına sorulan sorgu sonuçlarında, uygulama tarafına doğru bir veri akışı söz konusudur. SqlDataReader nesnesi, bu akışı karşılamada geliştiricilere yardımcı olan, boş bir bardak gibi düşünülebilir. Bu bardak sayesinde akan verileri kolayca kontrol edilebilir.

DO-WHILE Döngüsü
While dögüsünü döngümüz içerisindeki kod bloğunun kaç kere çalışacağını bilmediğimiz durumlar için kullanıyorduk. Eğer while 'daki koşul uymuyorsa program akışı döngüye girmeden devam ediyordu. Do-while döngüsünde ise bir programa "bir kere çalıştır, sonra koşul gerçekleştiği sürece tekrar tekrar çalıştır" diyoruz.  Aşağıdaki gibi do-while döngüsünün söz dizimine baktığımızda, aslında while döngüsünden tek farkının, koşuldan bağımsız olarak döngünün bir kere dönmesidir. Yani koşul sağlansa da sağlanmasa da döngü skopları içerisindeki kodlar bir defaya mahsus olmak üzere çalışacaktır.

            do
            {
                //Koşul sağlandığı sürece çalışacak olan kod bloğu
            } while (koşul);

Zaten program akışına göre, koşulun kontrol edildiği satır do skoplarının altındadır. Yani döngü skopları içerisindeki kodlar bir kere çalışır ve daha sonra while parantezleri içerisindeki bool ifade kontrol edilir. Bu bool ifadeden true sonucu döndüğü sürece döngü dönmesinde devam eder. False sonucu dönerse döngü içerisindeki kodlar hiç çalışmadan döngü skoplarından çıkar.
Bir örnek verecek olursak: klavyeden 0 değeri girilene dek girilen sayıların en büyük iki rakamı bize gösteren kod bloğunu do-while kullanarak yapalım.
           
     int birinci = 0, ikinci = 0, girilen = 0;
            Console.WriteLine("Lütfen sayı giriniz.");
            do
            {
                girilen = Convert.ToInt32(Console.ReadLine());
                if (girilen > birinci)
                {
                    ikinci = birinci;
                    birinci = girilen;
                }
                else if (girilen > ikinci)
                {
                    ikinci = girilen;
                }
            } while (girilen != 0);


Program kullanıcıdan sıfır değeri girilene kadar sayılar ister. Sıfır girilmediği sürece döngü içerisindeki kod bloğu çalışır ve döngü dönmeye devam eder. Girilen her sayıyı önceki iki sayı ile ayrı ayrı kıyaslar. Girilen sayı önceki iki sayıdan sayıdan büyükse değerlerini birbirlerine atar. Bunu yaparken de, minimum bir tane değişken kullanmalıdır. Bu algoritmaya "swap algorithm" (kaydırma algoritması) denir. Son olarak birinci ve ikinci değişkenlerinde en büyük iki sayı kalmış olacak.

Fakat c sharp programlama filinde do-while döngüsü her zaman tercih edilmez. Eğer do-while döngüsü kullanılacaksa çok iyi tasarlanmalı ve kullanıldığı algoritmada döngünün yeri çok iyi tespit edilmelidir. Aksi takdirde, geliştirici tarafından zor farkedilir mantık hatalarına yol açabilir.

            Umarım yardımcı olabilmişimdir. Başka bir yazıda görüşmek dileğiyle, hoşçakalın...

Hiç yorum yok:

Yorum Gönder