ISBN 0-321-49362-1
Bölüm 8
Copyright © 2007
Addison-Wesley. All rights reserved. 1-2
Bölüm 8 Konular
• Giriş
• Seçim İfadeleri • Tekrarlı İfadeler
• Şartsız Dallanma(Unconditional Branching) • Korumalı Komutlar
Copyright © 2007
Addison-Wesley. All rights reserved. 1-3
Kontrol Akışının Seviyeleri
– İfadeler içinde
Copyright © 2007
Addison-Wesley. All rights reserved. 1-4
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
Copyright © 2007
Addison-Wesley. All rights reserved. 1-5
Kontrol Yapıları
• Bir kontrol yapısı ve ifadesi çalışmayı kontrollü hale getirir.
• Tasarım sorusu
Copyright © 2007
Addison-Wesley. All rights reserved. 1-6
Seçim İfadeleri
• Bir seçim ifadesi iki veya daha fazla çalışma yolları arasından seçim yapar.
• İki genel kategorisi vardır:
Copyright © 2007
Addison-Wesley. All rights reserved. 1-7
İ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?
Copyright © 2007
Addison-Wesley. All rights reserved. 1-8
İ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
Copyright © 2007
Addison-Wesley. All rights reserved. 1-9
İki Yönlü seçim : Örnek
• ALGOL 60:
if (boolean_expr)
then ifade(statement ) (then clause)
else statement (else clause)
Copyright © 2007
Addison-Wesley. All rights reserved. 1-10
İç 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
Copyright © 2007
Addison-Wesley. All rights reserved. 1-11
İç içe seçimler
• Alternatif bir anlamı zorlamak için birleşik ifadeler kullanılabilir:
• Yukarıdaki çözüm C, C++ ve C# tarafından kullanılır.
Copyright © 2007
Addison-Wesley. All rights reserved. 1-12
Ç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?
Copyright © 2007
Addison-Wesley. All rights reserved. 1-13
Ç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.
Copyright © 2007
Addison-Wesley. All rights reserved. 1-14
Ç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]
Copyright © 2007
Addison-Wesley. All rights reserved. 1-15
Ç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.
Copyright © 2007
Addison-Wesley. All rights reserved. 1-16
Ç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
Copyright © 2007
Addison-Wesley. All rights reserved. 1-17
Çok yönlü seçim deyimlerinde if
• Çoklu seçimler else-if cümlecikleri gibi görünür, örneğin Ada:
Copyright © 2007
Addison-Wesley. All rights reserved. 1-18
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?)
Copyright © 2007
Addison-Wesley. All rights reserved. 1-19
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?
Copyright © 2007
Addison-Wesley. All rights reserved. 1-20
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;
Copyright © 2007
Addison-Wesley. All rights reserved. 1-21
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
•
Copyright © 2007
Addison-Wesley. All rights reserved. 1-22
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ü
Copyright © 2007
Addison-Wesley. All rights reserved. 1-23
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.
Copyright © 2007
Addison-Wesley. All rights reserved. 1-24
Tekrarlamalı İfadeler:Örnek
Count: Float :=1.33;
for Count in 1..10 loop
Sum:=Sum+Count
Copyright © 2007
Addison-Wesley. All rights reserved. 1-25
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.
Copyright © 2007
Addison-Wesley. All rights reserved. 1-26
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#
Copyright © 2007
Addison-Wesley. All rights reserved. 1-27
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
Copyright © 2007
Addison-Wesley. All rights reserved. 1-28
Tekrarlamalı İfadeler:Mantıksal
Kontrollü
• Paskalda hem ön sınamalı hem de son
sınamalı döngü vardır(while-do ve repeat-until)
• C ve C++ da her ikisi vardır.
• Java C gibidir, sadece kontroller
mantıksal(boolean) olmalıdır. -- Java da
Copyright © 2007
Addison-Wesley. All rights reserved. 1-29
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ü
Copyright © 2007
Addison-Wesley. All rights reserved. 1-30
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?
Copyright © 2007
Addison-Wesley. All rights reserved. 1-31
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;
Copyright © 2007
Addison-Wesley. All rights reserved. 1-32
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
Copyright © 2007
Addison-Wesley. All rights reserved. 1-33
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:
Copyright © 2007
Addison-Wesley. All rights reserved. 1-34
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);
Copyright © 2007
Addison-Wesley. All rights reserved. 1-35
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)
Copyright © 2007
Addison-Wesley. All rights reserved. 1-36
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.
Copyright © 2007
Addison-Wesley. All rights reserved. 1-37
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
Copyright © 2007
Addison-Wesley. All rights reserved. 1-38
Copyright © 2007
Addison-Wesley. All rights reserved. 1-39
Seçim korumalı kontrol
Copyright © 2007
Addison-Wesley. All rights reserved. 1-40
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
Copyright © 2007
Addison-Wesley. All rights reserved. 1-41
Döngü korumalı komutlar
Copyright © 2007
Addison-Wesley. All rights reserved. 1-42