DERS-3 (Döngüler)

Döngüler, birden çok çalıştırılmasını istediğimiz kod kesimleri varsa buralarda kulanılır. Örneğin ekrana 50 kez “Monty Python” yazacağız ;) bu demek değildir ki 50 kez bu kodu yazacağız. Bu kodu bir döngü içine atıp, döngünün 50 kez dönmesini sağlayacağız.

C de while, for, do…while olmak üzere üç çeşit döngü vardır. Aslında her biri aynı amca hizmet eder ve genellikle hangi döngüyü kullandığımız farketmez. Yani for döngüsü ile yaptığımız herşeyi while ile de do while ile de yapabiliriz aslında. Şimdi döngülerin tek tek kullanımını anlatıp faktöriyel alınması işlemi üzerinde örnekleyeceğim.

While Döngüsü:

While döngüsü bir koşul ile kullanılır ve koşul doğru olduğu sürece döngü devam eder. Kullanımı şu şekildedir:

while ( koşul ){
//döngünün içinde yinelenen kod kesimi
}

Şimdi Faktöriyel alan bir program yazalım:

#include <stdio.h>

int main(){
    int a,sonuc=1;
    printf("Faktoriyelinin alinmasini istediginiz sayiyi girin:");
    scanf("%d",&a);
    while(a>0){
        sonuc=sonuc*a;
        a--;
    }
    printf("%d",sonuc);
    return 0;
}

Burada çarpma işleminde etkisiz eleman 1 olduğu için sonuc değişkenine ilk değer olarak 1 değerini atadık. Döngünün içine bakarsak örneğin faktöriyeli alınması istenen sayı 4 olsun. While’ın parantezinin içinde sayı 0′dan büyük olduğu sürece döngünün dönmesi isteniyor. Şimdi sayı girildi 4 olarak. Döngüye geliyoruz a değişkenin içindeki değer 4. 0′dan büyük olma koşulunu sağlıyor. Döngünün içinde sonuc=sonuc*a satırında sonuc=1*4 işlemi yapılıyor ve sonuc değişkeninin değeri 4 oluyor. Ardından a değişkeni 1 azaltılıyor ve 3 oluyor. 0′dan büyük olma koşulu sağlanıyor mu? Evet. sonuc=4*3 islemi yapılıyor ve sonuc değeri 12 oluyor, a değişkeni 1 azaltılıyor ve 2 oluyor. Koşul sağlanıyor mu? Evet. Sonuc=12*2 işlemi yapılıyor ve sonuc değeri 24 oluyor. a, 1 azaltılıyor ve 1 oluyor. Koşul sağlandı mı? Evet. Sonuc=24*1 islemi yapılıyor ve sonuc 24 oluyor a, 1 azaltılıyor ve 0 oluyor. Koşul sağlandı mı? Hayır. Döngüye girilmiyor ve döngüden sonra gelen printf satırı işletiliyor ve sonuç ekrana yazdırılıyor.

Şimdi aynısını for döngüsü kullanarak yapalım.

For Döngüsü:

For döngüsü benim en sık kullandığım döngü çeşididir. For döngüsünün, while’dan en büyük farkı kendi içinde bir sayaca sahip olmasıdır. Yukarıdaki örnekte while döngüsünün içinde son satır olarak a değerini azaltıyorduk. Böylelikle a değerinin 0′dan büyük olması koşulu bir noktada artık sağlanmıyor ve döngüden çıkılıyordu. a değerini sürekli eksilten bir sayacımız olmasaydı a değeri hep sabit kalırdı ve döngüden çıkmamız imkansız olurdu ki buna sonsuz döngü denir. Neyse gelelim for döngüsünün ve sayacın kullanımına, for döngüsü aşağıdaki şekilde kodlanır:

for( ilk deger atama; koşul; arttırma/azaltma){
//döngünün içinde yinelenen kod kesimi
}

Daha anlaşılır bir şekilde 50 kez “Monty Python” yazdıralım:

for(int a=0; a<50; a++){
    printf("Monty Python");
}

Faktöriyel örneğine gelirsek:

#include <stdio.h>

int main(){
    int a,sayac,sonuc=1;
    printf("Faktoriyelinin alinmasini istediginiz sayiyi girin:");
    scanf("%d",&a);
    for(sayac=1;sayac<=a;sayac++){
        sonuc=sayac*sonuc;
    }
    printf("%d",sonuc);
    return 0;
}

Burda da girilen değer 3 olsun mesela.Yine sonuc değişkeninin ilk değeri 1. for döngüsünün içinde sayac değişkenine ilk değer olarak 1 atandı. Sayac değişkeni a’dan küçük eşit olduğu sürece döngü dönsün koşulu yazıldı ve döngü içindeki kod çalıştırıldıktan sonra sayac değişkenini arttır komutu verildi. Sonuc=sayac*sonuc kodu işletildi yani sonuc=1*1. Ardından döngünün içindeki kod kesmi bitti ve sayac değişkeni arttırıldı ve 2 oldu. a’dan küçük eşit koşulu sağlanıyor mu diye bakıldı ve evet sağlanıyor, döngüye girildi. sonuc=2*1 kodu işletildi ve sonuc 2 oldu. Ardından sayac değişkeni 1 arttırıldı ve 3 oldu. Küçük eşit koşulu sağlanıyor mu diye bakıldı ve sağlanıyor, döngüye girildi. sonuc=3*2 kodu işletildi ve sonuc 6 oldu. Sayac adlı değişken 1 arttırıldı ve 4 oldu. Küçük eşit koşulu sağlanıyor mu, hayır. Döngüden çıkıldı ve sonuç ekrana yazdırıldı.

Do … while Döngüsü:

Bu deyimin normal while’dan farkı, koşulun sağlanıp sağlanmadığı en başta değil, kod işletildikten sonra bakılır yani döngünün içindeki kod mutlaka en az bir kez çalıştırılır. Do while kullanımı şu şekildedir:

do{
//döngünün içinde yinelenen kod kesimi
}while( koşul )

Şimdi  bunun while’dan farkını şu şekilde gösterelim:

int a=10;
while(a<0){
    printf("Monty Python");
}

Burada a, 0′dan küçük olmadığı için döngüye girilmez ve printf komutu çalışmaz haliyle ama do while da ise:

int a=10;
do{
    printf("Monty Python");
}while(a<0);

Burada ise önce kod çalıştırılıyor ve sonra koşul kontrol ediliyor, koşulun doğru olmadığı görülünce de döngüden çıkılıyor ama kod, koşul doğru olmasa bile 1 kez çalıştırılmış oldu.

Sonsuz Döngü:

Döngülerin hatalı kodlanması sonucu sonsuz döngü dediğimiz olayla karşılaşabiliriz. Örneğin aşağıdaki durumlar sonsuz döngüye birer örnektir:

int a=1;
while(a>0){
    //kod kesimi
    a++; //mantıksal hata
}

veya

while(a>0){
    // kod kesimi
} // sayaç eksikliği

while(7<10){
    // kod kesimi
}// her zaman doğru koşul

Yorum Yapın