AÖF Soru Bankası

AlgoritmalarÜnite 4 Özeti

Yineleme ve Karar Yapıları

BİL204U-ALGORİTMALAR

Ünite 4: Yineleme ve Karar Yapıları

Giriş

Günlük hayatımızın içinde sürekli olarak bir şeyler hakkında karar vermek durumunda kalırız. Algoritmalarda kullanılan karar yapıları da aynı şekilde çalışmaktadır. Karar verme noktasında gerekli mantıksal sorgulama yapılmaktadır. Mantıksal sorgulamalarda birden fazla durumun kontrolü de yapılabilmektedir. Buna ek olarak algoritma tasarımında birden fazla karar yapısı art arda veya iç içe kullanılabilmektedir. İç içe karar yapıları, karar yapısı içerisinde tekrar bir karar yapısı kullanılması ile oluşturulmaktadır.

Birçok problem çözümü için geliştirilen algoritma tasarımlarında tekrar eden işlemler bulunmaktadır. Algoritma çözümlerinde tekrar eden işlemler için döngüler kullanılmaktadır. Bu şekilde tekrar edilen işlemleri her defasında yeniden yazmak yerine bu işlemlerin tekrar ettiğini belirten birtakım sembol ve kelimeler kullanılmaktadır. Programlama dillerinde farklı amaçlar ve durumlar için kullanılabilecek farklı döngü yapıları bulunmaktadır. Algoritma tasarımlarında ise genellikle iki tip temel döngü yapısı kullanılmaktadır. Bunlardan ilki döngü sayısını bildiğimiz yapılar, ikincisi ile döngünün bir koşula bağlı olarak gerçekleştiği yapılardır. Bir algoritma tasarımında tıpkı karar yapılarında olduğu gibi döngü ifadeleri de art arda veya iç içe olarak kullanılabilmektedir.

Karar Yapıları

Bilgisayar biliminde koşullu ifadeler, kararları işlemek için programlama dili komutlarıdır. Bu komutlar, programcı tarafından tanımlanan bir koşulunun doğru veya yanlış olarak değerlendirilmesine bağlı olarak farklı hesaplamalar veya eylemler gerçekleştirir. Karar verme, bilgisayar programlama için kritik öneme sahiptir.

Karşılaştırma Operatörleri

Karşılaştırma operatörleri değerleri karşılaştıran ve doğru veya yanlış döndüren operatörlerdir. >, <, >=, <=, === ve !== örnek olarak verilebilecek operatörlerdir.

Karşılaştırma operatörleri sonuç olarak doğru (true) veya yanlış (false) şeklinde sonuç döndürmektedirler.

Karşılaştırma operatörleri genellikle değişkenler üzerinden kullanılmaktadır. Algoritma tasarımlarında kullandığımız karar noktalarında karşılaştırma operatörleri sıkça kullanılmaktadır.

Mantıksal Operatörler

Mantıksal operatörler, birden çok karşılaştırma ifadesini veya değerini birleştiren ve tek bir doğru/yanlış çıktısı sağlayan operatörlerdir. Operatörler &&, || ve !’dir.

Mantıksal operatörler karar durumlarında birden fazla karşılaştırma gerektiğinde kullanılmaktadır.

Tek Seçimli Yapılar (if Yapısı)

If yapısı programlamada karar verme aşamasında kullanılır. Belli bir bilgi karşılığında programın hangi koşulda ne yapacağını belirler. If yapısı en az iki parçadan oluşur. Bu

parçalar “if ” ve “then” olarak tanımlanabilir. Özetle If ve then ifadesinin anlamı “eğer bir şey doğru ise (if), bir eylem gerçekleştir (then)” şeklinde tanımlanabilir.

Çift Seçimli Yapılar

Programlamada çoğu durumda tek bir koşul yeterli olmaz. Karar vermek üzere değerlendirdiğimiz bilgilerin aşamalı olarak kontrol edilmesi gerekir. Aşamalı kontrol işlemi farklı durumlarda farklı şekillerde yapılabilir.

If-else Yapısı

If-else yapısı If yapısının en az üç aşamalı olanı olarak düşünülebilir. Belli bir bilgi karşılığında programın ne yapacağı karar aşamaları için bilginin verildiği bölüm “if ”, bilgi doğru ise gerçekleştirilecek ifadenin verildiği bölüm “then”, bilgi yanlış ise gerçekleştirilecek ifadenin verildiği bölüm ise “else” olarak tanımlanır.

“else” ifadesinin bir başka kullanım şekli ise “else if ” ifadesidir. Else if kullanılan bir durumun anlamı şu şekilde olabilir: “eğer bir şey doğru ise (If ), bir eylem gerçekleştir (then), bir önceki şey yanlış ama şu anki şey doğru ise (else if ), başka bir eylem gerçekleştir (then), yukarıdakilerin hepsi yanlış ise (else), başka bir eylem gerçekleştir (then)”

İç İçe if Yapısı

Yuvalanmış (iç içe) if ifadesi, başka bir if ifadesinin içine yerleştirilmiş bir if ifadesidir. Uygun eyleme karar vermeden önce koşulların bir kombinasyonunu test etmeniz gerektiğinde, iç içe if ifadeleri sıklıkla kullanılır.

Switch-case Yapısı

Switch ifadesi, birçok alternatif arasından bir kod bloğu yürütmemize izin verir. Aynı şeyi if...else..if merdiveni için de yapabilirsiniz ancak switch ifadesinin söz dizimini okumak ve yazmak çok daha kolaydır.

Döngüler

Bir bilgisayar programındaki döngü, belirli bir koşula ulaşılana kadar tekrar eden bir talimattır. Döngü yapısında döngü bir soru sorar. Cevap eylem gerektiriyorsa, yürütülür. Aynı soru, başka bir işlem yapılmasına gerek kalmayana kadar tekrar tekrar sorulur. Soru her sorulduğunda oluşan duruma yineleme denir. Döngülerin farklı çeşitleri vardır. Yaygın olarak kullanılan iki çeşidi for ve while döngüleridir. For döngüsünün özel bir kullanım çeşidi olan foreach döngüsü de bazı programlama dillerinde kullanılır.

For Döngüsü

For döngüleri, daha döngüye girmeden kaç adet yineleme olacağı bilindiğinde kullanılır. Burada bilinen değer bir dizinin eleman sayısı ya da sabit bir sayı olabilir.

For döngüsünde döngünün kaç kez tekrarlanacağı önceden bellidir. Döngünün sonlanmasını gerektirecek bir müdahalede bulunmadığı sürece başta verilen sayı kadar tekrarlanacaktır.


Foreach Döngüsü

Foreach döngüsü bir koleksiyondaki ögelerin geçişi için bir kontrol akışı ifadesidir. Foreach genellikle bir standart for döngüsü yerine kullanılır. Bununla birlikte, diğer for döngüsü yapılarının aksine, foreach döngüleri genellikle açık bir sayaç tutmaz: Esasen “bunu x kez yap” yerine “bunu bu kümedeki her şeye yap” derler. Bu, olası tek tek hataları önler ve kodun okunmasını kolaylaştırır.

Python dilindeki for döngüsü diğer programlama dillerindeki for döngüsünden ziyade foreach döngüsüne benzer. Ancak diğer programlama dillerindeki for döngüsünün işlevini birebir olarak yerine getirmek de mümkündür.

For döngüsünün belirli bir sayıda tekrarlaması istendiğinde range() fonksiyonunu kullanabiliriz. range() fonksiyonu standart olarak 0’dan başlar, birer birer artarak belirtilen sayıya kadar (belirtilen sayı dâhil değil) devam eder.

While Döngüsü

While yapısı bir kod bloğundan ve bir koşuldan oluşur. Koşul değerlendirilir ve koşul doğruysa bloktaki tüm kod yürütülür. Bu, koşul yanlış olana kadar tekrarlanır. Çünkü while döngüsü, blok yürütülmeden önce koşulu kontrol eder.

While döngüsünde döngünün kaç kez tekrarlanacağı önceden belli değildir. Koşul ifadesi doğru olduğu sürece döngü devam eder. Sonlanmasını gerektirecek bir müdahale döngü içi işlemlerde bulunmaması durumunda döngü sonsuza kadar devam eder.

Do-While Döngüsü

Do-While yapısı while yapısında olduğu gibi bir kod bloğundan ve bir koşuldan oluşur. Do-while döngüsünde ilk olarak koşula bakılmaksızın bloktaki kodları en azından bir defa çalıştırılır, ardından koşul kontrol edilir. Eğer koşul doğru ise kod bloğu tekrar yürütülür. Bu durum koşul yanlış olana kadar devam ettirilir. İki döngü arasındaki fark, while döngüsünde ilk olarak koşul değerlendirilirken, do-while döngüsünde en azından bir kez kodun yürütüldükten sonra koşulun kontrol edilerek devam edilmesidir.

Do-while döngüsünün de tıpkı while döngüsünde olduğu gibi toplam kaç kez tekrarlanacağı önceden belli değildir. Koşul ifadesi doğru olduğu sürece döngü devam eder. Sonlanmasını gerektirecek bir müdahale döngü içi işlemlerde bulunmaması durumunda döngü sonsuza kadar devam eder.

İç İç Döngüler

Bazı durumlarda iç içe döngü oluşturma ihtiyacı doğabilir. İki boyutlu bir dizi üzerinde gezinme, koordinat sistemi üzerinde işlemler vb. durumlar örnek olarak verilebilir.

İç içe döngülerde dış döngünün ilk geçişi, tamamlanana kadar yürütülen iç döngüyü tetikler. Ardından dış döngünün ikinci geçişi, iç döngüyü yeniden tetikler. Bu, dış döngü bitene kadar tekrarlanır. Elbette, iç veya dış döngüdeki bir müdahale bu süreci kesintiye uğratabilir.

Sonsuz Döngüler

Sonsuz döngü, bir bilgisayar programında dışarıdan bir müdahale olmadığı sürece sonsuza kadar devam edecek döngülere verilen isimdir. Sonsuz döngüler, algoritmada var olan bir mantık hatasından ortaya çıkabileceği gibi kasıtlı olarak da oluşturulabilirler. Bir programın kullanıcıdan “çıkış” komutu almadığı müddetçe aynı işi yapması istenecek şekilde kodlanması kasıtlı olarak kullanılan sonsuz döngülere örnek verilebilir.

Sonsuz döngüler, mevcut akış kontrolleri kullanılarak oluşturulabilirler. En yaygın olarak kullanımı “while” döngüsüdür. While döngüsünde yer alan koşul sürekli “true” değeri verilecek şekilde ayarlanarak sonsuz döngü oluşturulabilir.

Kasıtlı olarak oluşturulan sonsuz döngülerin yanında, koşul kontrollü bir döngüde algoritma mantık hatası nedeni ile kasıtsız olarak sonsuz döngülerde oluşabilir. Genellikle bu durumlarda döngü koşulu, döngü içinde asla değişmeyen veya amacına uygun olarak değişmeyen değişkenlerden oluşmaktadır. Bu tür hatalar en çok yeni başlayan programcılar arasında yaygın olmasına rağmen nedenleri oldukça belirsiz olabileceğinden deneyimli programcılar tarafından da yapılabilir. Özellikle liste, ağaç vb. karmaşık veri yapılarının kullanıldığı algoritmalarda veya özyinelemeli (recursion) algoritmalarda kasıtsız sonsuz döngülerle karşılaşmak mümkün olmaktadır. Çoğu sonsuz döngü problemi, kodun incelenmesi ile bulunabilir. Fakat bunun tespiti için genel geçer bir yöntem bulunmamaktadır. Bu tip kasıtsız sonsuz döngüler iyi bir algoritma oluşturulmasında önemli problemler olarak nitelendirilir. Eski işletim sistemlerinde sonsuz döngüler sistemin çökmesine bile neden olurken, günümüzdeki çoklu görev modeli kullanan işletim sistemlerinde ise genellikle programsal bir problem hâline gelmiştir. Fakat programın sonsuz döngü içerisinde gerçekleştirdiği bellek ve disk işlemleri bilgisayarın genelinde yavaşlama ve kilitlenmelere de neden olabilmektedir. Bu tip programlar kullanıcı veya işletim sistemi tarafından sonlandırılabilir.

Bazı programlama dillerinde (ADA, Fotran, ruby vb.) sonsuz döngü oluşturmak için özel yapılar kullanılmaktadır.

Döngü Adımını Atlama

Bazen problem çözümünde algoritmada kullanılan döngünün gövdesi içinde, döngü gövdesinin geri kalanını atlamak ve döngünün bir sonraki adımı devam etmek gereksinimi ortaya çıkabilmektedir. Birçok programlama dilinde bu işlem için “continue” ifadesi kullanılmaktadır. Bazı dillerde ise continue yerine “skip”, “next” gibi ifadeler de kullanılmaktadır. Bu ifade ile döngü sonlandırılmaz ancak bir sonraki adım ile devam eder. Sadece continue ifadesi döngüdeki son adımda kullanılırsa döngüyü sonlan- maktadır. Kısacası, algoritma tasarımında kullanılan continue ifadesi normal bir döngünün akışını değiş- tirmektedir. Yanda continue ifadesi için akış diyagramı sunulmaktadır.


Döngü adımı atlamanın yanında Perl, Ruby gibi bazı diller mevcut adımı tekrarlama ve döngüyü baştan yeniden başlatma gibi seçenekleri de sunmaktadır.

Döngüyü Sonlandırma

Algoritma tasarımında bazı durumlarda döngülerin belirli koşullar altında sonlandırılmaları ve döngü sonrası kodlar ile devam edilmesi istenebilir. Bu gibi durumlarda döngü sonlandırma ifadesi kullanılmaktadır. Neredeyse tüm programlama dillerinde bu ifadeler yer almaktadır. Birçok programla dilinde bu ifade “break” olarak kullanılırken “exit”, “last” gibi ifadelerde kullanılmaktadır. Kod içerisinde bu ifade ile karşılaşıldığında içinde geçerli döngüden çıkılarak döngü sonrası ilk ifade ile çalışmaya devam edilir. Eğer “break” ifadesi iç içe geçmiş bir döngünün içindeyse (döngü başka bir döngünün içindeyse), break ifadesi içinde bulunduğu döngüyü sonlandıracaktır.

Karar yapıları ve döngüler günlük hayatımızda ve bilgisayar üzerindeki problem çözme süreçlerinin en önemli parçalarındandırlar. Karar yapıları, iki ya da daha fazla seçenek arasından seçim yapmasını sağlayan bilgisayara esas gücünü veren önemli ve güçlü bir mantık yapılarıdır. Karar yapıları, insanın düşünme tarzına çok uygun olduğu için anlaşılması son derece kolaydır. Bu yapı sayesinde günümüzde bilgisayarları

her alanda rahatlıkla kullanabilmektedir. Bilgisayarlar günümüzde çok farklı biçim ve şekillerde hayatımızda yer almakta ve bizim hayatımızı kolaylaştıran kararları bizim için almaktadırlar. Bu kararları almak için gerekli verileri ise klasik girdi aygıtlarının yanı sıra sensörlerden elde edilen görüntü, ses, ısı, hareket gibi verileri kullanmaktadırlar. Her ne amaçla kullanılırsa kullanılsın bilgisayarlar, programlarında karar verme süreçlerini kullanmaktadırlar. Karmaşık durumlarda yazılımların hızlı ve doğru kararı alabilmesi için algoritma tasarımının çok iyi bir şekilde yapılması gerekmektedir.

Algoritmik çözüm süreçlerinde kullanılan diğer yapılar ise döngü yapılarıdır. Çünkü algoritma geliştirme süreçlerinde çoğu problem aynı işlemi farklı verileri kullanarak tekrar etmeyi gerektirmektedir. Döngü yapılarının kullanımı son derece önemli olmaktadır. Döngü yapılarının düzgün tasarlanması karar yapılarına nispeten daha zor olmasına rağmen kullanımı daha kolaydır. Bu noktada zor olan bölüm problem içerisinde tekrar eden işlerin belirlenmesi parametrik hâle getirilmesidir.

Karar ve döngü yapılarının doğru kullanımı algoritma tasarlamak ve dolayısıyla etkili yazılımlar geliştirmek için oldukça önemlidir.

Bu ünitenin sorularını uygulamada çözŞıklar, doğru cevaplar ve süreli sınav modu AÖF Soru Bankası uygulamasında