11
Denetim Yapıları
Şekil 11.1: Akışı Koşullu Yönlendirme
11.1
Program Akışının Yönlendirilmesi
Her programlama dilinde, program akışı hiç bir koşula bağlı olmaksızın
doğrusal gidiyorsa, deyimler programda yazıldığı sıra ile işlenir. Ama, ge-
118
BÖLÜM 11. DENETIM YAPILARI
nellikle büyük programlarda böyle olamaz. Çünkü, akış sırasında karşılaşılacak durumlara bağlı olarak işlenecek deyimler değişebilir. Örneğin, bir
ücret bordrosu programında, gelir vergisi kesintisi düşük ücretlerde az, yüksek ücretlerde çoktur. Öyleyse düşük ücretlerde gelir vergisi hesabı yapan
deyimler ile yüksek ücretlerde gelir vergisi hesabı yapan deyimler farklı
olmalıdır. Hangi deyimin hangi ücretler için işleyeceğini belirleyen yöntemlerin olması gerekir.
Program akışının yönünü değiştirerek, belirlenen koşulların gerektirdiği deyimlere yönlendiren karar vericiler birer boolean (mantıksal) deyimdir (bkz. 7). Karar verici boolean deyimi doğru (true) değer alıyorsa program akışı bir yöne, yanlış (false) değer alıyorsa başka yöne gider. Karar
vericiye yönlendirici dememizin nedeni budur. Yönlendiriciler ait oldukları
dil içinde belirli birer sözdizimine sahiptirler. O nedenle, onları ilgili programlama dili içinde özel yapılar olarak görmek gerekir (bkz. [2]).
Hemen her programlama dilinde if ve if-else yönlendiricileri vardır.
if ve else deyimleri içiçe yuvalanabilirler. Böylece daha karmaşık mantıksal ifadeler oluşur. Ancak en karmaşık mantıksal yönlendirmelerin if ve
else deyimleriyle kurulabildiğini bilmek, konuyu basitleştirecektir. Başka
bir deyişle if ve if-else yapılarının program akışını nasıl yönlendirdiklerini
bilmek, onların karmalarını oluşturmak için yeterlidir.
Bu iki yapının program akışını nasıl yönlendirdiği, akış şemaları çizilerek kolayca görülebilir.
11.1.1
if . . . Yönlendiricisi
Şekil 11.2: if yönlendirmesi
11.1. PROGRAM AKIŞININ YÖNLENDIRILMESI
119
if . . . karar yapısı, program akışını ya ana doğrultuda devam ettirir
ya da karar noktasında if blokuna saptırır. Program akışı ana doğrultu
boyunca doğrusal akarken (kodlar yazıldığı sırada işlenirken) karar verici
deyime gelince, akış önce boolean deyiminin değerini bulur. Karar noktasındaki boolean ifadesinin değeri (bkz. Şekil 11.2);
1. true (doğru) ise, program akışı karar noktasında ana akış doğrultusundan sapar if blokuna yönelir. if bloku içindeki deyimleri sırayla
işledikten sonra tekrar ana doğrultuda saptığı yerden sonraki ilk deyime döner. Ondan sonra ana doğrultuda doğal akışını sürdürür.
2. false (yanlış) ise, program akışı ana doğrultudan sapmaz. Ana doğrultuda karar noktasından sonraki deyime geçer ve sonra doğal akışını
sürdürür; yani program akışı if blokuna girmez.
if denetimin üç sözdizimi Liste 11.1 içinde numaralı olarak gösterimiştir.
Liste 11.1.
3
[1]
i f boolean
deyim ( l e r )
end
[2]
i f b o o l e a n t h e n deyim ( l e r ) end
8
[3]
i f b o o l e a n ; deyim ( l e r ) end
[1] biçeminde boolean ifade satırbaşı (newline) ile sonrakilerden ayrılmıştır.
[2] biçeminde boolean ifade then anahtar sözcüğü ile sonrakilerden ayrılmıştır. [3] biçeminde boolean ifade (;) ile sonrakilerden ayrılmıştır.
Örnekler:
Liste 11.2.
if x > 0
print ( ’x p o z i t i f t i r ’ )
end
5
i f x > 0 t h e n p r i n t ( ’ x p o z i t i f t i r ’ ) end
i f x > 0 ; p r i n t ( ’ x p o z i t i f t i r ’ ) end
Liste 11.3.
120
3
BÖLÜM 11. DENETIM YAPILARI
if x < 0
print ( ’x negatiftir ’ )
end
i f x < 0 t h e n p r i n t ( ’ x n e g a t i f t i r ’ ) end
i f x < 0 ; p r i n t ( ’ x n e g a t i f t i r ’ ) end
end Sınırlaması
if bloku end ile sınırlanır. Blok içine istenildiği kadar deyim yazılabilir.
Ama end sınırı konulmazsa, if bloku tamamlanmadığı için, Ruby aşağıdaki
uyarıyı verir:
s y n t a x e r r o r , u n e x p e c t e d end−o f −i n p u t , e x p e c t i n g keyword_end
Program 11.1.
4
1
x = −3
i f x >= 0
p r i n t ( ’ x ya p o z i t i f t i r ’ )
p r i n t ( ’ ya da s ı f ı r d ı r ’ )
/∗ ∗
s y n t a x e r r o r , u n e x p e c t e d end−o f −i n p u t , e x p e c t i n g keyword_end
∗/
Liste 11.4.
2
x = −3
i f x >= 0
p r i n t ( ’ x ya p o z i t i f t i r ’ )
p r i n t ( ’ ya da s ı f ı r d ı r ’ )
end
Liste 11.5.
x =10
i f x == 10
p r i n t " x 12 d i r \n "
end
Liste 11.6.
1
6
def pozitifmi
x = 8
i f x >= 0
p u t s "#{x} ya p o z i t i f t i r "
p u t s " ya da s ı f ı r d ı r "
end
end
puts p o z i t i f m i
11.2. IF . . . THEN . . . DENETIMI
121
Liste 11.7.
1
x =10
i f x == 10
p r i n t " #{x} on ’ dur \n "
end
11.1.2
Ard arda if
Ard arda if deyimlerinin her birisi kendi başına bir yönlendiricidir. Program
11.2’deki ilk if blokunun ikinci if-else bloku ile ilişkisi yoktur. Birbirlerinden
bağımsız çalışırlar. Eğer, ilk if denetimine bağlı olarak ikincinin çalışması
isteniyorsa else ya da elsif denetimleri kullanılmalıdır.
Program 11.2.
1
ad = " Anday "
i f ad == " Anday "
p u t s " Merhaba Anday "
end
6
11
4
i f ad == " A l p e r "
p u t s " A d ı n ı z ı bilmiyorum "
else
puts " Kimsiniz "
end
/∗ ∗
Merhaba Anday
Kimsiniz
∗/
11.2
if . . . then . . . denetimi
• if-end bloku belirli bir mantıksal ifade (boolean) doğru ise işlenecek
deyim ya da deyimleri içerir.
• Mantıksal deyimin () parantezi içine alınması gerekmez. Mantıksal
deyimin bittiğini belirtmek için yeni satır (newline) (;) ya da then
anahtarı kullanılır.
• if-end blokunda işlenecek deyimlerim { } parantezi içine alınması
gerekmez. Ancak, kaynak programın kolay okunurluğunu sağlamak
istersek, işlenecek deyimleri { } parantezi içine alabiliriz.
122
BÖLÜM 11. DENETIM YAPILARI
Şekil 11.3: if-then yönlendiemesi
• if blokunun deyim(leri) ayrı satırlara yazılıyorsa, then anahtarı gerekli değildir. Yazılsa da yazılmasa da olur. Ama if . . . then . . . end
bloku tek bir satıra yazılıyorsa, then anahtarı zorunlu olur. then
anahtarı yerine (;) da kullanılabilir.
• Tek satıra birden çok deyim yazılıyorsa, deyimler (;) ile birbirlerinden
ayrılır.
Liste 11.8 örneğinde [1],[2],[3] denetim yapıları doğrudur, ama dördüncü
sıradaki [4] yapısı yanlıştır
Liste 11.8.
1
[1]
x = −7
if x < 0
puts
x negatiftir
end
6
[2]
i f x < 0 t h e n p u t s ( " x n e g a t i f t i r " ) end
11
[3]
x = −7
i f ( x < 0 ) ; p u t s ( " x n e g a t i f t i r " ) end
[4]
if x < 0
p u t s ( " x n e g a t i f t i r " ) end
Liste 11.9 ile 11.10 denk iş yaparlar. Bir satırda birden çok deyim
olduğunda deyimlerin (;) ile birbirlerinden ayrıldığına dikkat ediniz.
Liste 11.9.
11.2. IF . . . THEN . . . DENETIMI
5
123
x = 0
i f x < 10
x += 1
puts x
end
Liste 11.10.
x = 3
i f x < 10 t h e n x += 1 ; p u t s x end
11.2.1
if . . . else . . . Yapısı
Şekil 11.4: if-else Yönlendirmesi
Program akışının, karar noktasında ana doğrultudan ayrılıp iki seçenekten yalnızca birisine yönlenmesi gerektiği durumlarda kullanılan yönlendiricidir. Bu yapının çizgel görüntüsü Şekil 11.1 ile verilmiştir. if . . . else
. . . yapısının sözdizimi şöyledir:
Liste 11.11.
3
8
i f boolean
deyimA1
...
deyimAn
else :
deyimB1
...
deyimBr
Bu yapıda program akışı önce karar noktasındaki boolean deyimini
işler. Çıkan değer
124
BÖLÜM 11. DENETIM YAPILARI
1. true ise if blokuna yönlenir ve oradaki deyimA1, . . . , deyimAn deyimleri işler. else blokuna geçmeden karar yapısından çıkar ve ana
akış doğrultusunda karar noktasından sonraki ilk deyime gider. Oradan doğal akışını sürdürür.
2. false ise, program akışı if blokuna yönelmez; else blokuna girer ve
oradaki deyimB1, . . . , deyimBr deyimleri işler. else blokundaki deyimleri bitirince ana akış doğrultusunda karar noktasından sonraki
ilk deyime gider. Oradan doğal akışını sürdürür.
if-else yapısında, program akışı ya if blokunu ya da else blokunu
işler. Her ikisini işlemez.
if ve else bloklarındaki deyim sayıları için bir kısıtlama yoktur. Hiç
deyim içermeyebilecekleri gibi, istenildiği kadar deyim içerebilirler. Ruby,
bir blok içindeki deyimlerin paranteze alınmasını gerektirmez. Ancak, kaynak programın kolay algılanabirliğini sağlamak için bloklar { } parantezleri
ile sınırlanabilir.
Örnekler:
Liste 11.12.
#e n c o d i n g UTF−8
2
7
1
gün = ’ S a l ı ’
i f gün == ’ Cumartesi ’ o r gün == ’ Pazar ’
p r i n t ( ’ Hafta s o n u n d a s ı n . D i n l e n ’ )
else
p r i n t ( ’ Hafta i ç i n d e s i n ’ )
print ( "
Çalış !\n" )
end
/∗ ∗
Hafta i ç i n d e s i n .
∗/
Çalış !
Liste 11.13.
7
x = 23
if x > 0
print ( ’x p o z i t i f t i r ’ )
else
p r i n t ( ’ x ya n e g a t i f t i r ’ )
p r i n t ( " ya da s ı f ı r d ı r \n " )
end
3
/∗ ∗
x pozitiftir
∗/
2
11.2. IF . . . THEN . . . DENETIMI
125
Liste 11.14.
7
x = −23
if x > 0
print ( ’x p o z i t i f t i r ’ )
else
p r i n t ( ’ x ya n e g a t i f t i r ’ )
p r i n t ( " ya da s ı f ı r d ı r \n " )
end
3
/∗ ∗
x ya n e g a t i f t i r ya da s ı f ı r d ı r
∗/
2
Liste 11.15.
2
x = 27
i f x % 2 ==0
p r i n t ( "#{x } , ç i f t t i r \n " )
else
p r i n t ( "#{x } , t e k t i r \n " )
end
/∗ ∗
27 t e k t i r
∗/
Liste 11.16.
2
x = true
i f x == t r u e
p u t s ( ’ x doğrudur ’ )
else
p r i n t ( ’ x doğru d e ğ i l d i r ’ )
end
/∗ ∗
x doğrudur
∗/
elsif yapısı
else’den sonra if deyiminin gelişini ifade eden bir yapıdır. Bazı dillerde yani
else-if ifadesi elif diye adlandırılır. Bu yalnızca bir adlandırmadır; yeni bir
yapı değildir. Gerektiği kadar else if deyimleri ard arda kullanılabilir.
Liste 11.17.
126
2
7
BÖLÜM 11. DENETIM YAPILARI
x = 9
if
x == 1
print ( " bir " )
e l s i f x == 2
print ( " iki " )
e l s i f x == 3
p r i n t ( " üç " )
else
p r i n t ( " h i ç b i r i d e ğ i l \n " )
end
Liste 11.18.
4
9
x = 9
if
x == 1
print ( " bir " )
e l s e i f x == 2
print ( " iki " )
e l s e i f x == 3
p r i n t ( " üç " )
else
p r i n t ( " h i ç b i r i d e ğ i l \n " )
end
Program 11.3, a sayısının değerine göre akışı yönlendiriyor. if koşulu
sağlandığı için, akışın elsif ve else bloklarına hiç girmediğine dikkat ediniz.
Program 11.3.
4
2
a = 30
i f a >= 21
puts
e l s i f a >=
puts
else
puts
end
( " i f blokundayım " )
21
( " e l s i f blokundayım " )
( " e l s e blokundayım " )
/∗ ∗
∗ i f blokundayım
∗/
Burada a nın değerini değiştirerek akışın öteki bloklara girmesini sağlayınız.
Program 11.4, 2 yaşından küçüklere ücretsiz, 2-12 yaş arasındakilere
yarı ücret ve 12 yaşından büyüklere tam bilet kesen bir havayolu şirketinin,
kim için hangi bileti keseceğini belirliyor.
Program 11.4.
11.2. IF . . . THEN . . . DENETIMI
2
7
12
2
127
# b i l e t . rb
#e n c o d i n g UTF−8
p u t s ( ’ Kaç y a ş ı n d a ? ’ )
str = gets ()
ya ş = s t r . t o _ i
i f ya ş <= 2
puts ( ’ ü c r e t s i z ’ )
e l s i f 7 <= y a ş and ya ş < 13
puts ( ’ y a r ı ücret ’ )
else
p u t s ( ’ tam ü c r e t ’ )
end
/∗ ∗
Kaç y a ş ı n d a ?
7
yarı ücret
∗/
11.2.2
İçiçe elsif
Bazen birden çok koşuldan seçim yapmak için elsif bloklarını içiçe kullanmak gerekebilir. if-else arasına istenildiği kadar elseif bloku konulabilir. elsif bloklarından birisi koşulu sağlayıp çalışırsa, akış ondan sonraki
iç bloklara girmez, if blokundan çıkar; sonraki deyimle ana yolda devam
eder.
Program 11.5’da elsif bloklarının içiçe olduğunu göstermek için, her
blok girintili gösterilmiştir. Ruby böyle girintiye gerek görmez.
Program 11.5.
# puan . rb
#e n c o d i n g UTF−8
5
10
15
p u t s ( ’ Kaç puan a l d ı n ı z ’ )
str = gets ()
puan = s t r . t o _ i
i f puan >= 90
puts ( ’ Pekiyi ’ )
e l s i f puan >=80
puts ’ İ y i ’
e l s i f puan >=70
p u t s ’ Orta ’
e l s i f puan >=60
p u t s ’ Geçer ’
e l s i f puan >=50
puts ’ Zayıf ’
else
p u t s ( ’ Çok z a y ı f ’ )
end
128
1
6
11
16
21
26
/∗ ∗
Çıktı :
Kaç puan
93
Pekiyi
server : i f
Kaç puan
85
İyi
server : i f
Kaç puan
72
Orta
server : i f
Kaç puan
66
Geçer
server : i f
Kaç puan
55
Zayıf
server : i f
Kaç puan
34
Çok z a y ı f
∗/
BÖLÜM 11. DENETIM YAPILARI
aldınız
t i m u r k a r a c a y $ ruby puan1 . rb
aldınız
t i m u r k a r a c a y $ ruby puan1 . rb
aldınız
t i m u r k a r a c a y $ ruby puan1 . rb
aldınız
t i m u r k a r a c a y $ ruby puan1 . rb
aldınız
t i m u r k a r a c a y $ ruby puan1 . rb
aldınız
Program 11.6.
o r d e r = { : s i z e => " o r t a " }
4
9
def şekerli_kahve
p u t s " Khveye i k i ş e k e r koy "
end
d e f orta_kahve
p u t s " Kahveye b i r ş e k e r koy "
end
d e f sade_kahve
p u t s " Kahveye h i ç ş e k e r koyma "
end
14
19
2
i f o r d e r [ : s i z e ] == " ş e k e r l i "
şekerli_kahve
e l s i f o r d e r [ : s i z e ] == " o r t a "
orta_kahve
e l s i f o r d e r [ : s i z e ] == " s a d e "
sade_kahve
else
puts
" Çay yap "
end
/∗ ∗
Kahveye b i r ş e k e r koy
∗/
11.2. IF . . . THEN . . . DENETIMI
129
Program 11.7.
p r i n t " Bir s a y ı g i r i n i z : "
2
num = g e t s . t o _ i
i f num < 0
7
p u t s "#{num} n e g a t i f t i r "
e l s i f num == 0
p u t s "#{num} s ı f ı r d ı r "
e l s i f num > 0
12
p u t s "#{num} p o z i t i f t i r "
end
1
6
/∗ ∗
B i r s a y ı g i r i n i z : −34
−34 n e g a t i f t i r
Bir s a y ı g i r i n i z : 0
0 sıfırdır
B i r s a y ı g i r i n i z : 17
17 p o z i t i f t i r
∗/
11.2.3
if değiştiricileri
if modifiers
Ortaya çıkacak koşullara bağlı olarak, if denetimi farklı biçemlerde
ifade edilebilir. Bunlara if değiştiricileri ya da karma yönlendiriciler diyoruz.
Örnekler:
Karma yönlendiricileri bazı örneklerle açıklamaya çalışacağız.
unless
Bazen if yerine unless kullanılabilir. Buna if denetiminin değişik biçemi
(if modifier) denilir:
Liste 11.19.
5
çocuk = f a l s e
u n l e s s çocuk
p u t s " yemek v e r "
else
puts
" süt ver "
end
130
BÖLÜM 11. DENETIM YAPILARI
Bazen unless yerine if ! kullanılabilir. Buna if denetiminin tersyüzü
(reverse) denilir:
Liste 11.20.
4
çocuk = f a l s e
i f ! çocuk
p u t s " yemek v e r "
else
puts
" süt ver "
end
Karar noktasında ikiden çok seçenek oluşuyorsa, Adına zincir koşulu
denilen yapı oluşur. Örneğin x ile y sayılarını karşılaştıran bir boolean ifade
şöyle olabilir:
(x > y) or (x < y) or (x == y)
Bu bileşik mantıksal deyimi oluşturan basit bileşenlerden ancak birisi sağlanabilir; yani (x > y) , (x < y) , (x == y) ifadelerinden ancak birisi
gerçekleşebilir. O zaman karar verici yapıyı if . . . elsif . . . else . . . gibi düşünebiliriz:
Liste 11.21.
4
9
1
x = 5
y = 23
if x > y
p u t s ( ’ x s a y ı s ı y den büyüktür ’ )
elsif x < y
p u t s ( ’ x s a y ı s ı y den k ü ç ü k t ü r ’ )
else
puts ( ’ x i l e y b i r b i r l e r i n e e ş i t t i r ’ )
end
/∗ ∗
x s a y ı s ı y den kü ç ü k t ü r
∗/
11.2.4
?: operatörü
if a then b else c end ≡ a ? b : c
Çoğu dilde if-else denetini tek satırda yazmaya yarayan ?: operatörü vardır. Buna koşullu (conditional), üçleme (ternary) adları da verilir.
Sözdizimi Liste 11.22 ile verilen biçemler gibi olabilir.
Liste 11.22.
11.3. ALIŞTIRMALAR
131
p u t s ( i f 1 t h e n 2 e l s e 3 end ) # => 2
2
puts 1 ? 2 : 3
# => 2
x = i f 1 t h e n 2 e l s e 3 end
puts x
# => 2
7
puts t r u e ? " true " : " f a l s e "
=> " t r u e "
12
puts f a l s e ? " true " : " f a l s e "
=> " f a l s e "
/∗ ∗
x s a y ı s ı y den kü ç ü k t ü r
∗/
Program 11.8.
2
p r i n t " Bir s a y ı g i r i n i z : "
x = g e t s . to_i
puts " G i r d i ğ i n i z s a y ı " +
( x > 12 ? " 12 den büyüktür " :
1
" 12 den kü ç ü k t ü r " )
/∗ ∗
Bir s a y ı g i r i n i z : 4
G i r d i ğ i n i z s a y ı 12 den kü ç ü k t ü r
∗/
Program 11.9.
1
3
adet = 3
d e ğ i ş t i r = a d e t <= 3 ? " i s e s a y a r a k a l " : " i s e t a r t a r a k a l "
p u t s "#{a d e t } #{ d e ğ i ş t i r } . "
/∗ ∗
3
i s e sayarak a l .
∗/
begin . . . end
11.3
Alıştırmalar
Bazen karar verici boolean deyim daha çok basit bileşenlerine ayrılabilir.
Örneğin, bir x sayısının ilk beş asal sayıya bölünüp bölünemediğini bulan
bir mantıksal ifade
132
BÖLÜM 11. DENETIM YAPILARI
( x % 2 == 0 ) o r ( x % 3 == 0 ) o r ( x % 5 == 0 ) o r ( x % 7 == 0 ) o r ( x %
11 == 0 )
biçiminde yazılabilir. Bu deyimi kullanarak x sayısının ilk beş asal sayıya
bölünüp bölünemediğini bulan bir programı şöyle yazabiliriz:
Program 11.10.
4
9
14
1
x = 12345
i f x % 2 == 0
puts ( ’ x s a y ı s ı 2 i l e b ö l ü n e b i l i r ’ )
e l s i f x % 3 == 0
puts ( ’ x s a y ı s ı 3 i l e b ö l ü n e b i l i r ’ )
e l s i f x % 5 == 0
puts ( ’ x s a y ı s ı 5 i l e b ö l ü n e b i l i r ’ )
e l s i f x % 7 == 0
puts ( ’ x s a y ı s ı 7 i l e b ö l ü n e b i l i r ’ )
e l s i f x % 11 == 0
p u t s ( ’ x s a y ı s ı 11 i l e b ö l ü n e b i l i r ’ )
else
p u t s ( ’ x s a y ı s ı i l k b e ş a s a l s a y ı i l e bölünemez ’ )
end
/∗ ∗
x sayısı 3 ile
∗/
bölünebilir
Bu yapıya dikkat edersek, elsif deyimi birden çok kez tekrarlanıyor. Bu
durumda, elif deyimleri içiçe yuvalanıyor. Bu yapıda bir tek sonuç çıkar.
Üstteki bir deyim sağlanırsa, programın bu blok içindeki akışı kesilir. kalan
deyimleri işlemeden, akış, blok dışına çıkar ve ana doğrultudaki ana yola
döner. Bloklar kurulurken, daima blok oluşturma kuralına uymalıyız ([6],
[9], [10]).
Program 11.11, bir işçinin haftalık ücretini hesaplıyor. 40 saate kadar
işçiye normal ücret ödeniyor. 40 saatten fazla çalışan işçiye, fazla çalıştığı
her saat için normal ücretin 1.5 katı ödeniyor. toplamSaat, işçinin hafta
içinde çalıştığı toplam saattir. saatÜcreti, normal çalışmaya ödenen saat
ücretidir.
Program 11.11.
2
7
d e f f a z l a M e s a i H e s a p l a ( toplamSaat , s a a t Ü c r e t i )
i f toplamSaat <= 40
to p la mÜ cret = s a a t Ü c r e t i ∗ toplamSaat
else
f a z l a M e s a i = toplamSaat − 40
to p lamÜ cr et = s a a t Ü c r e t i ∗40 + ( 1 . 5 ∗ s a a t Ü c r e t i ) ∗ f a z l a M e s a i
r e t u r n top la mÜ cr et
d e f main ( )
11.3. ALIŞTIRMALAR
12
133
s a a t = f l o a t ( i n p u t ( ’ İ ş ç i kaç s a a t ç a l ı ş t ı ? ’ ) )
ücret = f l o a t ( input ( ’ saat ü c r e t i nedir ? ’ ) )
t o t a l = fazlaMesaiHesapla ( saat , ücret )
p r i n t ( ’ Toplam ü c r e t : ’ , t o t a l )
main ( )
Çıktı :
İ ş ç i kaç s a a t ç a l ı ş t ı ? 48
s a a t ü c r e t i n e d i r ? 10
Toplam ü c r e t :
520.0
Program 11.11’deki if...else... yapısını Program 11.12’de olduğu gibi
de yazabiliriz. Deneyiniz.
Program 11.12.
1
6
11
d e f f a z l a M e s a i H e s a p l a ( toplamSaat , s a a t Ü c r e t i )
i f toplamSaat <= 40
normalSaat = toplamSaat
fazlaMesai = 0
else :
f a z l a M e s a i = toplamSaat − 40
normalSaat = 40
r e t u r n s a a t Ü c r e t i ∗ normalSaat + ( 1 . 5 ∗ s a a t Ü c r e t i ) ∗ f a z l a M e s a i
d e f main ( )
s a a t = f l o a t ( i n p u t ( ’ İ ş ç i kaç s a a t ç a l ı ş t ı ? ’ ) )
ücret = f l o a t ( input ( ’ saat ü c r e t i nedir ? ’ ) )
t o t a l = fazlaMesaiHesapla ( saat , ücret )
p r i n t ( ’ Toplam ü c r e t : ’ , t o t a l )
16
main ( )
3
/∗ ∗
Çıktı :
İ ş ç i kaç s a a t ç a l ı ş t ı ? 48
s a a t ü c r e t i n e d i r ? 10
Toplam ü c r e t :
520.0
∗/
Program 11.13.
4
9
d e f karneNotu ( puan )
i f puan >= 90
harfNotu =
e l i f puan >= 80
harfNotu =
e l i f puan >= 70
harfNotu =
e l i f puan >= 60
harfNotu =
’A ’
’B ’
’C ’
’D ’
134
BÖLÜM 11. DENETIM YAPILARI
else :
h a r f N o t u = ’F ’
r e t u r n harfNotu
14
end
d e f not_yaz
s t r = g e t s ( p r i n t ( ’ Puanı g i r i n i z
puan = s t r . t o _ i
h a r f N o t u = karneNotu ( puan )
p r i n t ( harfNotu )
’))
19
not_yaz
Çıktı :
Puanı g i r i n i z 87
B
Program 11.14.
2
p r i n t ( " Saat kaç ? " )
saat = g e t s ( ) . to_i
i f s a a t < 10
p u t s ( " Günaydın ! " )
7
elsif
s a a t < 12
p u t s ( " Öğlen yemeği zamanı y a k l a ş ı y o r . " )
e l s i f s a a t < 18
puts ( " İ y i günler ! " )
12
e l s i f s a a t < 22
puts ( " İ y i akşamlar ! " )
17
2
7
else
puts ( " İ y i g e c e l e r ! " )
end
/∗ ∗
Çıktılar :
Saat kaç ? 9
Günaydın !
Saat kaç ? 13
İyi günler !
Saat kaç ? 17
İyi günler !
12
17
Saat kaç ? 20
İ y i akşamlar !
Saat kaç ? 23
İyi geceler !
∗/
11.3. ALIŞTIRMALAR
135
Program 11.15’i yazıp yürütünüz. Deyimlerin işlevlerini tek tek açıklayınız.
Program 11.15.
# y a z a r . rb
3
8
13
2
ad = " D o s t o y e v s k i "
i f ad == " T o l s t o y "
p r i n t " Merhaba T o l s t o y ! | n "
e l i f ad == " John "
p r i n t " Merhaba John ! | n "
e l i f ad == " D o s t o y e v s k i "
p r i n t " Merhaba D o s t o y e v s k i ! \ n "
else
p r i n t " H e r k e s e selam ! \ n "
end
/∗ ∗
H e r k e s e selam !
∗/
Program 11.16, doğacak çocuklarına cinsiyetine göre ad takacak anababnın kararını bildiriyor.
Program 11.16.
n = rand ( 2 )
2
7
3
i f n==0
p r i n t ( " Çocuğa A l p e r a d ı v e r i l e c e k ! \ n " )
else
p r i n t ( " Çocuğa Bahar a d ı v e r i l e c e k \n " )
end
/∗ ∗
0
Çocuğa A l p e r a d ı v e r i l e c e k !
∗/
Uyarı:
Ruby’de seçkisiz (random) sayılar Kernel.rand metodu tarafından üretilir.
1
rand
# 0.0 i l e 1.0 arasında s e ç k i s i z bir f l o a t ü r e t i r
rand ( 1 0 0 ) # 0 i l e
n arasında s e ç k i s i z b i r tamsayı ü r e t i r
Alıştırmalar 11.1.
136
11.4
BÖLÜM 11. DENETIM YAPILARI
case yönlendirmesi
Program 11.17.
#! / u s r / b i n / ruby
3
p r i n t " Enter top l e v e l domain : "
domain = g e t s . chomp
8
13
18
c a s e domain
when " us "
p u t s " United S t a t e s "
when " de "
p u t s " Germany "
when " sk "
puts " Slovakia "
when " hu "
p u t s " Hungary "
else
p u t s " Unknown "
end
Program 11.18.
2
7
12
student_grade = 8
c a s e student_grade
when 0
p u t s " Çok kötü "
when 1 . . 4
puts " B a ş a r ı s ı z "
when 5 . . 7
puts " İ y i "
when 8 . . 9
p u t s " Çok İ y i "
when 10
p u t s " Super "
end
Program 11.19.
2
7
computer = " c64 "
y e a r = c a s e computer
when " c64 " t h e n " 1982 "
when " c16 " t h e n " 1984 "
when " amiga " t h e n " 1985 "
else
" Tarih b i l i n m i y o r "
end
p u t s "#{computer } ç ı k ı ş
12
# c64 ç ı k ı ş
y ı l ı 1982
y ı l ı #{y e a r } "
Download

Denetim Yapıları 11.1 Program Akışının Yönlendirilmesi