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.
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.
Hiç yorum yok:
Yorum Gönder