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