chapter 8 - staff.emu.edu.tr file•c , c++, c# dillerinde şartsız, etiketlenmemiş (unlabeled)...

28
ISBN 0-321-49362-1 Chapter 8 Komut düzeyi kontrol yapıları

Upload: others

Post on 07-Nov-2019

9 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

ISBN 0-321-49362-1

Chapter 8

Komut düzeyi kontrol yapıları

Page 2: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-2

8. bölüm konuları

• Giriş

• Seçme komutları

• Tekrarlayan komutlar

• Şartsız dallanma

• Korumalı komutlar

• Sonuç

Page 3: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-3

Kontrol komutları

• Akış şemaları ile temsi edilebilen tüm algoritmalar sadece iki taraflı seçim (ör: if-then-else) ve ön-şartlı döngüler (ör: while) kullanılarak kodlanabilir

Page 4: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-4

Kontrol yapısı

• Kontrol komutu ve kontrol ettiği komutlar

Page 5: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-5

Seçme komutları

• İki veya daha çok çalışma alternatifi arasından seçme olanağı tanır

• İki genel kategori

– İkili seçme komutları (ör: if-then-else)

– Çoklu seçme komutları (ör: case)

Page 6: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-6

İkili seçme komutları

• Genel şekli:

if control_expression

then clause

else clause

• Tasarım problemi:– İç içe seçme komutunun anlamı nedir?

Page 7: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-7

Kontrol ifadesi

• C, Python, ve C++ dillerinde kontrolifadesi sayısal olabilir

• Ada, Java, Ruby, C# gibi dillerde Boolean olmalı

Page 8: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-8

Içiçe seçiciler

• Java örneği

if (sum == 0)

if (count == 0)

result = 0;

else result = 1;

• Soru: else deyimini hangi if sahiplenir?

• Cevap: En yakındaki if

Page 9: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-9

Içiçe seçiciler ...

• Daha değişik davranış için, bileşik komut kullanın:

if (sum == 0) {

if (count == 0)

result = 0;

}

else result = 1;

Page 10: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-10

Çok yönlü seçici örneği

• C, C++, ve Java

switch (expression) {

case const_expr_1: stmt_1;

case const_expr_n: stmt_n;

[default: stmt_n+1]

}

Page 11: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-11

Çok yönlü seçici örneği...

• Tasarım tercihleri

1. Kontrol ifadesi sadece tamsayı olabilir

2. Seçilebilen kısımlar komut serisi, blok veya bileşik komut olabilir

3. Kısım bittiğinde eğer break yoksa bir sonraki kısıma devam eder.

4. Default: belirtilmemiş değerler için (default yoksa ve kontrol ifadesi hiçbir seçeneğe uymuyorsa, case hiçbirşey yapmaz)

Page 12: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-12

If kullanarak çok yönlü seçim

• Python dilinde else-if kullanarak

if count < 10 :

bag1 = True

elsif count < 100 :

bag2 = True

elsif count < 1000 :

bag3 = True

Page 13: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-13

Yineleme komutları

• Komutun birden çok kez tekrarlanmasının yöntemleri

– Yineleme (iteration)

– Özyineleme (recursion)

Page 14: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-14

Sayaç kontrollü döngüler

• Sayıcı yineleyen komutta, döngü değişkeni bulunur. Bu değişkenin

– İlk değeri

– Son değeri, ve

– Basamak artırımı değeri

olur.

Page 15: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-15

Yineleyen komutlar: Örnek

• C-tabanlı dillerfor ([başlangıc_ifadesi] ; [bitiş_şarti] ;

[artirma_ifadesi])

- İfadeler komut olabilir, hatta virgül ile ayrılan komut dizisi de olabilir– Çoklu komuttan oluşan ifadenin değeri, ifadedeki son komutun

değeridir

– İkinci ifade yoksa, sonsuz döngü

• Tasarım tercihleri:

- Açıkça verilen döngü değişkeni yok

- Döngü içinde herşey değiştirilebilir

- İlk ifade bir kez değerlendirilir, diğer ikisi her yinelemede

Page 16: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-16

Yineleyen komutlar: Örnek ...

• C++, C’den iki şekilde ayrılır:

1. Kontrol ifadesi Boolean olabilir

2. Birinci ifadede yeni değişken tanımı olabilir(etki alanı tanımdan başlayın döngünün sonuna kadar uzanır)

• Java ve C#

– Kontrol ifadesi Boolean olmak zorunda

Page 17: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-17

Yineleyen komutlar: Mantık kontrollü döngüler

• Tekrarlama kontrolü Boolean ifadeye bağlı

• Tasarım problemi:

– Önce-test, sonra-test?

Page 18: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-18

Yineleyen komutlar: Mantık kontrollü döngü örnekleri

• C ve C++: hem önce-test hem sonra-testdöngüler, kontrol ifadesi aritmetik olabilir

while (ctrl_expr) do

loop body loop body

while (ctrl_expr)

• Java: C ve C++ gibi, ancak kontrol ifadesi Boolean olmalı

Page 19: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-19

Yineleyen komutlar: break ve continue

• C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar (break)

• Java dilinde şartsız etiketlenmiş (labeled) çıkış (break)

• C, C++ dillerinde etiketlenmemiş continue, komutu: o anki yinelenen kısmın geri kalanını atlar, ama döngüden çıkmaz

• Java dilinde continue komutunun etiketli versiyonu var

Page 20: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-20

Yineleyen komutlar: veri yapılarına dayalı yineleme

• Veri yapısındaki eleman sayısı yinelemeyi kontrol eder

• Kontrol mekanizması, veri yapısındaki bir sonraki elemanı veren bir yineleme (iterator) fonksiyonuna çağrıdır

• C dilindeki for yapısını kullanarak yineleyici (iterator) yapabiliriz:

for (p=root; p!=NULL; traverse(p)){

}

Page 21: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-21

Yineleyen komutlar: veri yapılarına dayalı yineleme…

• C#’ dilinin foreach komutu dizilerin vediğer kolleksiyonların elemanları üzerinde “yineler” :

Strings[] = strList = {"Bob", "Carol", "Ted"};

foreach (Strings name in strList)

Console.WriteLine ("Name: {0}", name);

Page 22: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-22

Şartsız dallanma (branching)

• Çalışma kontrolünü programın herhangi bir yerine götürür

• goto komutu

• En büyük endişe: okunabilirlik

• Bazı dillerde goto yok (ör: Java)

• C# dilinde switch komutu içinde var

• Döngü çıkış komutları (break vs.) bir çeşit sınırlandırılmış “gizli” goto’lar

Page 23: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-23

Korunan (Guarded) komutlar

• Dijkstra tarafından tasarlandı

• Amaç: Program doğrulanmasını (verification) program geliştirme aşamasında desteklemek

• CSP ve ADA’da paralel programlama için temel oluşturdu

• Ana fikir: hesaplama sırası (order of evaluation) önemli değilse, program bir sıra belirtmemeli

Page 24: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-24

Seçme korumalı komutu

• Şekli:if <Boolean exp> -> <statement>

[] <Boolean exp> -> <statement>

...

[] <Boolean exp> -> <statement>

fi

• Anlamı: – Tüm Boolean ifadeleri hesapla

– Birden çoğu doğru ise, bir tanesini tesadüfen seç (non-deterministically)

– Hiçbiri doğru değilse, çalışma zamanı (runtime) hatası

Page 25: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-25

Seçme korumalı komutu görseli

Page 26: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-26

Döngü korumalı komutu

• Şekli:do <Boolean> -> <statement>

[] <Boolean> -> <statement>

...

[] <Boolean> -> <statement>

od

• Anlamı: her yinelemede–Tüm Boolean ifadeleri hesapla

–Birden çoğu doğru ise, bir tanesini tesadüfen seç (non-deterministically), sonra döngüyü yeniden başlat

–Hiçbiri doğru değilse, döngüden çık

Page 27: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-27

Döngü korumalı komutu görseli

Page 28: Chapter 8 - staff.emu.edu.tr file•C , C++, C# dillerinde şartsız, etiketlenmemiş (unlabeled) çıkışlar(break) •Java dilinde şartsız etiketlenmiş (labeled) çıkış(break)

Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-28

Sonuç

• Çeşitli komut düzeyinde yapılar

• Seçme ve öncetest döngüler: zorunlu. Diğer yapılar seçmeli. Daha çok yapı = kolayyazılabilirlik ama daha büyük/karmaşık dil