Merhaba, hoş geldiniz. Bu derste while ve do while döngülerinden bahsetmek istiyorum.
Esasen kodu tekrarlamanıza olanak tanıyan for döngüsünden bahsetmiştik.
C'de while ve do while olarak adlandırılan ve aynı şeyi farklı sözdizimiyle yapan
başka yapılar da vardır.
Yani while döngüsü while döngüsü bir dizi ifadeyi tekrarlamak için bir mekanizmadır
ve belirli bir mantıksal ifade doğru olarak değerlendirildiği sürece yürütmenin devam etmesini sağlar.
Yani burada da aynısı var. Tıpkı if deyimlerinin belirli bir kodu çalıştırması gibi
while deyimleri de bir Boolean değerlendirmesine dayalı olarak belirli bir kodu birkaç kez çalıştırır.
For döngüsünde yapabileceğiniz her şeyi while döngüsünde de yapabilirsiniz,
sadece sözdizimi farklıdır.
Yani while döngüleri şöyle bir şeye benziyor.
Çok yüksek bir seviyede, sözde koda bakarsak, bu
koşul doğruyken, bunu yapmaya devam edin.
Bunu daha dünyevi bir örnekle ilişkilendirmek gerekirse.
Temel olarak, açken sandviç yiyin, bunun gibi bir şey.
Yani kodu tekrar edeceksiniz. Açken birçok sandviç yemeye devam edeceksiniz.
while döngüsü için genel sözdizimi aşağıdaki gibidir.
Bu da size gövde içindeki bir ifadenin sözdizimini gösteriyor,
bu nedenle parantez veya küme parantezleri sağlamanıza gerek yok.
Kıvırcık parantez ve köşeli parantez terimlerini aynı
terminolojide kullanma eğilimindeyim.
Birden fazla deyim yerine tek bir deyim kullandığınızda sözdizimi şu şekilde görünür.
Çoklu ifadelerde bu parantezleri kullanmak zorundasınız, tekli ifadelerde
ise kullanmazsınız, bunlar isteğe bağlıdır. Onlara sahip olamazsınız ya da sahip olmak zorunda değilsiniz.
İfade, for döngüsü ve if deyiminde olduğu gibi parantezlerin
içine girer. Buradaki ifade, tek bir çıkış koşulu
olması bakımından for döngüsünden farklıdır.
Bu sadece bir ifade. Döngü kontrol değişkenini başlatmazsınız.
Parantezler arasındaki döngü kontrol değişkenini değiştirmezsiniz.
Sadece ifade, sadece çıkış koşulu.
while döngüsünün devam etmesi için gereken koşul başlangıçta test edilir.
Yani bu, döngünün en tepesi.
Yani bu, ön test döngüsü anlamına geliyor. Bunun anlamı, gövde içinde
0 kez veya birden çok kez çalıştırılabileceğidir.
Ve yine, bu konuyla ilgili olacak çünkü do while döngüsü biraz farklı bir şey yapıyor.
İfade false olarak başlarsa, gövdedeki döngü deyimlerinin
hiçbiri yürütülmez.
Bu yüzden en üst testte yer alıyor.
Yani ilk soruya hayır aç değilim cevabını verirseniz,
asla sandviç yemeyeceksiniz. Doğrudan kahveye ya da bir sonraki
kod satırına geçeceksiniz. Döngünün gövdesine girmeyeceksiniz.
Döngü koşulu doğru olarak başlarsa, döngü
gövdesi, döngü sona erecekse bunu değiştirmek için bir
mekanizma içermelidir. Aksi takdirde, sonsuz bir döngü yaşarsınız.
Yani döngü kontrol değişkenini tek bir deyimde değiştirdiğiniz for döngüsünde, bunu gövde içinde yapmanız
gerekmesi dışında while döngüsünde de aynı şey geçerlidir.
While döngüsü, döngü kontrol değişkenini
bir yerde başlatacak ve ardından kodun gövdesi
içinde değiştirecektir.
Bahsettiğim gibi, while döngüsü for döngüsünün yaptığı her şeyi yapabilir, sadece sözdizimi farklıdır.
Ve yine, for döngüsü daha kısadır. Her şeyi tek bir satırda yapabilirsiniz,
oysa while döngüsünde bu 3 şeyi ayrı satırlarda yapmanız gerekir.
Yani bu örnekte, int
count eşittir 0'a sahibiz. Bu, döngü kontrol değişkenidir. Bu while döngüsü ifadesinin dışındadır.
Bir for deyimi kullanıyor olsaydınız, bu ilk noktalı virgülden önce olduğu gibi for döngüsünün içine giderdi.
Döngü kontrol değişkeninin başlatıldığı yer burasıdır.
Sonra while anahtar sözcüğüne sahip olursunuz ve parantezlerin içinde Boolean ifadesine sahip olursunuz.
Bu, ikinci noktalı virgülden hemen önceki ikinci ifade
olan for döngüsüne eşdeğer olacaktır.
Doğru ya da yanlış olduğunu kontrol ettiğiniz şey budur. Doğru veya yanlış ise döngünün gövdesine girersiniz.
Sayım 5'e eşitten küçükse, sayımı yazdıracaksınız.
Bundan sonraki kod satırı çok önemlidir, artı artı
sayısı çünkü bu döngü kontrol değişkenini değiştirir.
Bu artı artı sayımı yapmanız gerekir, aksi takdirde döngüden asla çıkamazsınız çünkü en üstteki
koşul sayımın 5'ten küçük olup olmadığını söyler. Sayım her zaman 1'e eşitse, sonsuz bir döngüye sahipsiniz
demektir.
Yani bu artı artı sayısı çok çok önemli.
Plus plus count remember bir artırma operatörüdür.
Bu sadece sayının sayı artı 1'e eşit olduğunu söylüyor.
Bu döngü 5 kez çalışacak.
Sayım 1'e eşit, sayım 2'ye eşit, sayım
3'e eşit, sayım 4'e eşit ve sayım 5'e eşit olacak şekilde çalışacaktır.
Sayım 6'ya eşit olduğunda, döngüden atlayacak ve gövdede
daha fazla deyimden çıkmayacaktır.
Yine, for döngüsü açısından düşünüyor olmalısınız.
Bu sadece döngü kontrol değişkenidir ve döngü kontrol değişkeninin
değiştirilmesi gerçek döngünün bildiriminde yer almaz.
Hepsi for döngüsünde olduğu gibi tek bir satırda değil.
İşte mantığın döngüyü sonlandırmak için kontrol edildiği başka bir örnek.
Burada gösterdiğim ilk örnekte, bu bir sayaç kontrol döngüsüdür.
Her zaman aynı sayıda yani 5 kez yürütülecektir.
Bir sonraki örnekte, döngü 100 kez ya da 0 kez
çalıştırılabilir.
Burada while anahtarımızda num'un negatif 1'e eşit olmaması durumunda değerlendirdiğimiz
koşul tamamen kullanıcının girdiklerine bağlıdır çünkü num kullanıcının
girdiği şeydir.
Yani bu döngü 0 kez de çalışabilir, 100 kez de çalışabilir.
Her şey klavyeden gelen girdiye bağlıdır.
Buna da sentinel kontrol döngüsü denir. Karşı kontrollü değil.
Mantığa ve değişebilen değişkenlere dayanır.
Böylece num negatif 1'e eşit değilken num klavyede
girdiğimiz değeri depolar.
Kullanıcı klavyeye hiçbir zaman negatif 1 girmezse, bu döngü hiçbir zaman çıkmayacaktır.
Yani burada while ile aynı sözdizimine sahibiz.
Buradaki döngü kontrol değişkenimiz num'dur. En üstteki 0'ı başlatırız ve ardından
kullanıcının klavyede girdiğine bağlı olarak döngüye girip girmeyeceğimizi
görmek için onu değiştiririz.
Sonra while anahtar sözcüğünün parantezinin içinde, aslında
negatif 1 olup olmadığını kontrol ediyoruz.
Ve sonra while döngüsünün gövdesinde parantezlerle birlikte, parantezlerin
orada olması gerekmez çünkü tek bir ifade vardır, ancak ben onları oraya koymayı seviyorum.
Sonra bir sonraki girişi de okuruz ve num'da saklarız.
Kullanıcı bir sonraki giriş için negatif 1 girerse, döngüden atlayacaktır.
Bunu yapmazlarsa, yürütmeye devam edecek ve onlardan bilgi girmelerini isteyecektir.
Bir do while döngüsü, while döngüsündeki for döngüsünden
biraz farklıdır çünkü bir test sonrası döngü olarak kabul edilir.
Yani while döngüsünde gövde, koşul doğru olduğu sürece yürütülür.
Gövdenin koşulsuz olarak ilk kez çalıştırıldığı do while döngüsünde, test en
altta olduğu için do while döngüsü, döngüyü her zaman
en az bir kez çalıştıracağınız anlamına gelir.
Cesedi her zaman en az bir kez infaz edeceksiniz,
daha fazla da olabilir, ama her zaman bir kez, asla 0 değil.
Çünkü çıkışı test etme koşulu en alttadır.
Buna test sonrası döngü denir. Buna çıkış kontrollü döngü de denir.
Dolayısıyla, döngünün en az bir kez girmesini istiyorsanız do a while döngüsünü
kullanırsınız.
Genellikle do while döngüsü kullanmanıza gerek yoktur
çünkü isterseniz aynı şeyi bir for döngüsü içinde de yapabilirsiniz, sadece
kodu döngünün dışına koyarsınız.
Yani do while döngüsü gerçekten gerekli değildir, ancak kullanmak isteyebileceğiniz durumlar olabilir.
İlk yürütmeden sonra, gövde yalnızca
koşul doğru olduğu sürece yürütülür. Yani döngünün ilk yinelemesinden sonra, normal
döngüler gibi hareket edecektir. Koşul yanlışsa atlayacaktır.
İşte böyle görünüyor. Do üstte yer alır ve koşul için
test while anahtar sözcüğü ile altta yer alır.
Yani do yeni bir anahtar kelimedir
ve gövdede birden fazla ifade olup olmamasına bağlı olarak parantezli
ya da parantezsiz olacaktır.
Gövde içinde yalnızca tek bir ifadeniz varsa ayraç kullanmazsınız. Sadece üstte yapmanız gerekecek ve sonra
döngünün alt kısmında while'a sahip olacaksınız.
Ve while içinde, parantezler içinde, kontrol ettiğiniz koşul olacak Boolean değerlendirmesine
sahip olacaksınız. Ancak yine de, bu koşul
en altta olduğu için ifadeyi en az bir kez çalıştırmanız her zaman garantidir.
Soldaki örnek tek bir ifade, sağdaki örnek ise birden
fazla ifadedir. Yani parantezleriniz, küme parantezleriniz var.
Ve yine, bu ikinci örnekte, parola istemi gibi bir şeye sahip olabileceğinizi, kullanıcı girdisini okuyabileceğinizi
ve girdinin parolaya eşit olmadığını söylüyorsunuz.
Ancak her zaman en az bir kez bu şifreyi soracaksınız.
Yani bir başka while döngüsü örneği.
Buradaki ilk üstteki örnek, döngünün bir kez veya birçok
kez çalışabileceğini, ancak
asla 0 olmayacağını gösteren bir örnektir.
Her şey kullanıcının ne girdiğine bağlıdır. Her zaman en az bir kez çalışacaktır, ancak
bu klavyeden girdi okumaktır. Scanf fonksiyonunu görüyoruz.
Ve kullanıcı 20 girmediği sürece bu döngüyü
yürütecektir.
Bir while döngüsü aynı zamanda bir sayaç kontrol döngüsü de olabilir, bu da belirli bir sayıda yürütüleceği anlamına gelir.
Bu durumda, bu örnekte 4 kez yürütülecektir.
İnt sayımız 4'e eşittir. Sonra en üstte do var ve sonra parantezlerimiz
var çünkü gövde içinde birden fazla deyimimiz var.
Ve gövdenin içindeki döngü kontrol değişkenini artırıyoruz, sayı artı artı.
Ve sonra kontrol koşulu hala en altta. Yani bunu 4 kez uygulayacaksınız.
Ve while anahtar sözcüğünün sağ küme paranteziyle aynı satırda olması gerekmediğini fark edeceksiniz.
Genelde öyledir ama öyle olmak zorunda değildir.
En alttaki while anahtar sözcüğü de noktalı virgülle bitiyor, bunu da fark etmelisiniz.
Böylece bu döngüler hakkında her şeyi öğrendik; for döngüsü, while ve do while.
Hangi döngüleri kullanmalısınız?
Hangi döngüyü kullanmak istediğinize karar vermeniz gereken ilk şey, öncelikle ön test mi yoksa
son test mi olmasını istediğinizdir. En az bir kez yürütülmesini mi istiyorsunuz yoksa
en az bir kez yürütülmesini istemiyor musunuz? En az bir kez çalışmasını istiyorsanız,
do while kullanacaksınız. Eğer bu bir koşul değilse,
for veya while ya da do while kullanabilirsiniz.
Dolayısıyla, hangi döngüyü kullanacağınıza karar verdiğinizde, bu her
zaman bir ön test döngüsü olacaktır. Do while döngüsünden uzak durmalısınız.
Çoğu durumda daha iyi bir seçenektir. Okuması çok daha kolay.
Gerçekten döngü yapmadan önce bakmak çok daha iyidir.
Sadece döngüye başlamayın, bu koşulu en başta kontrol etmek daha iyidir.
Okunabilirlik açısından, döngü testte ise çok daha sezgiseldir.
Bu yüzden döngüyü başlangıçta kontrol edin, bir for veya while kullanın.
Ve birçok durumda, test başlangıçta karşılanmazsa döngünün tamamen atlanması önemlidir.
Yine, durum böyle olduğu için test en üstte olmalıdır. Her zaman en az bir kez infaz yapmamalısınız.
Çoğunlukla her zaman uygulamak istemeyebilirsiniz.
Bu yüzden bir süreliğine kullanmalısınız.
Şimdi soru şu: Bir süreliğine hangisini kullanmalıyım?
Bu gerçekten kişisel bir tercih meselesi. Önemli değil çünkü bu dersin başında
da söylediğim gibi, bir süre içinde yapabileceğiniz her şeyi bir süre içinde de yapabilirsiniz.
Yani for döngüsünü daha çok seviyorsanız, for bazen biraz daha
hızlıdır çünkü tüm döngü kontrol değişikliği, başlatma ve çıkış
koşulu tek bir satırda olabilir.
Ama bu gerçekten size kalmış.
Genellikle yaptığım şey, karşı kontrollü döngüler için for döngüsünü kullanmaktır.
Ama yine de aynısını kullanabilirsiniz. Aslında bir for döngüsü kullanmak ve bunu
bir while gibi göstermek istiyorsanız, sadece birinci ve
üçüncü ifadelere sahip olmazsınız, sadece
tek bir ifadeye sahip olursunuz. Yani for noktalı virgül testleri noktalı virgül while testi ile aynıdır.
Yani bu size while içindeki for'un aynı şeyi yapabileceğini gösteriyor, sadece sözdizimini
biraz değiştirin.
Aslında bir while döngüsü kullanmak istiyorsanız ancak bunun bir for döngüsü gibi davranmasını
istiyorsanız, o zaman bunun önüne başlatma ekler ve gövdeye güncelleme ifadelerini dahil edersiniz.
Yani yapacağınız şey şuna benzer ve genellikle bunu her zaman bir while döngüsü için yaparsınız.
Ancak bu bir for döngüsüne eşdeğerdir. Başlatma işlemi, döngü kontrol değişkeni
olan kontrol değişkeninin döngüsünün dışındadır.
Test koşulu parantezlerin içinde yer alır ve ardından
while döngüsünün gövdesindeki döngü kontrol değişkenini güncellersiniz.
Ve bu, for döngüsü başlatma testi güncellemesi ve ardından gövde
ile aynıdır. Hiçbir fark yok.
Yine bahsettiğim gibi, for döngüsünü belki de sayaç kontrol döngüleri için biraz daha fazla kullanıyorum.
Ancak o gün nasıl hissettiğime bağlı olarak hem for hem de while'ı birbirinin yerine kullanacağım.
Bu nedenle, bir değişkeni tek bir satırda başlatmak ve güncellemek istiyorsanız
bir for döngüsü biraz daha uygun olabilir.
Koşullar başka türlü olduğunda while döngüsü daha iyidir.
Yine, sayaç kontrol döngüleri için, sentinel kontrol döngüleri belki while döngüsü.
Ve işte bir sentinel kontrol döngüsüne sahip bir while döngüsü ve aynı şeyi
tekrar yapan bir for döngüsü veya kontrol edilen bir sayaç için bir for döngüsü örneği.
Döngü, kullanıcının ne girdiğine bağlı olarak
birçok kez çalışabilirken, for döngüsü sayaç kontrollüdür.
Yani bu do while üzerindeki while. Umarım bu açıklığa kavuşmuştur.
Bu döngülere aşina olun çünkü sık sık kodu tekrarlamak istersiniz.
Konuşmada biraz iç içe döngüler ve break veya continue kullanarak bir döngüden çıkmak için
biraz farklı mekanizmalar hakkında bilgi verilecektir.
Teşekkür ederim.