Döngüler

► Kısa anlatım

Bir veya birden fazla işlem satırını, bir koşula bağlı olarak, belirli sayıda veya bir koşul sağlandığı sürece tekrarlayarak çalıştıran kalıplara döngü adı verilir.

Java dilinde for, while ve do while olmak üzere 3 farklı döngü kullanılmaktadır.

for döngüsü

for döngüsünün genel yapısı aşağıda gösterilmektedir:

for (ilk-değer-atama; koşul; artırma) işlem-satırı;

Bir for döngüsü içinde for deyiminin kendisi hariç toplam 4 ana bölüm vardır. Bunlardan üçü for satırında parantezler içinde yer alan ilk-değer-atama, koşul ve artırma bölümleridir. Dördüncü ve son bölüm ise döngü içinde programın istediğiniz sayıda tekrar ettiği tek bir işlem-satırı veya kod bloğudur.

1. İlk değer atama : İlk değer atama bölümünde, döngüyü kontrol eden değişkene bir ilk değer verilir. İlk değer atama bölümü, program tarafından bir defaya mahsus olmak üzere sadece döngünün başlangıcında çalıştırılır.

2. Koşul : Bu bölümde, döngü kontrol değişkeni döngünün her tekrarında belirli bir değer ile karşılaştırılır. Eğer koşula bağlı bu kontrol doğru bir sonuç verirse döngü tekrar eder, aksi takdirde döngü sona erer ve program döngüden sonra yer alan satırdan çalışmasına devam eder. Daha açık bir ifade ile, bu bölüm döngünün devam edip etmeyeceğinin belirlendiği bölümdür. Bu nedenle, koşul bölümü döngünün her tekrarlanmasında, döngünün başlangıcında program tarafından çalıştırılır. Eğer döngü başlangıcında koşul doğru sonuç vermezse döngü hiç çalışmaz.

3. Artırma : Bu bölümde, döngü kontrol değişkeni döngünün her tekrarında belirli bir oranda artırılır veya azaltılır. Artırma bölümü, işlem satırı veya kod bloğundan sonra ve koşul bölümünden önce program tarafından çalıştırılır.

4. İşlem satırı (kod bloğu) : Döngü devam ettiği sürece çalışan işlem satır veya satırlarıdır.

Aşağıdaki program, 1 ile 5 arasındaki sayıları bir for döngüsü ile ekrana yazar:


/* javaprog.java */
public class javaprog {
  public static void main(String[] args) {
    int id1;

    for (id1=1; id1<6; id1++) System.out.println(id1);
  }
}

Komut satırında aşağıdaki satırları yazdığınızda program derlenir ve çalışır:

C:\>javac javaprog.java
C:\>java -Dfile.encoding=Cp857 javaprog
1
2
3
4
5

for döngüsünde her bölüme bir değer atama zorunluluğu yoktur. İlk değer atama, koşul ve artırma bölümlerinden birini veya tamamını hiç kullanmayabilirsiniz. Döngü içinde kullanılmayan bölüm boş kalır.

for ( ; ; ) işlem-satırı

Döngüleri tek başına kullanabileceğiniz gibi, birbiri içinde de kullanabilirsiniz.

Bir dizi içindeki değerlere sırasıyla işlem yapmak için for döngüsünü aşağıdaki şekilde kullanabilirsiniz:

Aşağıdaki program, bir dizi çinde yer alan sayıları bir for döngüsü ile ekrana yazar:


/* javaprog.java */
public class javaprog {
  public static void main(String[] args) {
    int[] sayi = { 1, 2, 3, 4, 5 };

    for (int deger : sayi) {
         System.out.println(deger);
    } 
  }
}

Komut satırında aşağıdaki satırları yazdığınızda program derlenir ve çalışır:

C:\>javac javaprog.java
C:\>java -Dfile.encoding=Cp857 javaprog
1
2
3
4
5

while döngüsü

while döngüsünün genel yapısı aşağıda gösterilmektedir:

while (ifade) işlem-satırı;

Program while döngüsünün bulunduğu satıra geldiği zaman önce ifade sonucunun doğru olup olmadığını kontrol eder. Eğer ifade yanlış bir sonuç verirse döngüye hiç girmeden bir sonraki satırdan çalışmasına devam eder. Eğer ifade doğru bir sonuç verirse, döngüde yer alan ifade yanlış bir sonuç verene kadar, döngü içinde yer alan işlem satırlarını çalıştırır. Yani, ifade doğru olduğu sürece döngü çalışmasına devam eder. while döngüsünde ifadenin sonucu döngünün başlangıcında kontrol edildiğinden, ifadenin yanlış sonuç verdiği durumlarda döngü bir defa bile çalışmaz.

while döngüsünde, for döngüsünden farklı olarak, ilk değer atama ve artırma/azaltma bölümleri bulunmamaktadır. while döngüsünde ilk değer atama işlemi döngü öncesinde, artırma/azaltma işlemi ise döngü kod bloğu içinde yapılır.

Biraz önce for döngüsü ile yazdığımız programın yaptığı işin aynısını aşağıdaki progamdaki while döngüsü ile yapabiliriz:


/* javaprog.java */
public class javaprog {
  public static void main(String[] args) {
    int id1;

    id1=1; /* İlk değer atama döngü öncesinde */

    while (id1<6) {
      System.out.println(id1);
      id1++; /* Artırma işlemi döngü kod bloğu içinde */
    }	
  }
}

do while döngüsü

do while döngüsünün genel yapısı aşağıda gösterilmiştir:

do {
  işlem-satırı;
  .
  .
  .
  işlem-satırı;
} while (ifade);

Program do döngüsüne geldiğinde hiç bir koşula bağlı olmadan direk olarak döngüye giriş yapar. Döngünün içinde yer alan işlem satırlarını çalıştırır. Eğer döngünün son satırında yer alan while deyimi ile ilgili ifade doğru sonuç vermez ise döngü sona erer. do döngüsünde eğer sadece tek bir işlem satırı tekrarlanacaksa ({}) işaretlerine gerek yoktur. Döngü, while satırındaki ifade sonucu doğru olduğu sürece çalışmasına devam eder.

do döngüsünde koşul kontrolü döngü sonunda yapıldığından koşul sağlanmasa bile döngü enaz bir defa çalışır. Bu yönü ile do döngüsü for ve while döngülerinden farklıdır.

Biraz önce for ve while döngüleri ile yazdığımız programların yaptığı işin aynısını aşağıdaki progamdaki do while döngüsü ile yapabiliriz:


/* javaprog.java */
public class javaprog {
  public static void main(String[] args) {
    int id1;

    id1=1; /* İlk değer atama döngü öncesinde */

    do {
      System.out.println(id1);
      id1++; /* Artırma işlemi döngü kod bloğu içinde */
    } while (id1<6); 	
  }
}

for, while ve do while döngülerinin birlikte incelenmesi

Döngülerle ilgili olarak 3 temel kavram bulunmaktadır:

1. İlk değer atama
2. Koşul
3. Artırma (Azaltma)

* for döngüsünde bütün kavramlar for satırında yer alan parantezler içinde tanımlanabileceği gibi, ilk değer atama bölümü döngü öncesinde ve artırma/azaltma bölümü döngü kod bloğu içinde tanımlanabilir.

* while döngüsünde ilk değer atama bölümü döngü öncesinde, koşul bölümü while satırında yer alan parantezler içinde, artırma/azaltma bölümü ise koşul sağlandığı takdirde çalışan kod bloğunun içinde tanımlanır.

* do döngüsünde ise, ilk değer atama bölümü döngü öncesinde, koşul bölümü döngü sonundaki while satırında yer alan parantezler içinde, artırma/azaltma bölümü ise döngüye bağlı kod bloğu içinde tanımlanır.

*** do döngüsünün diğer döngülerden en büyük farkı, koşul kontrolü döngü sonunda yapıldığı için, koşul sağlanmasa bile döngünün en az bir kez çalışmasıdır. for ve while döngüleri ise, koşul sağlanmadığı takdirde hiç çalışmaz.

break deyimi

Normal koşullarda, bir döngü koşul bölümü doğru sonuç verdiği sürece çalışmasına devam eder. Ancak, döngü kod bloğu içinde özel bir tanımlama yaparak da döngüyü sona erdirebilirsiniz. Bu işlemi gerçekleştirmek için break deyimini kullanabilirsiniz.

Bir döngüyü, döngünün koşul bölümüne bağlı kalmaksızın sona erdirmek için break deyimi kullanılır. break deyimi döngüye bağlı kod bloğunun herhangi bir işlem satırında yer alabilir. Program kod bloğunda break deyimini görür görmez, döngü başlangıç koşulu sağlanmış olsa bile, döngüden çıkar ve döngüden sonra gelen ilk işlem satırından çalışmasına devam eder. break deyimi her 3 döngü ile kullanılabilir. İç içe döngülerde break deyimi kullanıldığında sadece içinde kullanıldığı döngüden çıkışı sağlar:

Aşağıdaki program, ekrana 1-3 arasındaki sayıları ekrana yazdıktan sonra döngüden çıkar ve çalışması sona erer.:


/* javaprog.java */
public class javaprog {
  public static void main(String[] args) {
    int id1;

    for (id1=1; id1<6; id1++) {
         System.out.println(id1);
         if (id1==3) break;
    }
  }
}

Komut satırında aşağıdaki satırları yazdığınızda program derlenir ve çalışır:

C:\>javac javaprog.java
C:\>java -Dfile.encoding=Cp857 javaprog
1
2
3

Yukarıdaki örnekte, program break işlem satırı tanımlanmadığında 1'den 5'e kadar olan sayıları ekrana yazar. Ancak, for döngüsüne bağlı kod bloğunun ikinci satırında break deyimi kullanıldığı için, program for döngüsünde id1 değişkenine 3 değerini atadığında if satırında koşul doğru sonuç verdiğinde break deyimi devreye gireceğinden döngü hemen sona erer. Eğer break deyimi System.out.println(id1); işlem satırından önce yazılmış olsaydı, program 3 sayısını da yazmadan döngü sona erecekti.

continue deyimi

continue deyimi, bir döngünün herhangi bir satırından itibaren döngünün geri kalan işlem satırlarını çalıştırmadan, döngünün baş tarafına dönme olanağı sağlar.

do ve while döngülerinde, program continue deyimi ile karşılaştığında, koşul bölümünü kontrol eder ve döngünün çalışmasını devam ettirir. for döngüsünde ise, artırma ve koşul bölümünü çalıştırdıktan sonra döngünün çalışmasını devam ettirir:

Aşağıdaki program, ekrana 1-10 arasındaki çift sayıları ekrana yazar:


/* javaprog.java */
public class javaprog {
  public static void main(String[] args) {
    int id1;

    for (id1=1; id1<11; id1++) {
         if (id1%2==1) continue;
         System.out.println(id1);         
    }
  }
}

Komut satırında aşağıdaki satırları yazdığınızda program derlenir ve çalışır:

C:\>javac javaprog.java
C:\>java -Dfile.encoding=Cp857 javaprog
2
4
6
8
10

Program, for döngüsü içindeki continue deyiminden dolayı, döngünün ilk satırında eğer id1 değişken değeri tek bir sayı ise geri kalan kalan satırları devre dışı bırakarak, bir sonraki döngü değeri ile çalışmasına devam eder.