bölüm 8 - düzce Üniversitesiakademik.duzce.edu.tr/content/dokumanlar/resulkara/... ·...

39
ISBN 0-321-49362-1 Bölüm 8 İfade Seviyesindeki Kontrol Yapıları

Upload: others

Post on 14-Jul-2020

8 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

ISBN 0-321-49362-1

Bölüm 8

İfade Seviyesindeki Kontrol Yapıları

Page 2: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Bölüm 8 Konular

• Giriş

• Seçme İfadeleri

• Yinelemeli İfadeler

• Şartsız Dallanma

• Korumalı Komutlar

• Sonuçlar

Page 3: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Kontrol Akışının Seviyeleri

• İfadeler içinde

• Program birimleri boyunca

• Program deyimleri boyunca

Page 4: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Kontrol Yapısı

• Kontrol yapısı bir programın akışını ve yürütülmesini kontrol eden ifadedir

Page 5: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 6: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

İ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?

Page 7: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

İ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

Page 8: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

İ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

Page 9: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 10: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 11: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Ç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?

Page 12: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Ç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)

Page 13: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Ç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]

}

Page 14: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Ç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)

Page 15: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Ç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

Page 16: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 17: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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?

Page 18: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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?

Page 19: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 20: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Tekrarlı Deyimler: Örnekler

• FORTRAN 95 : ikinci bir form: [isim:] DO degisgen = baslangic, son [,adimboyu]

END DO [isim]

– Döngü değişkeni INTEGER olmalı

Page 21: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 22: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 23: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 24: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 25: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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) do

loop body loop body

while (ctrl_expr)

Page 26: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Tekrarlı Deyimler: Mantıksal Kontrollü Döngüler: Örnekler

• Pascal ayrı ayrı ön-test ve son-test mantıksal döngü deyimlerine sahip (while-do and repeat-until)

• C ve C++’da her ikisine sahip; ama son-testin 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)

Page 27: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 28: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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ı?

Page 29: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 30: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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)){

}

Page 31: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 32: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Ş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

Page 33: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 34: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 35: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Seçim Korumalı Komutlar: Resimli

Page 36: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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

Page 37: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

Döngü Korumalı Komut: Resimli

Page 38: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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 ön-test döngüleriyle mümkün

• Doğrulama sadece korumalı komutlarla nispeten basit

Page 39: Bölüm 8 - Düzce Üniversitesiakademik.duzce.edu.tr/Content/Dokumanlar/resulkara/... · Kontrollü Döngüler: Örnekler •Pascal ayrı ayrı ön-test ve son-test mantıksal döngü

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