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

blok: [block], küme parantezleriyle gruplanmış ifadelerin tümü
deyim: [statement], ifadelerin işletilmelerini ve sıralarını etkileyen 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




if Koşulu

Programda asıl işlerin ifadeler tarafından yapıldığını öğrendik. Şimdiye kadar gördüğümüz programlarda işlemler main isimli işlev içinde baştan sona doğru ve yazıldıkları sırada işletiliyorlardı.

D'de deyimler, ifadelerin işletilme kararlarını veren ve ifadelerin işletilme sıralarını etkileyen program yapılarıdır. Kendileri değer üretmezler ve yan etkileri yoktur. Deyimler, ifadelerin işletilip işletilmeyeceklerini ve bu ifadelerin hangi sırada işletileceklerini belirlerler. Bu kararları verirken de yine ifadelerin değerlerinden yararlanırlar.

Not: İfade ve deyim kavramlarının burada öğrendiğiniz tanımları D dilindeki tanımlarıdır. Başka dillerdeki tanımları farklılıklar gösterir ve hatta bazı dillerde böyle bir ayrım yoktur.

if bloğu ve kapsamı

if deyimi, ifadelerin işletilip işletilmeyeceğine belirli bir mantıksal ifadenin sonucuna bakarak karar veren yapıdır. "if", İngilizce'de "eğer" anlamındadır; "eğer tatlı varsa" kullanımında olduğu gibi...

Parantez içinde bir mantıksal ifade alır, eğer o ifade doğruysa (yani değeri true ise), küme parantezleri içindeki ifadeleri işletir. Bunun tersi olarak, mantıksal ifade doğru değilse küme parantezleri içindeki ifadeleri işletmez.

Söz dizimi şöyledir:

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

Örneğin "eğer baklava varsa baklava ye ve sonra tabağı kaldır" gibi bir program yapısını şöyle yazabiliriz:

import std.stdio;

void main() {
    bool baklava_var = true;

    if (baklava_var) {
        writeln("Baklava yiyorum...");
        writeln("Tabağı kaldırıyorum...");
    }
}

O programda baklava_var'ın değeri false yapılırsa çıkışa hiçbir şey yazdırılmaz, çünkü if deyimi kendisine verilen mantıksal ifade false olduğunda küme parantezi içindeki ifadeleri işletmez.

Küme parantezleriyle gruplanmış ifadelerin tümüne blok, o bölgeye de kapsam adı verilir.

Yazım yanlışlarına yol açmadığı sürece, okumayı kolaylaştırmak için programda istediğiniz gibi boşluklar kullanabilirsiniz.

else bloğu ve kapsamı

Çoğu zaman if'e verilen mantıksal ifadenin doğru olmadığı durumda da bazı işlemler yapmak isteriz. Örneğin "eğer ekmek varsa yemek ye, yoksa bakkala git" gibi bir kararda ekmek olsa da olmasa da bir eylem vardır.

D'de ifade false olduğunda yapılacak işler else anahtar sözcüğünden sonraki küme parantezleri içinde belirtilir. "else", "değilse" demektir. Söz dizimi şöyledir:

    if (bir_mantıksal_ifade) {
        // doğru olduğunda işletilen ifadeler

    } else {
        // doğru olMAdığında işletilen ifadeler
    }

Örnek olarak:

    if (ekmek_var) {
        writeln("Yemek yiyorum");

    } else {
        writeln("Bakkala yürüyorum");
    }

O örnekte ekmek_var'ın değerine göre ya birinci dizgi ya da ikinci dizgi yazdırılır.

else kendisi bir deyim değildir, if deyiminin seçime bağlı bir parçasıdır; tek başına kullanılamaz.

Yukarıdaki if ve else bloklarının küme parantezlerinin hangi noktalara yazıldıklarına dikkat edin. Kabul edilen D kodlama standardına göre küme parantezleri aslında kendi satırlarına yazılırlar. Bu kitap yaygın olan başka bir kodlama standardına uygun olarak deyim küme parantezlerini deyimlerle aynı satırlara yazar.

Kapsam parantezlerini hep kullanın

Hiç tavsiye edilmez ama bunu bilmenizde yarar var: Eğer if'in veya else'in altındaki ifade tekse, küme parantezleri gerekmez. Yukarıdaki ifade küme parantezleri kullanılmadan aşağıdaki gibi de yazılabilir:

    if (ekmek_var)
        writeln("Yemek yiyorum");

    else
        writeln("Bakkala yürüyorum");

Çoğu deneyimli programcı tek ifadelerde bile küme parantezi kullanır. (Bununla ilgili bir hatayı problemler bölümünde göreceksiniz.) Mutlaka küme parantezleri kullanmanızı bu noktada önermemin bir nedeni var: Bu öneriye hemen hemen hiçbir zaman uyulmayan tek durumu da şimdi anlatacağım.

"if, else if, else" zinciri

Dilin bize verdiği güçlerden birisi, ifade ve deyimleri serbestçe karıştırarak kullanma imkanıdır. İfade ve deyimleri kapsamlar içinde de kullanabiliriz. Örneğin bir else kapsamında bile if deyimi bulunabilir. Programların akıllı olarak algılanmaları, hep bizim ifade ve deyimleri doğru sonuçlar verecek şekilde birbirlerine bağlamamızdan doğar. Bisiklete binmeyi yürümekten daha çok sevdiğimizi varsayarsak:

    if (ekmek_var) {
        writeln("Yemek yiyorum");

    } else {

        if (bisiklet_var) {
            writeln("Uzaktaki fırına gidiyorum");

        } else {
            writeln("Yakındaki bakkala yürüyorum");
        }

    }   

Oradaki if deyimlerinin anlamı şudur: "eğer ekmek varsa: yemek yiyorum; eğer ekmek yoksa: bisiklet varsa fırına gidiyorum, yoksa bakkala yürüyorum".

Biraz daha ileri gidelim ve bisiklet olmadığında hemen bakkala yürümek yerine, komşunun evde olup olmamasına göre davranalım:

    if (ekmek_var) {
        writeln("Yemek yiyorum");

    } else {

        if (bisiklet_var) {
            writeln("Uzaktaki fırına gidiyorum");
        
        } else {

            if (komşu_evde) {
                writeln("Komşudan istiyorum");

            } else{
                writeln("Yakındaki bakkala yürüyorum");
            }   
        }
    }   

Burada görüldüğü gibi "eğer böyleyse bunu yap, değilse ama öyleyse onu yap, o da değilse ama şöyleyse şunu yap, vs." gibi yapılar programcılıkta çok kullanılır. Ne yazık ki böyle yazınca kodda fazla boşluklar oluşur: buradaki 3 if deyimi ve 4 writeln ifadesi için toplam 13 satır yazmış olduk (boş satırları saymadan).

Sık karşılaşılan bu yapıyı daha düzenli olarak yazmak için, böyle zincirleme kararlarda bir istisna olarak içlerinde tek bir if deyimi bulunan else'lerin kapsam parantezlerini yazmayız.

Hiçbir zaman kodu aşağıdaki gibi düzensiz bırakmamanızı öneririm. Ben bir sonraki adıma geçme aşaması olarak gösteriyorum. İçlerinde tek bir if olan else'lerin küme parantezlerini kaldırınca kod aşağıdaki gibi olur:

    if (ekmek_var) {
        writeln("Yemek yiyorum");

    } else

        if (bisiklet_var) {
            writeln("Uzaktaki fırına gidiyorum");
        
        } else

            if (komşu_evde) {
                writeln("Komşudan istiyorum");

            } else{
                writeln("Yakındaki bakkala yürüyorum");
            }

Bir adım daha ileri giderek if anahtar sözcüklerini de üstlerindeki else satırlarına çeker ve biraz da hizalarsak, son derece okunaklı bir yapı oluşur:

    if (ekmek_var) {
        writeln("Yemek yiyorum");

    } else if (bisiklet_var) {
        writeln("Uzaktaki fırına gidiyorum");

    } else if (komşu_evde) {
        writeln("Komşudan istiyorum");

    } else{
        writeln("Yakındaki bakkala yürüyorum");
    }

Böylece hem satır sayısı azalmış olur, hem de kararlara göre işletilecek olan bütün ifadeler alt alta gelmiş olurlar. Dört koşulun hangi sırada denetlendiği ve her koşulda ne yapıldığı bir bakışta anlaşılır.

Çok sık karşılaşılan bu kod yapısına "if, else if, else" denir.

Problemler
  1. Aşağıdaki programdaki mantıksal ifadenin true olduğunu görüyoruz. Dolayısıyla programın limonata içip bardağı yıkamasını bekleriz:
    import std.stdio;
    
    void main() {
        bool limonata_var = true;
    
        if (limonata_var) {
            writeln("Limonata içiyorum");
            writeln("Bardağı yıkıyorum");
    
        } else 
            writeln("Baklava yiyorum");
            writeln("Tabağı kaldırıyorum");
    }
    
    Oysa programı çalıştırırsanız, çıktısında bir de tabak kaldırıldığını göreceksiniz:
    Limonata içiyorum
    Bardağı yıkıyorum
    Tabağı kaldırıyorum
    
    Neden? Programı düzelterek beklenen çıktıyı vermesini sağlayın.
  2. Kullanıcıyla oyun oynayan (ve ona fazlasıyla güvenen) bir program yazın. Kullanıcı attığı zarın değerini girsin. Zarın değerine göre ya kullanıcı kazansın, ya da program:
       Zar Değeri         Program Çıktısı
           1             Siz kazandınız
           2             Siz kazandınız
           3             Siz kazandınız
           4             Ben kazandım
           5             Ben kazandım
           6             Ben kazandım
    Başka bir değer      HATA: Geçersiz değer
    
    Ek puan: Hatalı giriş oluştuğunda değeri de yazsın. Örneğin:
    HATA: Geçersiz değer: 7
    
  3. Aynı oyunu şöyle değiştirelim: Kullanıcı 1'den 1000'e kadar bir sayı girsin ve 1-500 aralığında siz kazanın, 501-1000 aralığında bilgisayar kazansın. Hâlâ bir önceki problemdeki çözümleri uygulayabilir misiniz?