Temel C Programlama -17- While Döngüsü

Daha önceki başlıkta for döngüsünü anlatmıştık. for döngüsünün en önemli yanı for döngüsündeki komutlar belli bir sayıda çalıştırılmaktadır. Ne kadar sayıda olacağı ise for döngü yapısı içerisinde belirtilmiştir. for döngüsünü örneklerde esnetip bu amacın dışında kullansak da for döngüsünün gerçek amacı bütün dongü elemanlarını tek bir satırda toplamak ve belli bir sayıda çalıştırmaya yönelik bir döngü hazırlamaktır.

while döngüsüne baktığımızda ise while döngüsünün sadece döngü şartından oluştuğunu ve bu döngü şartının da program içerisinde belirsiz bir zamanda sağlandığını görürüz. Yani while döngüsünde döngünün ne kadar çevirim boyunca çalışacağından haberimiz yoktur. Döngü şartı sağlanana kadar döngü devamlı olarak çalışır. Şimdi bununla alakalı bir örnek yaptığımızda ne demek istediğimizi daha iyi anlayacaksınız.

#include <stdio.h>
#include <stdlib.h>
int main() {
int c = 1;
while ( c != 0 )
{
printf("\nBir Sayi Girin:");
scanf("%i", &c);
}

printf("\nDonguden Cikildi. ");
printf("\n");
system("PAUSE");
 } // Main Sonu

Bu program öncelikle c adında bir döngü değişkeni tanımlar ve döngü değişkeninin sıfır olmadığından emin olmak için ona ilk değeri verir. Eğer döngü değişkeni sıfır değerinde olursa döngü baştan şartı sağladığı için hiç çalışmayacaktır. Döngü değişkenlerinin ilk değerini takip etmenin önemini burada görebiliriz. Sonrasında kullanıcıdan bir sayı girmesini ister ve klavyeden girilen sayıyı döngü değişkenine aktarır. Eğer sayı döngü şartını sağlamazsa bir daha sayı girilmesini ister ve bu sürekli devam eder. Burada dikkat edilmesi gereken nokta programcının kullanıcının kaç denemeden sonra doğru sayıyı gireceğini bilmemesidir. Elde sadece belirli bir şart olduğu için döngü tamamen bu şarta bağlıdır. Eğer klavyeden 0 değerini girersek programdan çıkacaktır.

Bizim burada incelememiz gereken önemli bir komut olarak while ( c != 0 ) komutu vardır. Şimdi bu döngüler için neden for ya da while adlarının kullanıldığını düşünebilirsiniz. İngiliz dilinde for kelimesi belli bir süre için kullanılır. Örneğin “for 30 years” dediğimizde 30 yıl boyunca anlamına gelir. for döngüsünde de for anahtar kelimesinin ardından belli bir miktar belirtildiği için burada İngiliz dili mantığına uygun for kelimesi kullanılmıştır. Yani bunu Türkçe’de “İçin” kelimesi olarak düşünmemiz doğru olmaz. “While” kelimesi de “iken” anlamı taşımaktadır. Yani while ( c != 0 ) dediğimizde c != 0 iken döngüyü çalıştır anlamına gelmektedir. Tam dile çevirisi ise c değeri 0’a eşit değil iken döngüyü çalıştır olmaktadır. while döngüsünün söz dizimi şöyle olmalıdır.

while(şart)
{
   komutlar;
   komutlar;
   komutlar;
}

while(şart)
tekkomut;

While döngüsünü ana dili İngilizce olanlar için cümlenin başına while… kelimesini koyarak yalancı kod üretmemiz kolay olsa da while döngüsü için yalancı kodu Türkçe’de şu şekilde üretebiliriz.

Kapı kapalı iken kombiyi çalıştır. A sıfıra eşit değil iken a’yı birer birer azalt.

Görüldüğü gibi İngiliz dilinde önce while ifadesi sonra şart koyulması gerekirken bizde önce şart sonra iken ifadesi ve ardından talimatlar eklenmektedir. Buna dikkat ettikten sonra bu kalıpta yalancı kodları oluşturabilirsiniz.

while yapısını kullanırken en çok dikkat etmemiz gereken nokta programın sonsuz döngüye sokulmaması ve döngü bloku ile alakalı bir şartın döngü şartı kısmına yazılmasıdır. Eğer döngü bloku içerisinde döngü şartını bozacak bir nokta yer almıyorsa program döngüden çıkamayacaktır. Ayrıca döngü şartı döngünün çalışma sebebi olduğu için döngü şartı ile alakasız bir değer eklemek döngünün işleyişini bozacaktır. O yüzden döngü şartı seçilirken iyi düşünülmesi gereklidir.

Şimdi while döngüsü ile alakalı biraz daha karmaşık bir program verelim. Fibonacci sayılarını veren programı for döngüsü ile yapabilsek de bunu belirli bir sayı sınırına göre yapmamız gerekirdi. Burada ise kullanıcının girdiği sınıra kadar olan Fibonacci sayılarını while döngüsü ile göstereceğiz.

#include <stdio.h>
#include <stdlib.h>
int main() {
    int t1 = 0, t2 = 1, sonraki_terim = 0, n;

    printf("Bir Sayi Giriniz: ");
    scanf("%d", &n);

    printf("Fibonacci Sayilari: %d, %d, ", t1, t2);

    sonraki_terim = t1 + t2;

    while(sonraki_terim <= n)
    {
        printf("%d, ",sonraki_terim);
        t1 = t2;
        t2 = sonraki_terim;
        sonraki_terim = t1 + t2;
    }
 puts("");
 system("PAUSE");
 } // Main Sonu

Fibonacci dizisi adını italyan matematikçi Leonardo Fibonacci’den almıştır. 0 ve 1 ile başlayan iki sayının kendinden önceki gelen iki sayı ile toplanması işlemidir. Bu basit bir matematik işlemi gibi görünse de bu işlemin altın oran ile bir alakası vardır ve matematikçilerin ilgisini çekmektedir.

int t1 = 0, t2 = 1, sonraki_terim = 0, n;

Biz burada gereken matematik işlemi için dört sayı yani dört değişken tanımladık. Bu değişkenler t1, t2 ve sonraki_terim olarak matematik işleminde kullanılacak. n değeri ise bizim ekranda girdiğimiz sınır değeri olacaktır. Eğer sonuç değeri sınır değerini aşarsa program akışı döngüden çıkacak ve programı sonlandıracaktır.

while(sonraki_terim <= n)

Burada bir ileride toplanacak değerin n sayısı ile karşılaştırılmasını görmekteyiz. Eğer o seferki sonuç değeri n değerinden küçük ya da n değerine eşitse döngü devam etmektedir. Büyük olduğu durumda ise döngüden çıkılmaktadır.

puts(“”);

Burada daha önce bahsettiğimiz puts fonksiyonunu farklı bir işlem için kullandık. Size puts fonksiyonunun otomatik olarak yeni satır ifadesi bıraktığını söylemiştik. O halde yeni satır komutu olarak puts(“”) fonksiyonunu kullanmak kısa ve etkili bir çözümdür.

Burada dikkat ederseniz program bir kere çalışıyor ve ardından kapanıyor. Biz programın sürekli çalışmasını ve bizim için hesap yapmasını istersek programı döngü içerisinde döngüye sokmamız gerekecektir. Bunun için programı şu şekilde düzenleyerek çalıştırabiliriz.

#include <stdio.h>
#include <stdlib.h>
int main() {
	while(1)
	{
    int t1 = 0, t2 = 1, sonraki_terim = 0, n;

    printf("Bir Sayi Giriniz: ");
    scanf("%d", &n);

    // displays the first two terms which is always 0 and 1
    printf("Fibonacci Sayilari: %d, %d, ", t1, t2);

    sonraki_terim = t1 + t2;

    while(sonraki_terim <= n)
    {
        printf("%d, ",sonraki_terim);
        t1 = t2;
        t2 = sonraki_terim;
        sonraki_terim = t1 + t2;
    }
 puts("");
	}
 system("PAUSE");
 } // Main Sonu

Bu programda sadece tek bir komut ekledik o da main’den sonraki while(1) komutudur. Bu döngü içerisinde 1 sayısı olduğundan döngü şartı sürekli sağlanmış olur ve program sonsuz döngüye sokulmuş olur. Biz programın sonsuz döngüye sokulmasını tavsiye etmesek de ana programda böyle bir istisna vardır. Eğer bütün komutları sürekli başa sararak çalıştırma ihtiyacı duyuyorsak böyle bir sonsuz döngü kullanabiliriz. Gördüğünüz gibi while(1) döngüsünün tarama alanı süslü parantezlerle belirtilmiştir ve bütün komutları kapsamaktadır. Artık programımız sürekli çalışan bir program haline gelmiştir.

Bu döngüler hakkında daha fazla örneği ilerleyen konularda sizlere anlatacağız. Anladığınızı varsayarak biraz da sizi aptal yerine koymadığım için çok da fazla giriş seviyesinde anlatmıyorum. Her kodu sürekli satır satır açıklamıyorum ve anlamanızı bekliyorum. Eğer yazının anlaşılırlığında bir sıkıntı varsa lütfen yorumlarda belirtiniz ilerleyen dersleri daha basit seviyede anlatmaya çalışırım.

Last updated