3 Ocak 2011 Pazartesi

For ve Foreach Döngüsü

for ve foreach döngülerinin kullanımını sırasıyla inceleyelim.

for (i = 0; i < class="rem" style="color: rgb(0, 128, 0); ">// i değişkeni ile yapılacak işlemler  } 

i döngü değişkenine genellikle başlangıçta 0 atanır. Dolayısıyla bir dizinin indekslenmesi ile ilgili işlemlerde kolaylık sağlar.

Çoğu programcı while-do döngüsü kullanmaktansa for dögüsü kullanmayı tercih eder. Hatta bazı yerlerde while-do döngüsünü kullanmak daha uygun olduğu halde for döngüsü kullanırlar.

For döngüsünün de while döngüsünde olduğu gibi karmaşık kullanım şekilleri mevcuttur. Örneğin break ve exit cümlecikleri while döngüsündeki görevinin aynısını for döngüsünde de üstlenmektedir.

For kelimesinden sonra parantez açılmaldır. Parantez içerisine noktalı virgüller ile ayrılmış üç ifade yazılır. Bu ifadeler sırasıyla başlangıç değeri, koşul ve değişim değeridir.

Parantez içindeki üç ifadeden ilki ile döngünün başlangıç değerini belirtiriz. Genellikle tek bir değişken kullanılır, fakat isterseniz aşağıdaki gibi birden fazla değişken için başlangıç değeri atayabilirsiniz.

 for (i = 0, j = 17; …… ; ….) 

Parantez içindeki ikinci ifade ile koşul durumunu belirtiriz. Bu bölüm boolean türünde kontrol edilir. Şart sağlanmış ise false değeri dönecek ve döngüden çıkılmış olacaktır. Eğer koşul henüz gerçekleşmemiş ise true değerini alır ve döngü işlemeye devam eder.

for (i = 0; false; i++) {      // işleme alınmayacaktır. }

Parantez içindeki üçüncü ifade ile değişim miktarını belirtiriz. Başlangıç değerinde olduğu gibi birden fazla değişkenin değişimi eklenebilir.

for (i = 0, j = 100; i < class="rem" style="color: rgb(0, 128, 0); ">// i ve j değişkenleri kullanılabilir }

Bu üç ifade belirtilirken kullandığımız değişkenlerin başlangıç değerlerini daha önceden atayabiliriz. Aşağıdaki örnek bir önceki ile aynı sonucu verecektir.

j = 100;  for (i = 0; i < class="rem" style="color: rgb(0, 128, 0); ">// i ve j değişkenleri kullanılabilir      j -= 5; } 

İsterseniz bu üç ifade yerini boş bırakıp sadece noktalı virgülleri parantezle içerisinde bırakabilirsiniz.

for (;;) {      // herhangi bir işlem.. }

Bu şekilde sonsuz döngü oluşturabilirsiniz. While döngüsü ile ise sonsuz döngü aşağıdaki şekilde olacaktır.

while (true) {     // Herhangi bir işlem. }

Başlangıç değerini belirtirken kullandığımız i değişkeni program içerisinde daha önceden tanımlamadıysanız döngü içerisinde aşağıdaki şekilde belirtmelisiniz.

for (i = 0; i < class="rem" style="color: rgb(0, 128, 0); ">// i değişkeni ile yapılan işlemler }

Örneğin string bir dizi olan sdizi için döngü aşağıdaki şekilde olacaktır.

for (int i = 0; i <>

Bu döngüde tek bir ifade olduğundan süslü parantezleri kullanmayabilirsiniz.

Yukarıdaki örneklerde i değişkeninin değeri, eğer döngü herhangi bir sebeple yarıda sonlandırılmadıysa, döngü sonucunda hedef değerine eşit olur.

Eğer C veya C++ dillerini kullanan deneyimli bir programcıya 1 den 100 ’e kadar olan sayıları C# kodu ile ekrana yazdırmasını isterseniz, aşağıdaki şekilde bir sonuç alırsınız:

for (int i = 0; i <>

Bu program bloğunda i değişkeni 0 dan 99 ‘a kadar değerleri alıyor. Fakat ekran çıktımızda 1 den 100 ‘e kadar olan sayıları görüntülüyoruz. Üstad programcılar genellikle bu yöntemi kullanırlar. Daha akıllıca bir yazım şekli de şöyledir:

for (int i = 0; i < class="kwrd" style="color: rgb(0, 0, 255); ">for (int i = 0; i < class="kwrd" style="color: rgb(0, 0, 255); ">if (i % 3 == 2)         Console.WriteLine("{0,-20}", sdizi[i]);     else         Console.Write("{0,-20}", sdizi[i]);

Döngü içersinde tek bir ifade olduğundan süslü parantezleri kullanmadık. If cümleciği, ilk değerin 3 ‘e bölümünden elde edilen kalanın 2 ye eşit olup olmadığını kontrol ediyor. İ değeri yalnız 2,5,8,11 olduğunda bir sonraki satıra geçiyor ve kolonlarımız oluşuyor.

Genellikle bir dizinin elemanlarını karşılaştırmak için for döngüsü kullanırız. Örneğin 30 kişilik yakın arkadaşlarımızın isimlerinden oluşan bir dizimiz var. Kaç arkadaşımızın isminde E harfi yer aldığını hesaplamak istiyoruz:

char[] harfara = {'e', 'E'}; int eharfliler = 0;  for (int i = 0; i < class="kwrd" style="color: rgb(0, 0, 255); ">if (isimler[i].IndexOfAny(harfara) != -1)         eharfliler++;

Buradaki harfara dizisi char tipinde olup “E” ve “e” karakterlerini içermektedir. If bloğunda String sınıfının bir metodu olan IndexOfAny ile harfara dizisindeki elemanlar karşılaştırılıyor. Eğer isimde herhangi bir e karakteri yer almıyor ise IndexOfAny metodu -1 değerini döndürecektir. Eğer -1 değeri dönmez ise eharfliler değişkeni 1 arttırılıyor.

Eğer bu isimleri başka bir diziye kopyalamak isterseniz :

using System;  class harfarama {     static void Main()     {         string[] isimler =          {             "Ömer Faruk Demir","Ali Can","Elima Aydın", "Sefa Filiz", "Ebru Sevim"                     };         int eharfiler = 0;         char[] harfara = {'z', 'Z'};          // Öncelikle “e” veya “E” harfi olanların sayısını buluyoruz          for (int i = 0; i < class="kwrd" style="color: rgb(0, 0, 255); ">if (isimler[i].IndexOfAny(harfara) != -1)                 eharfliler++;          // yeni bir string dizi oluşturuyoruz          string[] eisimler = new string[eharfliler];          // Bir diziden diğer diziye kopyalama işlemini yapıyoruz          for (int i = 0, j = 0; i < class="kwrd" style="color: rgb(0, 0, 255); ">if (isimler[i].IndexOfAny(harfara) != -1)                 eisimler[j++] = isimler[i];                  // Yeni oluşan dizimizi ekrana yazdırıyoruz          for (int i = 0; i <>

Bu programda üç adet for döngüsü yer alıyor. İlk döngü yukarı da incelediğimizin aynısı, isimleri sayıyor. Program isminde E harfi olanların yer aldığı dizinin uzunluğunu hesaplıyor. İkinci döngü ile kopyalama işlemi gerçekleştiriliyor. Son döngü ile de yeni oluşan dizimiz ekrana yazdırmak için kullanılıyor.

Bir dizinin tüm elemanlarına erişmek için foreach döngüsü daha pratik olacaktır. Decimal tipte bir dizinin tüm elemanlarını foreach döngüsü kullanarak toplayalım:

decimal mtoplam = 0;  foreach (decimal m in mdizi) {         mtoplam += m }

foreach cümleciğinden sonra parantezler içerisine erişeceğimiz dizinin tipinde bir değişken tanımlıyoruz.Daha sonra dizimizin adını yazarak son elemana kadar döngünün sürdürülmesini sağlıyoruz. foreach döngüsünün bazı sınırlılıkları vardır. Örneğin döngü içerisinde dizinin herhangi bir elemanına ulaşamazsınız. foreach döngüsü yalnız döngülerde kullanılmaz. Örneğin string bir değişkenin elemanlarını (karakterlerini) ekrana yazdıralım:

foreach (char karakter in str)     Console.WriteLine(karakter); 

29 Aralık 2010 Çarşamba

While Döngsü

Bu makalemizde While ve Do & While Döngülerinin kullanımını anlatacağım. Do & While döngüsü basitçe şu şekilde çalışır:

Do yapısı içinde yazdığımız işlemler while ile istediğimiz şart sağlana kadar devam eder.

For döngüsünden farkı şudur: For kullandığımızda şart false üretiyorsa yani sağlanmamışsa, döngü içine hiç girilmez. fakat Do while'da kontol en sonda while () içinde yapıldığından en azından bir kere döngü çalışacaktır.

Basit olarak yapısı şu şekildedir:
01do
02
03{
04
05//Şart sağlanmadığı takdirde, tekrar tekrar çalışacak kodlar;
06
07}
08
09while (sağlanacak şart);
10{
11// Şart sağlandığında çalışacak kodlar.
12}

Mesela :
01private void button1_Click(object sender, EventArgs e)
02{
03int sayac = 1; // Sayaç değişkeninin değeri ilk aşamada 1 oluyor.
04int sayi = 5; // Sayi değişkenimiz ilk aşamada 5 dedik.
05
06do
07{
08int sonuc = sayac * sayi; // sayi ile sayaç değişkenleri çarpılıp sonuc değişkenine atandı
09listBox1.Items.Add(sonuc); // sonuc değişkenin değeri listbox'ımıza yazdıldı.
10sayac++; // İlk etapta 1 olan sayaç bir arttı.
11
12}
13while (sayac <= 6); // sayac bu anda 6 dan büyük olmadıgı için do bloguna başa dönüldü.
14{
15MessageBox.Show("Sayaç 6 oldu ve Do Döngüsünden Çıkıp While'a geçti"); // Burda sayaç değişkeni 6 olduğu anda While bloguna giriyor.
16}
17}
Yukardaki örneği açıklayacak olursak, bir adet sayı adlı değişkenimiz ver değeri ise 5, Bir adet sayaç değişkenim var değeri ise 1. Do yapısı içinde sayac ve sayi değişkenleri çarpıp değeri sonuc değişkenine atıyoruz.

Daha sonra sonuç değişkenin değerini ListBox'ımıza yazdırıyoruz. ve sayaç değişkenin değeri her seferinde 1 artıyor ve devam ediyor.

Tabiki ne zamana kadar devam edeceğini while içinde belirttik. Eğer sayac değişkeni 6 ya eşitse yada daha küçükse her seferinde do yapısı içinde blok tekrar çalışacak. Eğer sayaç değişkeni 6 dan büyük olursa. Do bloğundan çıkıp while bloğu içindeki kodlar çalışacaktır.

Çıktısı ise Yanda Görmüş Olduğunuz Resimdeki Gibi Olacaktır.


Şimdi ise yalnızca while kullanalım aslında hiçbir farkı yok. Tek fark ilk örnekte Program şart sağlanmayınca do blogununa dönüyordu ve şartı sonda kontol ediyordu.

While da ise şart en başta belirtiliyor ve şart false olduğu sürece while blogu tekrar , tekrar çalıştırılıyor.

Örneğimizi Verelim :
01private void button1_Click(object sender, EventArgs e)
02{
03int sayi = 1; // Sayı değişkenimizin değeri 1 dir.
04while (sayi!=10) // Sayi değişkeni 10'a eşit değilse While Blogu çalışacak.
05{
06MessageBox.Show("Sayı Değişkeni Şu Anda:" + sayi + "dır"); //Sayı değişkenin değerini her seferinde göstersin istedim.
07listBox1.Items.Add(sayi); // her seferinde sayı değişkenin değerini Listbox a yazsın.
08sayi++; // ve sayı değişkeninin değeri 1 artar. Yeniden while bloğunun başına döner.
09}
10
11MessageBox.Show("Sayı Değişkeni 10 oldu ve While blogundan Çıkıldı."); // Sayı değişkeni 10 oldugunda while'dan çıkılır ve burası çalışır.
12}
Yukarda gördüğünüz gibi While blogunun başında kontrol yapılıyor. Şartımız sağlanana kadar durmadan while içinde dönüyor.

While'ın başında şart sağlanmışsa eğer, while bloğundan çıkıp aşağıdan çalışmaya devam ediyor.

Ekran Çıktısı ise aşağıdaki gibi olacaktır:

Csharp While