C de Döngüler
01 Mart 2008 – 13:53Döngüler sayesinde, bir kod bloğunu birden fazla kere art arda çalıştırabilme imkanını buluruz. Bu art arda çalıştırabilme özelliği program yazarken çok büyük kolaylık sağlar. Çünkü binlerce satırlık bir programda herhangi bir işlemi birden fazla defa yaptırmak isteyebilirsiniz. Zaten bu çoğunlukla her programda kullanılan bir özelliktir. Mesela marketlerde kullanılan bir uygulamayı düşünelim. Ödeme yaparken, müşterinin aldığı her ürünün adı ve fiyatı kasanın ekranında sırayla yazıyor. Bu işlem kasiyerin barkot okutmayı sonlandırmasına kadar devam ediyor. İşte barkotu okutulan her ürünün adının ve fiyatının ekranda art arda yazdırılması bu uygulamada kullanılan bir döngünün olduğunu gösterir. Şimdi C de kullanılan döngü sistemlerini görelim.
while döngüsü
while (doğru mantıklı koşul)
{
çalıştırılacak satır ;
çalıştırılacak satır ;
…
}
while döngüsü ona verilen koşul doğru olduğu sürece içinde bulundurduğu cümleleri çalıştırır. Bunu örneklerle görelim:
Örnek 1:
int i=1;
while(i)
{
printf(“donguleri seviyorum!”);
}
/*bu dongu i degeri 1 oldugu icin sonsuz bir dongudur. Cunku verilen kosul her zaman dogru
(1) oldugundan dongu surekli kendini tekrarlar.*/
Örnek 2:
int j=5, sayi;
while(j<=7)
{
sayi=j+2;
printf(“yeni sayi=%d”,sayi);
j++;
}
/*bu dongu j degeri verilen kosulu sagladıgı surece calisir.Kosul saglanmadiginda yani j degeri 7den buyuk oldugunda kosul yanlıs olacagindan calısmayı bırakır.*/
Örnek 3:
int k=0;
while(k)
{
printf(“bu dongu calismaz!”);
}
/*bu dongude kosul her zaman yanlıs yani 0 oldugundan hiçbir zaman calismaz.*/
Örnek 4:
Bu örnekte matematikte çok ünlü bir sayı dizisi olan fibonacci serisini while döngüsünü kullanarak yazdıracağız. Fibonacci serisinde her sayı kendinden önceki sayıyla toplanır ve yazılır. Yani çıktımız
0 1 1 2 3 5 8 13 21 34 … şeklinde olacak.
#include <stdio.h>
int main( ) {
int i=0;
int ilkdeger=0;
int ikincideger=1;
int deger,sayi;
printf(”bir sayi giriniz\n”);
scanf(”%d”,°er);
printf(”%d %d “,ilkdeger,ikincideger);
while(i<=deger) {
sayi=ilkdeger+ikincideger;
printf(”%d “,sayi);
ilkdeger=ikincideger;
ikincideger=sayi;
i++;
}
return 0;
}
do-while döngüsü
do
{
çalıştırılacak satır ;
çalıştırılacak satır ;
…
}
while ( doğru mantıklı koşul );
do-while döngüsü while döngüsüyle benzeşir. Tek farkı önce ondan isteneni yapar sonra koşulu kontrol eder. Yani do-while döngüsü koşul doğru olmasa bile mutlaka bir kere çalışır. Doğruysa devam eder. Hatırlayacağınız gibi while döngüsü önce koşulu kontrol edip, sonra bu koşul doğruysa ondan istenenleri yapıyordu. Bu açıdan do-while, while döngüsünden ayrılır. Bunu bir örnekle görelim:
#include <stdio.h>
int main( ) {
int sayi=0;
do {
sayi++;
printf(“%d ”,sayi);
} while(0);
return 0;
}
Program çıktısı, 1 olacaktır. Yani döngü önce çalıştırılacak satırları çalıştırıp 1 yazdı ve daha sonra koşulun doğru olup olmadığını kontrol etti. Koşul 0 ( yanlış ) olduğundan döngü sonlandı. Bunu while döngüsüyle yazmış olsaydık:
#include <stdio.h>
int main( ) {
int sayi=0;
while(0) {
sayi++;
printf(“%d ”,sayi);
}
return 0;
}
Programda hiçbir çıktı olmayacaktır. Çünkü koşul başta kontrol edildiğinden, koşul yanlış olduğu için hiç işlem yapmadan döngü sonlanır.
for döngüsü
for ( degiskenin ilk degeri ; kosul ; degiskenin artıs miktarı) {
Çalıstırılacak satırlar;
}
for döngüsü C dilinde en çok kullanılan döngü çeşididir. Çünkü okunabilir ve esnektir. Diğer döngü çeşitlerinde döngünün nerede biteceğini kontrol edebilmek için içerde her dönüşte değeri artan veya azalan bir değişken kullanırız. for döngüsünün farkı ise böyle bir değişkeni zaten yapısı gereği kullanmasıdır. Hem de buna bağlı olarak döngünün ne yapacağı, nerede sonlanacağı başta belirtildiğinden anlaşılması kolaydır. for döngüsünün yapısını bir örnekle açıklayalım:
int sayac;
for (sayac = 1; sayac <=5 ; sayac++) {
printf (”sayaç değeri: %d\n”, sayac);
}
Bu kod ekrana şu satırları yazacaktır:
1
2
3
4
5
for döngüsü soldan sağa doğru işleyerek çalışır. Yani önce sayac degiskeninin başlangıç değerini verildiği gibi 1 alır. Sonra verdiğimiz koşulun doğru olup olmadığını kontrol eder. Bu örnekte değişkenin değeri 5ten küçük olduğu için koşul sağlanır. Ardından içeri girip çalıştırılması istenen cümleleri çalıştırır. Yani ekrana 1 yazar ve alt satıra geçer. Sonra sayac değerini 1 artırır ve tekrar başa döner. Aynı işlemi koşul sağlandığı sürece devam ettirir.
for döngüsünün esnek olduğundan bahsetmiştik. Bununla ilgili for döngüsünün farklı yazılış biçimlerini görelim. Bu örneklerin hepsinde çıktı aynı olacaktır. Sadece yazılışlar farklıdır.
Örnek 1:
int sayac = 1;
for ( ; sayac <= 5; sayac++)
{
printf (”sayaç değeri: %d\n”, sayac);
}
Örnek 2:
int sayac = 1;
for ( ; sayac <= 10; )
{
printf (”sayaç değeri: %2d\n”, sayac);
sayac++;
}
Örnek 3:
int sayac = 1;
for ( ; ; )
{
printf (”sayaç değeri: %2d\n”, sayac);
sayac++;
if (sayac >10) break;
}
İç içe döngüler
İç içe döngüler birden fazla döngünün art arda çalıştırılması anlamına gelir. Bu yazılan programlarda çok sık kullanılan bir uygulamadır. İç içe döngülerin yapısını basit bir örnekle görelim:
Örnek 1:
for( i=0 ; i<3 ; i++) {
for( k=1 ; k<5 ; k++) {
printf(“%d ”, k);
}
printf(“\n”);
}
Program çıktısı: 1 2 3 4
1 2 3 4
1 2 3 4 olacaktır.
Örnek 2:
Bu örnekte de iç içe kullanılan while ve for döngüleriyle gene matematikte ünlü bir dizilim olan pascal üçgenini yazdıracağız. Kullanıcıdan bir sayı isteniyor ve program çalıştırıldığında bu sayı kadar satırlık pascal üçgeni oluşturuluyor. Yani çıktımız
1
1 1
1 2 1
1 3 3 1
… şeklinde olacak.
#include <stdio.h>
int main(){
int a=0;
int binom=1;
int b;
int n;
printf(”bir sayi giriniz:”);
scanf(”%d”,&n);
while(a<n)
{
for(b=0;b<=a;++b)
{
if((b==0)||(a==0))
binom=1;
else
binom=binom*(a-b+1)/b;
printf(”%d”,binom);
}
printf(” \n”);
a=a+1;
}
return 0;
}
break ve continue deyimleri
break deyimi içinde kullanılan döngüyü sonlandırmak için kullanılır. Döngü içerisinde herhangi bir yerde kullanıldığında sıra bu satıra geldiğinde ardından normalde çalışması gereken başka cümleler olsa bile döngü sonlanır.
Örnek:
int i=0;
while(i<5) {
printf(“basak”);
break;
printf(“koldas”);
i++;
}
Normalde bu kodu break deyimi olmadan yazdığımızda 5 kere yan yana basakkoldas yazması gerekirken, burada break deyimini kullandığımız için, 1 kere basak yazar ardından break deyimini gördüğünde koldas yazmadan döngüden çıkar, döngü sonlanır.
continue deyimi ise döngüde kullanıldığı yerde altında başka cümleler olsa bile bunları çalıştırmadan tekrar döngünün başına gelir.
Örnek:
int i=0;
while(i<5) {
printf(“basak”);
continue;
printf(“koldas”);
i++;
}
Burada ise önce basak yazılır ardından continue deyimi geldiğinden koldas yazmadan döngü tekrar başa döner. Döngü continue satırına geldiğinde altındakileri işlemeden başa atladığı için i nin değeri değişmez, hep aynı kalır. Dolayısıyla sonsuz sayıda basakbasakbasak… yazılır.
Sonsuz döngüler
Bir önceki konuda continue deyimi kullanıldığı için içerdeki ifadelerin sonsuz sayıda yazıldığını söylemiştim. Hazır bu konuya değinmişken sonsuz döngüleri de görelim.
Döngüye yazılan koşul her zaman doğru olan bir ifade olduğunda döngü sonlanmaz. Döngü koşulu her kontrol ettiğinde doğru çıktığı için içindeki satırlar sonsuza kadar çalıştırılır. Bu döngüler programlarda istenmez çünkü bu durum bir mantık hatasıdır. Program akışı sürekli devam ettiğinden dolayı işlemci aşırı yüklenir, hatta bir süre sonra bilgisayar kitlenir. Buna birkaç örnek verelim:
Örnek 1:
while (1) {
printf(“bu dongude bi mantik hatasi var!!”);
}
Örnek 2:
int a=5;
while ( 1<3 || 5>2) {
printf(“%d”, a++);
printf(“galiba dogru calismiyorum!”);
printf(“ve bir ise yaramiyorum…”);
}

