Download as pdf or txt
Download as pdf or txt
You are on page 1of 42

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

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-2
Kontrol Akışının Seviyeleri

– İfadeler içinde
– Program birimleri arasında
– Program ifadeleri arasında

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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?

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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?

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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.
Copyright © 2007 Addison-
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.
Copyright © 2007 Addison-
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?

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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)

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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?

Copyright © 2007 Addison-


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?

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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
Copyright © 2007 Addison-
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

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-23
Tekrarlamalı İfadeler:Örnek

Count: Float :=1.33;


for Count in 1..10 loop
Sum:=Sum+Count
end loop;

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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)

Copyright © 2007 Addison-


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 repeat-
until)
• C ve C++ da her ikisi vardır.
• Java C gibidir, sadece kontroller
mantıksal(boolean) olmalıdır. -- Java da
goto yoktur.

Copyright © 2007 Addison-


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 son-
sınamalı döngü yoktur.

Copyright © 2007 Addison-


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?

Copyright © 2007 Addison-


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;
}

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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)){
}
Copyright © 2007 Addison-
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.

Copyright © 2007 Addison-


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.
Copyright © 2007 Addison-
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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-37
Seçim korumalı kontrol grafiği

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-38
Seçim korumalı kontrol

if x>=y ->max:=x
[ ] y>=x ->max:=y
fi

Copyright © 2007 Addison-


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
Copyright © 2007 Addison-
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

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-41
Döngü korumalı komut

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-42

You might also like