for Döngüsü

Döngüler, bütün programlama dillerinde mevcuttur ve gerçekten de çok önemlidir. Bunun önemini kavramak için ufak bir örnek verelim. Bir önceki blogumuzda yaptığımız uygulamada kullanıcı, ders notunu hesaplıyordu. Fakat dikkat ettiyseniz program, bir ders notunun ortalamasını hesapladıktan sonra kapanıyordu ama kullanıcı birden fazla dersin ortalamasını hesaplamak istiyor olabilir. Bu durumda sürekli programı yeniden mi başlatması gerekir? Elbette hayır. İşte bu yüzden kullanıcı istediği sürece program çalışır durumda olmalıdır, kullanıcı programdan çıkmak istediğinde program sonlanmalıdır. İşte, döngüler arka arkaya sıralanan işlemleri yapabilmemize olanak sağlayan yapılardır.

Diğer programlama dillerini biliyorsanız orada for, while gibi döngülerin de mevcut oladuğunu bilirsiniz. GoLang'de sadece 'for' döngüsü vardır. Biz de bunu göreceğiz. Fakat konuya girmeden önce anlatmam gereken bir şey var.

Programlama dillerinde yazdıklarımız soldan sağa değil, Arapça gibi sağdan sola doğru okunur. Biz normal bir şekilde yazıyoruz evet ama arka tarafta gerçekleşen okuma işlemi budur. Şimdi, aşağıdaki ekran görüntüsüne bakmanızı istiyorum.

İlk önce kırmızı kutu içerisindeki kodlara bakalım. Burada, normal bir şekilde bir değişken tanımladık ve bu değişkenin değerini ekrana yazdırdık. Yeşil kutuya baktığınızda ise 'number = number + 1' şeklinde bir kod görüyorsunuz. Bunun anlamı "number değişkenine 1 ekle ve yeni çıkan değeri number değişkeninin yeni değeri olarak ata." 

Çıktı kısmına baktığımızda 10 değeri kırmızı kutunun sonucudur. 11 değeri ise yeşil kutunun sonucudur. İlk önce number değişkenimizin değeri 10 idi. Daha sonra 'number = number + 1' yaparak bu değişkenin değerini bir artırdık ve sonuç 11 olarak geldi.

Bu kullanımın bir de kısa bir yolu var, hemen bakalım.


'number = number + 1' yazmak yerine bunu 'number++' şeklinde de yazabiliriz. Bunu görmemizin sebebi birazdan bunu for döngüsü içerisinde kullanacağımızdandır. Artık for döngüsüne bakabiliriz.

for yapısının syntax'ını incelememiz gerekiyor. for yapısı içerisinde de süslü parantezler mevcuttur; kırmızı kutulara dikkat edelim.

Şimdi, for ile süslü parantez arasına dikkatli bakalım. Burada yeşil kutu içerisinde 'i := 0' şeklinde bir kod yazmışız. Bu, bildiğiniz değişkendir ve değişkeni 0'a atamış olduk; 'i' bir değişkendir, ona istediğiniz ismi verebilirsiniz. Fakat yaygın kullanım şekli 'i' veya 'j' şeklindedir. Bu bir kural değildir sadece birçok kişi bu şekilde bir kullanım gerçekleştirir.

Mor kutuya baktığımızda ise az önce verdiğimiz i değişkeni için bir koşul belirtiyoruz: 'i <= 5'. Burada söylemek istediğimiz şey "i değişkeni 5'ten küçük olduğu sürece veya ona eşit olana kadar..."

Turkuaz kutuya bakalım. Az önce gördüğümüz kullanımı gerçekleştirmişiz. Bu for yapısında söylemek istediğimiz şey tam olarak şudur: "i değişkeni 0 içindir yani i değişkeni 0'dır. i değişkeni 5'ten küçük olduğu sürece veya 5'e eşit olana kadar i değişkenini birer birer arttır.".

Burada olacak olan şey bu döngü her bir turunu tamamladığında yani i değişkeni 0'dan 1'e atladığında döngü başa saracak ve aynı işlemleri i değişkeni 5'e eşit olana kadar devam edecek.

Scope dediğimiz kapsama alanı burada da mevcuttur ve for döngüsü içerisine yazdıklarımız, for döngüsü uğrunda çalışırlar. for dışına yazdığınız kodlar elbette başka şeylere hizmet edecektir. for döngüsü içerisinde 'fmt.Println(i)' şeklinde bir kodumuz var; bunun ne olduğunu zaten biliyorsunuz. Ekrana, az önce for içerisine verdiğimiz i değişkenini yazdıracağız. Hemen bakalım.


Daha iyi anlamanız için yazdırma işlemini biraz modifiye ettim. Ne yaptığımı bilmiyorsanız göz atın: https://blog-cyberworm.com/blog/print-println-printf

Burada, i değişkenine 0 değerini vermiştik. Bu yüzden döngü 0'dan başladı ve 5 olunca durdu. 5 olunca durmasının sebebi ise '<=' koşul ifadesini vermiş olmamızdır. Eğer sadece '<' kullansaydık yani eşitlik kullanmasaydık bu döngü, i değişkeni 4 olduğunda bitecekti. Ayrıca i değişkenine 0 değerini vermiş olmamız bunun illa öyle olması gerektiği anlamına gelmez. İsterseniz o sayıyı 20 olarak da girebilirsiniz. Hatta yapalım; başarısız olacağız ama nedenini de öğreneceğiz.


Dikkat edin; yaptığımız tek şey i değişkenine 20 değerini vermek. Fakat programı çalıştırdığımızda herhangi bir sonuç alamadık, neden? Çünkü bu kod ile Go'ya dediğimiz şey tam olarak şudur: "i değişken 20 olsun ve i değişkeni 5'ten küçük olduğu sürece veya ona eşit olana kadar i değişkeninin değerini birer birer arttır." Bu cümlede bir mantık hatası söz konusudur, fark ettiniz mi? Çünkü değişken değerimiz zaten 5'ten büyük, değişkenin değerini düşürmemiz lazım ki değişken 5'e ulaşabilsin. Bu yüzden for döngüsü görevini yerine getiremiyor.

Peki, aynı şeyi çok ufak bir değişiklik ile yapsak ne olur?


Bu seferki kodumuz şu: 'i := 20; i >=5; i--' şeklinde. Bunun da anlamı tam olarak anlamı şöyledir: "i değişkeni 20 olsun ve i değişkeni 5'ten büyük olduğu sürece veya ona eşit olana kadar i değişkenini birer birer azalt (i--)." Çıktıda da gördüğünüz üzere 20'den başlayıp 5'e doğru gitmiş.


Dikkat ederseniz for yapısında her kısmı noktalı virgül ile ayırıyoruz. Buna dikkat edin yoksa kodunuzu çalıştıramazsınız. Noktalı virgülü sadece en sonda kullanmıyoruz. Ekran görüntüsündeki yeşil yazıya bakın.


Az önce bahsettiğimiz Scope kavramına bakalım. Yukarıdaki örnekte i değişkeninin for döngüsü içerisinde tanımlandığını ve başka bir bölgede kullanılamayacağını söylemiştik. Yeşil kutuya dikkat edin, i değişkenlerinin altı kırmızı ile çizilmiş yani hata almışız. Çünkü Scope dışındayız. Bu sorunu elbette aşabiliriz, hemen ona da bakalım.


Yukarıdaki ekran görüntüsüne dikkatli bakın. for içerisine vermemiz gereken değişkeni for döngüsünün dışında tanımladım. Bunu yaparak bu değişkene istediğimiz yerden ulaşabilir duruma geldik. Peki, for döngüsünde ne yapacağız?

for döngüsünde bu değişkeni tekrar tanımlamak zorunda değiliz ama bir değişken olduğunu belirtebilmemiz için noktalı virgül eklemek zorundayız. Daha sonra Go bunu görecek ve dışarıda bir yerde buna ait bir değişken olduğunu anlayacaktır. for içerisindeki 'i <= 5' ve 'i--' komutları aslında dışarıda tanımlamış olduğumuz değişken ile bağlantılıdır.

Peki, her yerden erişebileceğimizi söylemiştik; bakalım.


Gördüğünüz gibi i değişkenine hem for içerisinden hem de dışarıdan erişebiliyoruz ve herhangi bir hata almıyoruz.

Şimdi, GoLang'de while döngüsü olmadığını söylemiştik. Fakat Go, for için while kadar işlevli bir kullanım daha sunmuş, hemen ona bakalım.

Yukarıda, yine i değişkenimizi dışarıda tanımladık ve bu sefer for döngüsü içerisine sadece koşulumuzu yazdık. Daha sonra for döngüsünün içerisinde i değişkeninin artırılma işlemini gerçekleştirdik. Dikkatli olun; i değişkeninin tanımlanması dışarıda, i değişkeninin artırılması da for döngüsünün içinde yani bu ikisini de for içerisinde yazmamıza gerek yoktur. Sadece koşulu belirtip geri kalan işlemleri ayrı bir yerde de gerçekleştirebilirsiniz.

Sonsuz Döngü, 'break' ve 'continue'

Sonsuz döngü, adından da anlayacağınız üzere sonsuz bir döngüden ibarettir. Genel olarak sonsuz döngülerden kaçınmamız gerekir çünkü bilgisayarı çok fazla yorar. Bu sonsuz döngüleri engellemek adına bazı koşullardan sonra 'break' komutunu kullanıyoruz. Break, İngilizce'den gelir ve anlamı 'kırmak' olarak geçer. Break kullandığımız zaman programa; "döngüyü kır, bitir" demiş oluruz. Şimdi ilk önce sonsuz döngüyü görelim.

Şimdi, hemen yukarıdaki görselimizi tekrar ele alalım. Bu kod aslında bize şunu söyler: "i değişkeni 5'ten büyük olduğu sürece i değişkenini bir arttır." Bu ne demek oluyor? i değişkeni zaten 20 değerini almış yani zaten 5'ten büyük. Dolayısıyla bu döngü sonsuza kadar çalışacaktır. Hemen bu kodu çalıştırıp ne olduğuna bakalım.

Gördüğünüz gibi program 20'den başladı ve sonsuz bir döngüye girdi. Ben programı durdurana kadar kendisi 20'den 13263'e kadar saydı. Sonsuz döngünün nasıl bir şey olduğunu böylece anlayabiliriz. Bu arada aynısını yaptıysanız döngüden çıkmak için 'CTRL + C' kombinasyonunu kullanabilirsiniz.

Şimdi, programımızı daha sağlıklı bir şekilde; sonsuz döngü olmadan kullanalım.

Yukarıdaki koda dikkat edin ve hatırlayın; kontrollerimizi if ile sağlıyorduk. Burada, for içerisine if ile müdahale ettik ve Go'ya dedik ki: "Tamam, i değişkeni 20'ye eşit ve i değişkeni 5'ten büyük olduğu sürece i'yi birer birer arttır ama eğer i değişkeni 40 olursa o zaman programı sonlandır." if ile koşulu belirtip if içerisine 'break' komutunu verdik ve i değişkeni tam olarak 40 olunca durdu (40 dahil değil). Böylece sonsuz döngüden de kurtulmuş olduk.

Madem 'break' komutunu öğrendik şimdi de 'continue' komutuna bakalım.

Bu komutun Türkçe karşılığı 'devam et, geç' şeklindedir. Önce kullanımına bakalım ondan sonra da açıklamaya çalışalım.

Her şeyi baştan anlatalım. for döngüsü ile Go'ya şunu dedik: "i değişkeni 1'e eşit olsun ve i değişkeni 15'ten küçük olduğu sürece veya 15'e eşit olana kadar i değişkenini bir bir arttır." Buraya kadar olan kısmı biliyoruz. Daha sonra for içerisine bir if bloğu açtık ve şunu dedik: "Eğer i değişkeni 10 olursa onu atla ve devam et.". Çıktı kısmına baktığınızda göreceksiniz ki 10 sayısı ortada yok: '8, 9, 11, 12' şeklinde ilerliyor.

İşte, continue komutu tam olarak bu işe yarıyor. Bir döngü içerisinde atlamak istediğiniz ve kullanıcıya göstermek istemediğiniz verileri bu komut ile kolayca yok sayabilirsiniz.


Yayınlanma Tarihi: 2022-07-30 20:29:25

Son Düzenleme Tarihi: 2022-08-01 22:50:14