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
-
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. - 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
- 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?