Programlamanın temellerini oluşturan if/else kontrol yapısını önceki yazımızda incelemiştik. Buraya kadar öğrendiklerimizle artık yazdığımız programın istediğimiz akışı takip edebilmesini ve belirlediğimiz koşullara göre farklı işlemler yapabilmesini sağlayabiliriz. Ancak bu koşullar bazen gerçekten fazla olabilir ve biz aynı kodu birçok kez çalıştırmak zorunda kalabiliriz. Bunun yanında birden fazla yapılacak işlem olduğunda aynı kod bloğunu sürekli tekrar yazmak programcıların çok tercih ettiği bir yöntem değildir. Tekrar edilen kodlar yazdığınız programı ileride modifiye etmenizi zorlaştırırken, karışık bir görüntü oluşturarak kodların okunaklığını azaltır. Örneğin 30 kişilik bir sınıfın notlarını girdiğiniz ve size not ortalamasını çıkaran bir programda, kullanıcıdan her notu almak için kod tekrarı yapmamız oldukça büyük zaman kaybına neden olur.

Üstelik karekök hesaplayan algoritmalarda olduğu gibi bazı durumlarda yapmamız gereken işin ne zaman tamamlanacağını önceden kestirmemiz de imkansızdır. İşte bu tip uzun tekrarlar ya da iştediğimiz şart oluşana kadar aynı işlemin yapılmasını istediğimiz durumlarda döngüleri kullanıyoruz. Önceki yazılarımızda bahsettiğimiz gibi, normalde uygulamamız çalışırken kodlar yukarıdan aşağıya satır satır işlenir ve son satır işlendikten sonra program sonlandırılır. Bizim kullanacağımız döngüler ise süslü parantezler kullanarak oluşturduğumuz kod bloğunun, belirli bir koşul sağlanmışken sürekli kendini başa alarak tekrar işlenmesine imkan tanıyor. C# içerisinde farklı tip döngüler olsa da bunların hepsi barındırdığı koşul sağlandıkça içerisindeki kod bloğunu çalıştırırlar ve koşul yanlış olduğunda sonlanırlar. Şimdi isterseniz bu döngü tiplerinin kullanımını örnekler ile inceleyelim.

While Döngüsü

Türkçe’ye  “sırasında” veya “-iken” olarak çevirebileceğimiz “while” anahtar sözcüğü, while(koşul) {kod} biçiminde döngü yaratmamızı sağlar. While yanında bulunan parantezler içerisinde yazılan koşul doğru olduğu sürece koşul parantezlerinden sonra gelen süslü parantezler içerisindeki kod bloğunu çalıştırılır. Bu döngü tipinin çalışma biçimini kafanızda canlandırmanız için hemen gerçek hayattan bir örnek verebiliriz. Örneğin su dolu bir sürahiyi bir bardak kullanarak başka bir kaba boşaltmak istiyoruz. Burada yapacağımız iş, sürahiden su dökerek bardağı doldurmak, sonra bardak içerisindeki suyu kaba dökmek olacaktır. Programlama mantığında düşünecek olursak, “sürahide su bulunması”nı koşul olarak seçersek istediğimizi gerçekleştirebiliriz. Şimdi bir while döngüsü kuracak olursak; sürahide su bulunması koşulu doğru olduğu sürece, yapacağımız işi tekrarlamış olacağız. Başlangıçta sürahide su varsa, bardağı suyla doldurup kaba boşalttıktan sonra koşulumuz hala doğru mu diye sürahiye bakıyoruz. Eğer sürahide hala su varsa bardağı tekrar dolduruyoruz ve bu sürahide su kalmayana kadar böyle devam ediyor. Sanırım döngünün çalışma mantığını bu şekilde aklımızda tutabiliriz.

While ile oluşturduğumuz sayısal döngü kalıbı for döngülerinde geçerlidir.

İlk örneğimiz, önceden tanımladığımız “sayı” ismindeki bir değişkenin değerinin tek ya da çift sayı olduğunu bulan bir program. Burada while döngüsü içerisindeki kod bloğunda sayıdan sürekli 2 çıkarıyoruz. Koşulda yazdığımız tanım gereği sayı 1 veya 0’a eşitlenmedikçe buradaki kod bloğu çalışıyor ve çıkarma işlemlerine devam ediliyor. Sayı değişkenimiz bu 0 yada 1 değerine ulaşırsa artık koşul doğru olmayacağından döngü sonlandırılıyor, ardından yazdığımız if kontrolü ile kalan sayı eğer 1 ise sayının tek, 0 ise çift olduğunu belirliyoruz.

Belirli koşullar altında işlem yapan döngülerin diğer bir kullanımının da, biz programcıları uzun ve kendini tekrar eden kod yazmaktan kurtarması için olduğunu söylemiştik. Çok basit olarak ekrana bir yazıyı bin kere yazdırmak isterseniz bunu yapabilen bir kod oluşturmanız, kodu kopyalayıp yapıştırarak hazırlasanız bile çok uzun zamanınızı alabilir. İşte böyle durumlarda, bir sayaç değişkeni yardımıyla while döngüleri ile bir işlemin istediğimiz sayıda gerçekleşmesini sağlayabiliriz. İlk yapmamız gereken, int tipinde bir değişken oluşturmak. Bu değişkene döngüye girmeden önce bir sayı değeri atıyoruz, while döngüsünün kod bloğunun sonunda değerini değiştirerek, döngü koşulunda bu değeri kontrol ediyoruz ve bu şekilde işlemlerin istediğimiz kadar tekrar edebilmesini sağlıyoruz.

İkinci örneğimizde bu senaryoyu işleyen bir program yazdık. Sayac isimli int tipinde değişkenimize 0 değerini atıyoruz. While döngüsünün kod bloğunda ekrana yazı yazdıran satırda işlemi bitirdikten sonra, bu sayac değişkenimizin değerini bir artırıyoruz. Önceki yazılarımızdan hatırlayacak olursak, bir değişkenin sonuna eklenen ++ ifadesi, onun değerini bir arttırmak anlamına geliyor. Döngümüzün koşul bölümüne de, işlemin kaç kere tekrarlanacağını belirlediğimiz boolean (doğru ya da yanlış değer döndüren) ifadeyi yazıyoruz. Örneğimizde kullandığımız “sayac < 1000” ifadesi sayac 1000’den küçük olduğu sürece doğru (true) değerinde dönecek ve yazıyı bin defa ekrana yazdırmamızı sağlayacak. Keşke ilkokulda öğretmenimizin verdiği tahta doluncaya kadar aynı cümleyi yazdığımız cezalar için de böyle bir sistem olabilseydi J.

For Döngüsü

Yukarda örneğini verdiğimiz, sayaç kullanarak oluşturduğumuz sayısal döngüler programlamada çok sık kullanılır. Bu nedenle bu döngü kalıbını daha hızlı bir şekilde oluşturmaya yarayan for döngü tipi türetilmiştir. Kullanım şekli for(sayac oluşturma; koşul; artırım değeri) {kod} şeklinde olan bu komut ile daha hızlı sayısal döngü oluşturabiliyor ve ileride değineceğimiz sonsuz döngü oluşturma gibi hataların önüne geçmiş oluyoruz.

Üçüncü örneğimizi inceleyecek olursak, for ifadesi yanındaki parantezin içerisinin noktalı virgül “;” karakteriyle 3 farklı bölüme ayrılmış olduğunu görebiliriz. Sayaç değişkenimizi burada oluştururken dikkat etmemiz gereken başındaki tip ifadesini (genelde int kullanılır) unutmamamız gerektiği. İkinci bölümde yazdığımız koşul, while döngüsündeki koşul parantezinde olduğu gibi döngünün hangi koşulda devam edeceğini belirliyor. Son bölümde ise artırım değerimizi yazıyoruz. Burada yine sayac++ gibi bir ifade yazarak koşuldaki değere birer birer ulaşmaya çalışacağımızı belirtiriz. Ancak sayac+=2 gibi farklı ifadelerle değeri artırmak veya azaltmak mümkündür. Döngüye dair bütün işlemleri bu parantez içerisinde hallettikten sonra süslü parantezler ile oluşturacağımız kod bloğunda yapmak istediğimz işlemi yazabiliriz.

Sonsuz Döngü

Buraya kadar döngülerin belirli bir koşul doğru olduğu sürece kod bloğunu tekrar çalıştırdığını gördük. Peki ya bu koşul hiçbir zaman yanlış çıkmazsa? İşte böyle durumlarda program kodlarında ilerlemek mümkün olmaz ve programımız olduğu yerde takılı kalır. Programın ilerlememesinin ötesinde, sürekli yeni bellek kullandığınız bir döngüde böyle bir durum gerçekleşirse bu programın belirli bir süre çalıştıktan sonra yanıt vermemesine hatta bilgisayarda çalışan diğer programları yavaşlatmasına kadar giden kötü sonuçlar doğurabilir. Yinede sonsuz ya da kısır döngü denilen bu tür döngüleri bir hata olarak nitelendiremeyiz, bu döngülerin kullanıcı arabirimleri ve ağ uygulamaları gibi birçok alanda işlevsel kullanımları bulunmaktadır.

Döngüyü oluşrurken yapacağımız bir hata sonsuz döngüye sebep olabilir..

Ancak şu aşamada arka planda çalışmayan bir sonsuz döngü hazırladığımız uygulamaların takılmasına neden olacaktır ve çalışma zamanında ortaya çıktığı için Visual Studio tarafından uyarılmamız da söz konusu değil. Sonsuz döngülerin önüne geçebilmek için yazdığımız döngülerin koşul alanlarına oldukça dikkat etmeli, gerekirse sonsuz döngüye yol açabilecek farklı durumlar için ve (&&), veya (||) gibi bağlaçlardan yararlanarak koşulu genişletmeliyiz. Ayrıca bir sayaç değişkeni kullanarak hazırladığımız sayısal döngülerde, sayaç değişkenine başlangıç değerini yanlış atamak veya kod bloğunun sonunda bu değeri değiştirmeyi unutmakta uygulamanın sonsuz döngüye girmesine sebep olacaktır.

Dilerseniz sizde dördüncü örneğimizde olduğu gibi bir sayı sayan program yazarak sonsuz döngü kullanabilirsiniz. Burada dikkat etmeniz gereken while(true) ifadesinin sonsuz döngü oluşturmak için kullanılabileceğidir. Son bir hatırlatma yapmak gerekirse, sonsuz döngüye giren bir konsol uygulamasını Ctrl+C tuşlarına basarak kapatabilirsiniz.

Döngülerden Acil Çıkış

Birbirinden farklı birçok kullanım alanı olan döngüleri istersek kendimiz de sonlandırabiliriz. Örneğin bir listede bir elemanı aramak için bütün öğeleri bir döngü ile inceliyorsak, eğer bu elemanı liste bitmeden bulursak listenin kalanında arama işlemine devam etmek sadece zaman kaybı olacaktır. Ya da bir sayının karekökünü sırayla deneme yoluyla arıyorsak, sayıyı bulduğumuzda daha fazla sayı denememize gerek yoktur. İşte böyle durumlarda programın içinde bulunduğu döngüden çıkması için “break” anahtar sözcüğünü kullanabiliriz. Döngüyü sonlandırdığımızda, program döngü kod bloğunun bittiği yerden çalışmasına devam edecektir.

Beşinci örneğin sonuç ekranı.

Beşinci örneğimizi incelersek, döngü koşuluna göre ekrana 100’e kadar sayı değerlerini yazması gerekirken, sayı değişkeni 10’a eşitlenince break komutuyla döngüyü sonlandırdığımız için uygulama sadece 0-10 arası sayıları ekranda gösterecektir.

Döngülerin çalışmasına müdahale eden diğer komutumuz ise Türkçe’de “devam etmek” anlamına gelen “continue”. Break kadar çok kullanılmayan bu anahtar sözcük, döngünün sadece mevcut iterasyonuna son vererek koşul hala doğruysa kod bloğunun baştan çalışmasını sağlar. Altıncı örneğimizde continue kullanarak 0-100 arası tek sayıları ekrana yazdırıyoruz. Kod bloğunun başında mevcut sayının çift sayı olduğunu kontrol ediyor, eğer çiftse iterasyonu continue ile sonlandırarak ekrana yazılmamasını sağlıyoruz.

continue kullanarak hazırladığımız örneğin sonuç ekranı.

Do-While Döngüsü

Son olarak bahsedeceğimiz döngü çeşidi ise Do-While. Bu  döngü biçiminin while döngüsünden tek farkı, ilk işlemi gerçekleştirmek için koşula bakmaması. Yani kod bloğu ilk seferde mutlaka çalıştırılır, ondan sonra yazılan koşul değerlendirilir ve eğer doğruysa kod bloğu tekrar baştan çalıştırılır. Yazılış biçimi ise do {kod} while(koşul) şeklindedir. Son örneğimizdeki uygulamamız ise basit bir şekilde kullanıcının ismini öğrenmek istiyor. Eğer kullanıcı ismini girmeden giriş tuşuna basarsa soru tekrarlanıyor ve kullanıcı isim girene kadar program devam etmiyor. Burada kullanıcıdan veri almak için Console.Readline() komutunu kullanıyoruz. Eğer kullanıcı herhangi bir isim yazmadan giriş tuşuna basarsa, “yazi” ismindeki string değişkenimiz boş bir değere sahip olacağı için, while yanındaki koşul doğru olacak ve program kod bloğunu tekrar çalıştıracaktır.

do-while kullanarak kullanıcıdan isim bilgisini istiyoruz.

Do-while döngüsüne de değindikten sonra C# ile temel programlama konusunda önemli bir aşama kaydetmiş bulunuyoruz. Son olarak, döngü içerisinde elde ettiğiniz değerler ile yeni işlemler gerçekleştirmek için birden fazla döngüyü iç içe kullanabilmenizin mümkün olduğunu da söyleyelim. Özellikle matris uygulamaları gibi birden fazla boyutu olan dizilerle ilgileneceğimiz ileriki yazılarımızda iç içe döngülerin kullanımı konusuna detaylı olarak değineceğiz. Farklı örneklerle anlatmaya çalıştığımız döngülere hakim olmanız programlama konusunda ilerlemeniz için gerçekten çok önemli. Bu yüzden verdiğimiz örnekleri kendi yaratıcılığınızla geliştirerek yeni örnekler oluşturmanızı kesinlikle tavsiye ederim. Bir sonraki yazıda görüşmek üzere :)

p.s. Bu yazı Ekim 2008′de yazılmıştır.

Örnek Kod 1:


//örnek 1

int sayi = 876528;

while (sayi != 0 &amp;&amp; sayi != 1)

{

sayi = sayi - 2;

}

if (sayi == 1)

Console.WriteLine("Tek sayı.");

else

Console.WriteLine("Çift sayı.");

Örnek Kod 2:


//örnek 2

int sayac = 0;

while (sayac < 1000)

{

Console.WriteLine("While Döngüsü");

sayac++;

}

Örnek Kod 3:


//örnek 3

for (int sayac = 0; sayac < 1000; sayac++)

{

Console.WriteLine("For Döngüsü");

}

Örnek Kod 4:


//örnek 4

int sayi = 0;

while (true)

{

Console.WriteLine(sayi++);

}

Örnek Kod 5:


//örnek 5

for (int sayi = 0; sayi < 100; sayi++ )

{

Console.WriteLine(sayi);

if (sayi == 10)

break;

}

Örnek Kod 6:


//örnek 6

for (int sayi = 0; sayi < 100; sayi++ )

{

if (sayi % 2 == 0)

continue;

Console.WriteLine(sayi);

}

Örnek Kod 7:


//örnek 7

string yazi;

do

{

Console.WriteLine("İsim: ");

yazi = Console.ReadLine();

}

while (yazi == "");

Console.WriteLine("İsminiz: " + yazi);

Related posts:

  1. C# Dersleri – 3: Program Kontrolleri
  2. C# Dersleri – 2: Programciliga Giris
  3. C# Dersleri – 1: .Net Framework
  4. Ajax Extender nesnelerinin kullanimi
  5. Web Sayfaniza Virtual Earth Haritalari Ekleyin