Bölüm 8 İfade -Seviyeli Kontrol Yapıları ISBN 0-321-49362-1
Bölüm 8 Konular Giriş Seçim İfadeleri Tekrarlı İfadeler Şartsız Dallanma(Unconditional Branching) Korumalı Komutlar Sonuçlar Wesley. All rights reserved. 1-2
Kontrol Akışının Seviyeleri İfadeler içinde Program birimleri arasında Program ifadeleri arasında Wesley. All rights reserved. 1-3
Kontrol İfadeleri: Gelişim FORTRAN I kontrol ifadeleri direkt olarak IBM 704 donanımı temelliydi Birçok araştırmacı ve 1960 larda bu konular üzerinde tartıştı Bir önemli sonuç: Şu kanıtlanmıştır akış diyagramı hazırlanmış olan algoritmalar sadece ikiyollu seçim ve ön koşullu tekrarlanan ifadeler ile gerçekleştirilebilir. Wesley. All rights reserved. 1-4
Kontrol Yapıları Bir kontrol yapısı ve ifadesi çalışmayı kontrollü hale getirir. Tasarım sorusu Kontrol yapısının birden fazla girdisi olmalı mıdır? Wesley. All rights reserved. 1-5
Seçim İfadeleri Bir seçim ifadesi iki veya daha fazla çalışma yolları arasından seçim yapar. İki genel kategorisi vardır: İki-yönlü seçiciler Çok yönlü seçiciler Wesley. All rights reserved. 1-6
İki yönlü seçici ifadeleri Genel biçim: if control_expression then clause else clause Tasarım Konuları: Kontrol deyimlerinin biçimi ve tipi ne olmalıdır? then ve else cümlecikleri nasıl belirtilecek? İç içe seçim elemanları nasıl belirtilecek? Wesley. All rights reserved. 1-7
İki Yönlü Seçim: Örnekler FORTRAN: IF (boolean_expr) ifadesi Sorun: seçim tek bir ifadedir daha fazla seçim için bir GOTO kullanılmalıdır: IF (.NOT. condition) GOTO 20... 20 CONTINUE Okunabilirlik için olumsuz mantık kötüdür. Bu sorun FORTRAN 77 de çözülmüştür Daha sonraki diller daha fazla seçim için birleşik seçimlere izin vermiştir. Wesley. All rights reserved. 1-8
İki Yönlü seçim : Örnek ALGOL 60: if (boolean_expr) then ifade(statement ) (then clause) else statement (else clause) İfadeler tek Ya da birden fazla olabilir Wesley. All rights reserved. 1-9
İç içe seçimler Java örneği if (sum == 0) if (count == 0) result = 0; else result = 1; Hangi if, else in sahibidir? Java'nın statik anlamsal kuralı(static semantics rule): else kendisine en yakın olan if e aittir. Wesley. All rights reserved. 1-10
İç içe seçimler Alternatif bir anlamı zorlamak için birleşik ifadeler kullanılabilir: if (sum == 0) { } if (count == 0) result = 0; else result = 1; Yukarıdaki çözüm C, C++ ve C# tarafından kullanılır. Perl tüm then ve else kelimelerinin bileşik olamasını zorunlu kılar. Wesley. All rights reserved. 1-11
Çok yönlü seçim deyimleri Birden fazla sayıda seçim ifadesine izin verir. Tasarım Konuları: 1. Kontrol deyimlerinin biçimi ve tipi nasıl olacaktır? 2. Seçilebilir alanlar nasıl belirtilir? 3. Çalışma akışında sadfece tek bir seçim kısımı mı olabilir? Wesley. All rights reserved. 1-12
Çok yönlü seçim deyimleri İlk çıkan çoklu seçimler: FORTRAN aritmetik IF (üç yönlü seçim) IF (arithmetic expression) N1, N2, N3 GOTO lara ihtiyaç duyar. Seçilebilen kısımlar her yerde olabilir. Wesley. All rights reserved. 1-13
Çok yönlü seçim deyimleri Modern çoklu seçimler C deki switch ifadesi switch (expression) { case const_expr_1: stmt_1; case const_expr_n: stmt_n; [default: stmt_n+1] } Wesley. All rights reserved. 1-14
Çok yönlü seçim deyimleri C nin switch ifadesi için seçtiği tasarım 1. Kontrol ifadeleri sadece integer tipli olabilir 2. Seçilebilen kısımlar ifadeler, bloklar Ya da birleşik ifadeler olabilir 3. Bu yapıdaki seçimde birden fazla kısım çalışabilir. 4. default temsil edilmeyen değerler için kullanılır. Wesley. All rights reserved. 1-15
Çok yönlü seçim deyimleri The Ada case ifadesi 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üvenlidir( stmt_sequence tamamlandıktan sonra kontrol case ifadesine geçer) Wesley. All rights reserved. 1-16
Çok yönlü seçim deyimlerinde if Çoklu seçimler else-if cümlecikleri gibi görünür, örneğin Ada: if... then... elsif... then... elsif... then... else... end if Wesley. All rights reserved. 1-17
Tekrarlama İfadeleri İfadenin ya da birleşik ifadenin tekrarlamalı olarak çalıştırılmasını sağlar. Genel tasarım konuları 1. iterasyon(tekrarlama nasıl kontrol edilecek?) 2. döngüdeki kontrol mekanizması nerede olacak? Wesley. All rights reserved. 1-18
Sayaç kontrollü döngüler Sayaç temelli döngülerde bir sayaç değişkeni bulunur,ve ilk değeri ile sayacın son değeri ve artış miktarı belirlenir. Tasarım Konuları: 1. Döngü değişkeninin etki alanı(scope) ve tipi ne olmalıdır? 2. Döngü sonlandırmadaki döngü değişkeninin değeri ne olmalıdı? 3. Döngü değişkeni, döngü içinde yapılacak ifadelerce değiştirilmeli midir ve bu döngüyü etkiler mi? 4. Döngü parametreleri birkez mi işlenir yoksa her döngüde tekrar işlenilmeli midir? Wesley. All rights reserved. 1-19
Tekrarlamalı İfadeler:Örnek FORTRAN 90 sözdizimi DO label var = start, finish [, stepsize] Stepsize 0 hariç herşey olabilir Parametreler ifadeler olabilir Tasarım seçimleri: 1. Döngü değişkeni INTEGER dır 2. Döngü değişkeni her zaman son değerini alır 3. döngü değişkeni döngüde değiştirilemez, fakat parametreler değiştirilebilir; 4. Döngü parametreleri sadece birkez çalıştırılır. Wesley. All rights reserved. 1-20
Tekrarlamalı İfadeler:Örnek FORTRAN 95 : ikinci biçim: [name:] DO variable = initial, terminal [,stepsize] END DO [name] Döngü değişkeni INTEGER olmalıdır Do Count =1,10 End Do Wesley. All rights reserved. 1-21
Tekrarlamalı İfadeler:Örnek Pascal ın for ifadesi for variable := initial (to downto) final do statement Tasarım seçimleri: 1. Döngü değişkeni sıradan bir tip olabilir 2. Normal sonlanmadan sonra döngü değişkeni yoktur. 3. Döngü değişkeni döngü içinde değiştirilmez; döngü parametreleri değiştirilebilir, fakat birkez hesaplanırlar, bu nedenle kontrolü etkilemezler Wesley. All rights reserved. 1-22
Tekrarlamalı İfadeler:Örnek Ada for var in [reverse] discrete_range loop... end loop discrete range integer ın Ya da enumeration tipinin bir alt aralığıdır. Döngü değişkenin etki alanı döngü içidir. Bu değişken döngü sonunda tanımsız olur Wesley. All rights reserved. 1-23
Tekrarlamalı İfadeler:Örnek Count: Float :=1.33; for Count in 1..10 loop Sum:=Sum+Count end loop; Wesley. All rights reserved. 1-24
Tekrarlamalı İfadeler:Örnek C nin for ifadesi for ([expr_1] ; [expr_2] ; [expr_3]) statement Deyimlerin(expr1) tamamı ifade olabilir Ya da virgülle ayrılmış ifadeler olabilir Çoklu ifadelerde kabul edilen değer en sonuncusunun değeridir. Açık bir döngü değişkeni yoktur. Döngü içinde herşey değişebilir. İlk ifade birkez hesaplanır, diğerleri her döngüde tekrar hesaplanır. Wesley. All rights reserved. 1-25
Tekrarlamalı İfadeler:Örnek C++ C den iki yönle farklıdır: 1. Kontrol deyimleri Mantıksal(Boolean) olabilir. 2. İlk deyim bir değişken tanımlamaya izin verebilir, bu değişkenin etki alanı döngü içidir. Java ve C# C++ dan farklı olarak kontrol deyimleri Boolean olmalıdır. Wesley. All rights reserved. 1-26
Tekrarlamalı İfadeler:Mantıksal Kontrollü Tekrarlama kontrolü mantıksal(boolean) dır. Tasarım Konuları: Ön sınama ya da son-sınama? Mantıksal kontrollü döngü sayaç kontrollü ile aynı mıdır? Genel biçimleri: while (ctrl_expr) do loop body loop body while (ctrl_expr) Wesley. All rights reserved. 1-27
Tekrarlamalı İfadeler:Mantıksal Kontrollü Paskalda hem ön sınamalı hem de son sınamalı döngü vardır(while-do ve repeatuntil) C ve C++ da her ikisi vardır. Java C gibidir, sadece kontroller mantıksal(boolean) olmalıdır. -- Java da goto yoktur. Wesley. All rights reserved. 1-28
Tekrarlamalı İfadeler:Mantıksal Kontrollü Ada da ön sınama yöntemi vardır fakat son sınama yoktur FORTRAN 77 ve 90 da her ikiside vardır. Perl de iki ön-sınama mantıksal döngü vardır., while ve until, fakat sonsınamalı döngü yoktur. Wesley. All rights reserved. 1-29
Tekrarlamalı İfadeler:Kullanıcı belirtimli döngü Bazen döngü kontrolünün nerede yapılacağı kullanıcı tarafından belirtilebilir Tek döngüler için basit ifade (örn., break) Tasarım konuları Kontrol ifadesi dışarıda olabilir mi? 1. Kontrol birden fazla döngü dışına çıkabilir mi? Wesley. All rights reserved. 1-30
Tekrarlamalı İfadeler:Kullanıcı belirtimli döngü outherloop: for (row=0;row<numrows;row++) for (col=0;col<numcols;col++) sum+=mat[row][col]; if ( sum>1000.0) break outherloop; } Wesley. All rights reserved. 1-31
Tekrarlamalı İfadeler:Kullanıcı belirtimli döngü (break ve continue) C, C++, ve Java: break ifadesi Şartsız olarak herhangi döngü veya switch den bir seviye atlar Java ve C# da break ifadesi etiketli olabilir ve kontrolü etiketin olduğu yere kaydırır Bir alternatif: continue ifadesi; tekrarlanan yerin kalan kısmı atlanır ve döngü şartlarının olduğu kısma gidilir. Wesley. All rights reserved. 1-32
Tekrarlamalı ifadeler: Tekrarlama Veri yapıları temelli Bir veri yapısı içindeki eleman sayısı döngünün tekrar sayısını belirtir. Kontrol mekanizması bir tekrarlayıcı (iterator) fonksiyonun çağırımıdır; belirtilen sırada bir sonraki elemanı geri döndürür,eğer eleman yoksa döngü sonlanır. C'nin for u bu işlem için kullanılabilir: for (p=root; p==null; traverse(p)){ } Wesley. All rights reserved. 1-33
Tekrarlamalı ifadeler: Tekrarlama Veri yapıları temelli C# daki foreach ifadesi dizi veya diğer kolleksiyonlar içinde tekrarlama sağlar: Strings[] = strlist = { Bob, Carol, Ted }; foreach (Strings name in strlist) Console.WriteLine ( Name: {0}, name); {0} notasyonu gösterilecek string in pozisyonunu gösterir. Wesley. All rights reserved. 1-34
Kontrolsüz dallanma Çalışmayı program içerisinde istenilen yere aktarır. 1960 ların ve 1970 lerin en çok tartışılan konusudur Bilinen mekanizma: goto ifadesidir. En büyük sorun: okunabilirlik Bazı diller goto ifadesini desteklemez(örn., Module-2 ve Java) C# da goto ifadesi vardır ( switch ifadeleri içinde kullanılabilir) goto lar ile döngüden çıkışlar gizlenir ve belirgin olmaz. Wesley. All rights reserved. 1-35
Korumalı Komutlar(Guarded Commands) Dijkstra tarafından önerilmiştir. Amaç: geliştirme aşamasında (doğru çalışma) doğrulama temelli yeni programlama metedolojisini desteklemek için önerilmiştir. (CSP ve Ada) dillerinin dilsel mekanizmalarının temelidir. Temel fikir: Eğer hesaplamanın sırası önemli değilse program bu sırayı belirtmemelidir. Wesley. All rights reserved. 1-36
Seçim korumalı komut Biçim if <Boolean exp> -> <statement> [] <Boolean exp> -> <statement>... [] <Boolean exp> -> <statement> fi Anlamı: yapıya gelindiğinde Tüm mantıksal(boolean) ifadeler değerlendirilir Eğer birden fazlası doğruysa, birisini deterministik olmayan bir şekilde seçer Hiçbiri doğru değilse, bir çalışma zamanı hatasıdır. Wesley. All rights reserved. 1-37
Seçim korumalı kontrol grafiği Wesley. All rights reserved. 1-38
Seçim korumalı kontrol if x>=y ->max:=x [ ] y>=x ->max:=y fi Wesley. All rights reserved. 1-39
Döngü korumalı komutlar Form do <Boolean> -> <statement> [] <Boolean> -> <statement>... [] <Boolean> -> <statement> od Anlamı: her iterasyonda Tüm mantıksal ifadeleri hesapla Birden fazla doğruysa, birini seç ve döngü başına gel Hiçbiri doğru değilsedöngüden çık Wesley. All rights reserved. 1-40
Döngü korumalı komutlar do q1>q2 -> temp:=q1;q1:=q2;q2:=temp; [] q2>q3 -> temp:=q2;q2:=q3;q3:=temp; [] q3>q4 -> temp:=q3;q3:=q4;q3:=temp; od Wesley. All rights reserved. 1-41
Döngü korumalı komut Wesley. All rights reserved. 1-42