D Programlama Dili – Programlama dersleri ve D referansı
Ali Çehreli

deyim: [statement], ifadelerin işletilmelerini ve sıralarını etkileyen program yapısı
döngü: [loop], tekrarlanan program yapısı
ifade: [expression], programın değer oluşturan veya yan etki üreten bir bölümü
kapsam: [scope], küme parantezleriyle belirlenen bir alan
mantıksal ifade: [logical expression], değeri false veya true olan ifade
... bütün sözlük



İngilizce Kaynaklar


Diğer




while Döngüsü

while döngüsü if koşuluna çok benzer ve onun tekrar tekrar işletilmesidir. Mantıksal bir ifade alır, bu ifade doğru ise kapsamdaki ifadeleri işletir. Kapsamdaki işlemler tamamlanınca mantıksal ifadeye tekrar bakar ve doğru olduğu sürece bu döngüde devam eder. "while", "olduğu sürece" demektir. Söz dizimi şöyledir:

    while (bir_mantıksal_ifade) {
        // işletilecek bir ifade
        // işletilecek başka bir ifade
        // vs...
    }

Örneğin "baklava olduğu sürece baklava ye" gibi bir ifade şöyle programlanabilir:

import std.stdio;

void main() {
    bool hâlâ_baklava_var = true;

    while (hâlâ_baklava_var) {
        writeln("Tabağa baklava koyuyorum");
        writeln("Baklava yiyorum");
    }
}

O program sonsuza kadar o döngü içinde kalacaktır, çünkü hâlâ_baklava_var değişkeninin değeri hiç değişmemekte ve hep true olarak kalmaktadır.

while'ın gücü, mantıksal ifadenin programın çalışması sırasında değiştiği durumlarda daha iyi anlaşılır. Bunu görmek için kullanıcıdan bir sayı alan ve bu sayı "0 veya daha büyük" olduğu sürece döngüde kalan bir program düşünelim. Hatırlarsanız, int türündeki değişkenlerin ilk değeri 0 olduğu için bu programda da sayı'nın ilk değeri 0'dır:

import std.stdio;

void main() {
    int sayı;

    while (sayı >= 0) {
        write("Bir sayı girin: ");
        readf(" %s", &sayı);

        writeln(sayı, " için teşekkürler!");
    }

    writeln("Döngüden çıktım");
}

O program girilen sayı için teşekkür eder ve eksi bir sayı girildiğinde döngüden çıkar.

continue deyimi

"continue", "devam et" demektir. Bu deyim, döngünün geri kalanındaki ifadelerin işletilmeleri yerine, hemen döngünün başına dönülmesini sağlar.

Yukarıdaki programda girilen her sayı için teşekkür etmek yerine, biraz seçici olalım ve 13 değeri girildiğinde beğenmeyip tekrar döngünün başına dönelim. Bu programda 13'e teşekkür edilmez, çünkü sayı 13 olduğunda continue ile hemen döngünün başına gidilir:

import std.stdio;

void main() {
    int sayı;

    while (sayı >= 0) {
        write("Bir sayı girin: ");
        readf(" %s", &sayı);

        if (sayı == 13) {
            writeln("Uğursuz sayı kabul etmiyorum...");
            continue;
        }

        writeln(sayı, " için teşekkürler!");
    }

    writeln("Döngüden çıktım");
}

O programın davranışını şöyle özetleyebiliriz: girilen sayı 0 veya daha büyük olduğu sürece sayı al, ama 13 değerini kullanma.

continue deyimi do-while, for, ve foreach deyimleriyle birlikte de kullanılabilir. Bu olanakları sonraki bölümlerde göreceğiz.

break deyimi

Bir çok sözlük anlamı olan "break" D'de "döngüyü kır" anlamındadır. Bazen artık döngüyle işimiz kalmadığını anladığımızda döngüden hemen çıkmak isteriz; break bunu sağlar. Bu programın aradığı özel sayının 42 olduğunu varsayalım ve o sayıyı bulduğu an döngüyle işi bitsin:

import std.stdio;

void main() {
    int sayı;

    while (sayı >= 0) {
        write("Bir sayı girin: ");
        readf(" %s", &sayı);

        if (sayı == 42) {
            writeln("ARADIĞIMI BULDUM!");
            break;
        }

        writeln(sayı, " için teşekkürler!");
    }

    writeln("Döngüden çıktım");
}

Şimdiki davranışını da şöyle özetleyebiliriz: girilen sayı 0 veya daha büyük olduğu sürece sayı al, 42 gelirse hemen çık.

break deyimi do-while, for, foreach, ve switch deyimleriyle birlikte de kullanılabilir. Bu olanakları sonraki bölümlerde göreceğiz.

Koşulsuz döngü

break deyiminin kullanıldığı bazı durumlarda bilerek koşulsuz döngü oluşturulur ve break deyimi o döngünün tek çıkışı olur. (Tam doğru olmasa da koşulsuz döngü yerine sonsuz döngü dendiği de olur.) Koşulsuz döngü oluşturmak için while'a sabit true değeri verilir. Örneğin, kullanıcıya bir menü göstererek ondan bir komut bekleyen aşağıdaki program, ancak kullanıcı özellikle istediğinde bu döngüden çıkmaktadır:

import std.stdio;

void main() {
    // Koşulsuz döngü, çünkü mantıksal ifade hep true:
    while (true) {
        write("0:Çık, 1:Türkçe, 2:İngilizce - Seçiminiz? ");

        int seçim;
        readf(" %s", &seçim);

        if (seçim == 0) {
            writeln("Tamam, sonra görüşürüz...");
            break;   // Bu döngünün tek çıkışı

        } else if (seçim == 1) {
            writeln("Merhaba!");

        } else if (seçim == 2) {
            writeln("Hello!");

        } else {
            writeln("O dili bilmiyorum. :/");
        }
    }
}

(Not: Koşulsuz döngülerden hata atılınca da çıkılabilir. Hata atma düzeneğini daha sonraki bir bölümde göreceğiz.)

Problemler
  1. Şu program girişten 3 geldiği sürece döngüde kalmak için programlanmış ama bir hata var: kullanıcıdan bir kere bile sayı istemiyor:
    import std.stdio;
    
    void main() {
        int sayı;
    
        while (sayı == 3) {
            write("Sayı? ");
            readf(" %s", &sayı);
        }
    }
    

    Neden? O programdaki hatayı giderin ve beklendiği gibi çalışmasını sağlayın: kullanıcıdan sayı alsın ve sayı 3 olduğu sürece döngüde kalsın.

  2. Bilgisayar iki kişiye (Ayşe ve Barış) şöyle bir oyun oynatsın: en başta Ayşe'den 1-10 aralığında bir sayı alsın. Ayşe'nin bu aralık dışında sayı girmesini kabul etmesin ve doğru sayı girene kadar Ayşe'den sayı almaya devam etsin.

    Ondan sonra Barış'tan teker teker sayı almaya başlasın ve Barış'ın girdiği sayı Ayşe'nin baştan girdiği sayıya eşit olunca oyunu sonlandırsın.

    Not: Ayşe'nin girdiği sayı ekranda göründüğünden tabii ki Barış tarafından hemen bilinir. Bu aşamada bunun bir önemi yok; burada amacımız döngüleri öğrenmek.