Bölüm 8 İfade Seviyesindeki Kontrol Yapıları ISBN 0-321-49362-1
Bölüm 8 Konular Giriş Seçme İfadeleri Yinelemeli İfadeler Şartsız Dallanma Korumalı Komutlar Sonuçlar
Kontrol Akışının Seviyeleri İfadeler içinde Program birimleri boyunca Program deyimleri boyunca
Kontrol Yapısı Kontrol yapısı bir programın akışını ve yürütülmesini kontrol eden ifadedir
Seçim İfadeleri Bir seçim ifadesi yürütmenin iki ya da daha fazla yolu arasında bir seçim yapma aracı sunar İki genel sınıfı: İki-yollu seçiciler Çok-yollu seçiciler
İki-Yollu Seçim İfadeleri Genel form: if control_expression then clause else clause Tasarım Sorunları: Kontrol ifadesinin formu ve türü ne? then ve else cümleleri nasıl belirtiliyor? İç içe seçicilerin anlamları nasıl belirtilmeli?
İki-Yollu Seçim: Örnekler FORTRAN: IF (boolean_ifade) deyim Problem: yalnızca bir deyim seçebilir; daha fazla seçmek için GOTO kullanılmalı, aşağıdaki örnekte olduğu gibi IF (.NOT. condition) GOTO 20... 20 CONTINUE Negatif mantık okunabilirlik açısından kötü Bu problem FORTRAN 77 de çözüldü Daha sonraki dillerin çoğu tek yollu seçicilerinin seçilebilir parçaları için bileşiklere izin verir
İki-Yollu Seçim: Örnekler ALGOL 60: if (boolean_ifade) then deyimi (then cümlesi) else deyimi (else cümlesi) Deyimler tek ya da bileşik olabilir
Seçicileri İç İçe Yerleştirme Java örneği if (sum == 0) if (count == 0) result = 0; else result = 1; Hangi if, else i alır? Java nın statik anlambilim kuralı: else kendisine en yakın if ile eşleşir
Seçicileri İç İçe Yerleştirme(devam) Alternatif bir semantik olarak bileşik deyimler kullanılabilir: if (sum == 0) { } if (count == 0) result = 0; else result = 1; Üstteki çözüm C, C++ ve C# ta kullanılır Perl tüm then ve else cümlelerinin bileşik olmasını gerektirir
Çok-Yollu Seçim İfadeleri Herhangi bir sayıda deyim veya deyim grubunun seçilmesine izin verir Tasarım sorunları: 1. Kontrol ifadesinin formu ve türü ne? 2. Seçilebilir parçalar nasıl belirtilir? 3. Yapı boyunca, yürütme akışı yalnızca bir seçilebilir parça içerecek şekilde sınırlandırılmış mıdır? 4. Temsil edilmeyen ifade değerleri hakkında ne yapılır?
Çok-Yollu Seçim: Örnekler İlk çok-yollu seçiciler: FORTRAN arithmetic IF (a three-way selector) IF (arithmetic expression) N1, N2, N3 Parçalar GOTO ları gerektirir Kapsüllenmemiş (seçilebilir parçalar herhangi bir yerde olabilir)
Çok-Yollu Seçim: Örnekler Modern çok-yollu seçiciler C switch yapısı switch (expression) { case const_expr_1: stmt_1; case const_expr_n: stmt_n; [default: stmt_n+1] }
Çok-Yollu Seçim: Örnekler C nin switch deyimi için seçenekler 1. Kontrol ifadesi yalnızca tamsayı türünde olabilir 2. Seçilebilir parçalar deyim dizileri, bloklar ya da bileşik deyimler olabilir 3. Herhangi bir sayıdaki parçalar yapının bir yürütmesinde yürütülebilir (seçilebilen parçaların sonunda kapalı/dolaylı dallanma yok) 4. default cümlesi temsil edilmeyen değerler içindir (eğer hiç default yoksa, tüm deyim hiç bir şey yapmaz)
Çok-Yollu Seçim: Örnekler Ada nın case deyimi case expression is when choice list => stmt_sequence; when choice list => stmt_sequence; when others => stmt_sequence; end case; C nin switch inden daha güvenilir (stmt_sequence-ifade dizisi-nin yürütmesi tamamlandığı zaman, kontrol case deyiminden sonraki ilk deyime geçer
if Kullanarak Çok-Yollu Seçim Çok-yollu seçiciler else-if cümleleri kullanarak iki-yollu seçicilerin doğrudan bir uzantısı olarak görünebilirler, örneğin Ada da: if... then... elsif... then... elsif... then... else... end if
Tekrarlı Deyimler Bir deyimin ya da bileşik ifadenin tekrarlanan yürütümü ya tekrarla ya da özyineleme ile başarılır Yineleme kontrol deyimlerinin genel tasarım problemi: 1. Yineleme nasıl kontrol edilir? 2. Döngüdeki kontrol mekanizması nerede?
Sayaç Kontrollü Döngüler Bir sayaçlı tekrarlı deyimin bir döngü değişkeni vardır, ilk ve son ve adım boyu değerlerini belirleyen bir araçtır Tasarım sorunları: 1. Döngü değişkeninin türü ve kapsamı ne? 2. Döngü değişkeninin döngü sonundaki değeri ne? 3. Döngü değişkeni veya döngü parametrelerinin döngü gövdesinde değiştirilmesi legal olmalı mı, eğer öyleyse, değişim döngünün kontrolünü etkiler mi? 4. Döngü parametreleri sadece bir kere mi yoksa her tekrarda bir kere mi değerlendirilir?
Tekrarlı Deyimler: Örnekler FORTRAN 90 sözdizimi DO label var = start, finish [, stepsize] Adım boyu sıfır dışında herhangi bir değer olabilir Parametreler deyimler olabilir Tasarım seçenekleri: 1. Döngü değişkeni INTEGER olmalı 2. Döngü değişkeni her zaman kendi son değerine sahip 3. Döngü değişkeni döngüde değiştirilemez; fakat parametreler değişebilir; çünkü onlar bir kere değerlendirilir, bu da döngü kontrolünü etkilemez 4. Döngü parametreleri sadece bir kere değerlendirilir
Tekrarlı Deyimler: Örnekler FORTRAN 95 : ikinci bir form: [isim:] DO degisgen = baslangic, son [,adimboyu] END DO [isim] Döngü değişkeni INTEGER olmalı
Tekrarlı Deyimler Pascal ın for deyimi for variable := initial (to downto) final do statement Tasarım seçenekleri: 1. Döngü değişkeni olağan kapsamın sıralı bir türü olmak zorunda 2. Normal bitişten sonra döngü değişkeni tanımsızdır 3. Döngü değişkeni, döngü içinde değiştirilemez; döngü parametreleri değiştirilebilir; fakat onlar sadece bir kez değerlendirilir, dolayısıyla döngünün kontrolünü etkilemez 4. Sadece bir kere
Tekrarlı Deyimler: Örnekler Ada for var in [reverse] discrete_range loop... end loop Ayrık aralık bir tamsayı ya da sayma türünün bir alt aralığıdır Döngü değişkeninin kapsamı döngünün aralığıdır Döngü değişkeni, döngünün bitişinden sonra dolaylı olarak beyan edilmemiştir
Tekrarlı Deyimler: Örnekler C nin for deyimi for ([expr_1] ; [expr_2] ; [expr_3]) statement İfadeler deyimler bütünü ya da deyimlerin virgüllerle ayrıldığı deyim dizileri bile olabilirler Çok deyimli bir ifadenin değeri ifadedeki son deyimin değeridir Açık bir döngü değişkeni yok Döngüdeki her şey değişebilir İlk ifade bir kere değerlendirilir; ama diğer ikisi her tekrarda değerlendirilir
Tekrarlı Deyimler: Örnekler C++, C den iki yolla ayrılır: 1. Kontrol ifadeleri de Boolean olabilir 2. Başlangıç ifadesi değişken tanımlarını içerebilir (kapsam tanımlamadan döngü sonuna kadardır) Java ve C# C++ dan kontrol ifadesinin Boolean olma zorunluluğu sebebiyle ayrılır
Tekrarlı Deyimler: mantıksal Kontrollü Döngüler Tekrar kontrolü Boolean tabanlıdır Tasarım sorunları: Ön-test mi, son-test mi? Mantıksal kontrollü döngü, sayaçlı döngü deyiminin özel bir hali mi olmalı? Sayaç yerine ifade Genel formlar: while (ctrl_expr) loop body do loop body while (ctrl_expr)
Tekrarlı Deyimler: Mantıksal Kontrollü Döngüler: Örnekler Pascal ayrı ayrı ön-test ve son-test mantıksal döngü deyimlerine sahip (whiledo and repeat-until) C ve C++ da her ikisine sahip; ama sontestin kontrol deyimi ön-testte olduğu gibi davranır (while-do and do- while) Java, kontrol deyiminin Boolean olma zorunluluğu dışında C gibidir (ve gövdeye yalnızca başlangıçta girilebilir Java nın goto su yok)
Tekrarlı Deyimler: Mantıksal Kontrollü Döngüler: Örnekler Ada nın ön test versiyonu var; ama son-test yok FORTRAN 77 ve 90 ın hiçbiri yok Perl ün iki pre-test mantıksal döngüsü var, while ve until, ama son-test mantıksal döngüsü yok
Tekrarlı Deyimler: Kullanıcı Konumlu Kontrol Mekanizmaları Bazen programcılar için döngü kontrolü açısından konum belirlemek uygun olabilir (döngünün başı ve sonu dışında) Tek döngüler için basit bir tasarım(ör.,break) İç içe döngüler için tasarım sorunları: 1. Şartlı, çıkışın bir parçası olmalı mı? 2. Kontrol birden fazla döngüye iletilebilir olmalı mı?
Tekrarlı Deyimler: Kullanıcı Konumlu Kontrol Mekanizmaları break ve continue C, C++ ve Java: break deyimi Şartsız; herhangi bir döngü ya da switch için; sadece bir seviye Java ve C# ın etiketli break deyimi var: kontrol etikete geçer Bir alternatif: continue deyimi; yinelemenin kalan kısmını atlar; fakat döngüden çıkmaz
Tekrarlı Deyimler: Veri Yapıları Tabanlı Yineleme Bir veri yapısındaki eleman sayısı döngü tekrarını kontrol eder Kontrol mekanizması, eğer varsa seçilen sıradaki bir sonraki elemanı döndüren, yoksa döngüyü sonlandıran yineleyici fonksiyona bir çağrıdır C nin for u kullanıcı tanımlı yineleyici oluşturmak için kullanılabilir: for (p=root; p==null; traverse(p)){ }
Tekrarlı Deyimler: Veri Yapıları Tabanlı Yineleme (devam) C# ın foreach deyimi dizi ya da diğer koleksiyonların elemanları üzerinde tekrarlanır Strings[] = strlist = { Bob, Carol, Ted }; foreach (Strings name in strlist) Console.WriteLine ( Name: {0}, name); {0} gösterimi görüntülenecek string deki pozisyonu belirtir
Şartsız Dallanma Yürütme kontrolünü program içinde belirtilen bir yere iletir 1960 ve 1970 lerde en ateşli tartışmaların birine sebep oldu İyi bilinen mekanizma: goto deyimi En büyük endişe: Okunabilirlik Bazı diller goto deyimini desteklemez (ör., Modula-2 ve Java) C# goto deyimini sunar (switch deyimlerinde kullanılabilir) Döngüden çıkış deyimleri sınırlıdır ve bir şekilde goto larla kamufle edilmişlerdir
Korumalı Komutlar Dijkstra tarafından önerildi Amaç: gelişim boyunca doğrulamayı(onay) destekleyen yeni bir programlama metodolojisini desteklemek Eş zamanlı programlamanın iki dilbilimsel mekanizmasının temeli Ana fikir: eğer değerlendirmenin sırası önemli değilse, program herhangi bir sıra belirlememeli
Seçim Korumalı Komutlar Form if <Boolean exp> -> <statement> [] <Boolean exp> -> <statement>... [] <Boolean exp> -> <statement> fi Anlam: yapıya erişildiği zaman Tüm Boolean ifadeleri değerlendir Eğer birden fazlası doğruysa, deterministik olmayarak birini seç Eğer hiçbiri doğru değilse, bu bir run-time hatadır
Seçim Korumalı Komutlar: Resimli
Döngü Korumalı Komut Form do <Boolean> -> <statement> [] <Boolean> -> <statement>... [] <Boolean> -> <statement> od Anlam: her bir yineleme için Tüm Boolean ifadeleri değerlendir Eğer birden fazlası doğruysa, deterministik olmayarak birini seç; sonra da döngüyü tekrar başlat Eğer hiçbiri doğru değilse, döngüden çık
Döngü Korumalı Komut: Resimli
Korumalı Komutlar: Temel Kontrol deyimleri ile programın doğrulanması arasındaki bağlantı çok yakındır Doğrulama goto deyimleriyle imkansız Doğrulama yalnızca seçim ve mantıksal öntest döngüleriyle mümkün Doğrulama sadece korumalı komutlarla nispeten basit
Sonuç Deyim seviyesindeki yapıların çeşitliliği Seçim ve mantıksal ön-test döngülerinin ötesinde kontrol deyimlerinin seçimi dilin boyutu ve yazılabilirliği arasında bir dengedir Fonksiyonel ve mantıksal programlama dilleri kontrol yapıları bakımından oldukça farklıdır