Chapter 8
Komut düzeyi
kontrol yapıları
ISBN 0-321-49362-1
8. bölüm konuları
•
•
•
•
•
•
Giriş
Seçme komutları
Tekrarlayan komutlar
Şartsız dallanma
Korumalı komutlar
Sonuç
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-2
Kontrol komutları
• Akış şemaları ile temsi edilebilen tüm
algoritmalar sadece iki taraflı seçim (ör: ifthen-else) ve ön-şartlı döngüler (ör: while)
kullanılarak kodlanabilir
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-3
Kontrol yapısı
• Kontrol komutu ve kontrol ettiği komutlar
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-4
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)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-5
İkili seçme komutları
• Genel şekli:
if control_expression
then clause
else clause
• Tasarım problemi:
–
İç içe seçme komutunun anlamı nedir?
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-6
Kontrol ifadesi
• C, Python, ve C++ dillerinde kontrol
ifadesi sayısal olabilir
• Ada, Java, Ruby, C# gibi dillerde Boolean
olmalı
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-7
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-8
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;
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-9
Ç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]
}
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-10
Ç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)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-11
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-12
Yineleme komutları
• Komutun birden çok kez tekrarlanmasının
yöntemleri
– Yineleme (iteration)
– Özyineleme (recursion)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-13
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.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-14
Yineleyen komutlar: Örnek
• C-tabanlı diller
for ([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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-15
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-16
Yineleyen komutlar: Mantık
kontrollü döngüler
• Tekrarlama kontrolü Boolean ifadeye bağlı
• Tasarım problemi:
–
Önce-test, sonra-test?
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-17
Yineleyen komutlar: Mantık kontrollü
döngü örnekleri
• C ve C++: hem önce-test hem sonra-test
döngüler, kontrol ifadesi aritmetik olabilir
while (ctrl_expr)
loop body
do
loop body
while (ctrl_expr)
• Java: C ve C++ gibi, ancak kontrol ifadesi
Boolean olmalı
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-18
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-19
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)){
}
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-20
Yineleyen komutlar: veri yapılarına
dayalı yineleme…
• C#’ dilinin foreach komutu dizilerin ve
diğer kolleksiyonların elemanları üzerinde
“yineler” :
Strings[] = strList = {"Bob", "Carol", "Ted"};
foreach (Strings name in strList)
Console.WriteLine ("Name: {0}", name);
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-21
Ş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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-22
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-23
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ı
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-24
Seçme korumalı komutu görseli
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-25
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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-26
Döngü korumalı komutu görseli
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-27
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ı = kolay
yazılabilirlik ama daha büyük/karmaşık dil
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-28
Download

Kontrol Yapıları