C Programlama

Ek Bilgiler

C'de Döngüler

► Detaylı 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.

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

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.

İ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.

Koşul bölümünde, 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.

Artırma bölümünde, 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.

Ayrıca, 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ı

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

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.

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.

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.

#include <stdio.h>

main()
{
  int id1;

  for (id1=1; id1<11; id1++) printf("%d ", id1);

  printf("\n");

  id1=1;
  for (  ; id1<11; ) printf("%d ", id1++);

  printf("\n");

  id1=1;  
  while (id1<11) {
     printf("%d ", id1++);
  }

  printf("\n");

  id1=1;  
  do {
     printf("%d ", id1++);
  } while (id1<11);
}

Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

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 C'deki 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. Şimdi, break deyiminin kullanılmasını örnekler üzerinde incelemeye çalışalım:

#include <stdio.h>

main()
{
  int id1;

  for (id1=1; id1<=20; id1++) {
      printf("%d ", id1);
      if (id1==15) break;
  }
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Yukarıdaki örnekte, program break işlem satırı tanımlanmadığında 1'den 20'ye kadar olan sayıları ekrana yazar. Ancak, for döngüsüne bağlı kod bloğunun ikinci satırında kullanılmış olan break deyimi kullanıldığı için, program for döngüsünde id1 değişkenine 15 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 printf() fonksiyon işlem satırından önce yazılmış olsaydı, program 15 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. Şimdi continue deyiminin kullanılmasını bir örnek üzerinde incelemeye çalışalım:

#include <stdio.h>

main()
{
  int id1;

  for (id1=0; id1<20; id1++) {
       if (id1%2==0) continue;	   
	   printf("%d ", id1);
  }
}

Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:

1 3 5 7 9 11 13 15 17 19

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 çift bir sayı ise geri kalan kalan satırları devre dışı bırakarak, bir sonraki döngü değeri ile çalışmasına devam eder.