Denetim Yapıları 11
Ş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-
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ük- sek ü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öntem- lerin olması gerekir.
Program akışının yönünü değiştirerek, belirlenen koşulların gerektir- diği deyimlere yönlendiren karar vericiler birer boolean (mantıksal) deyim- dir (bkz. 7). Karar verici boolean deyimi doğru (true) değer alıyorsa prog- ram 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 prog- ramlama 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ık- sal 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ı çizi- lerek kolayca görülebilir.
11.1.1 if . . . Yönlendiricisi
Şekil 11.2: if yönlendirmesi
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 nokta- sındaki boolean ifadesinin değeri (bkz. Şekil 11.2);
1. true (doğru) ise, program akışı karar noktasında ana akış doğrultu- sundan sapar if blokuna yönelir. if bloku içindeki deyimleri sırayla işledikten sonra tekrar ana doğrultuda saptığı yerden sonraki ilk de- yime 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ğrul- tuda 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.
[ 1 ]
i f b o o l e a n
3 deyim ( l e r ) e n d
[ 2 ]
i f b o o l e a n t h e n deyim ( l e r ) e n d
8
[ 3 ]
i f b o o l e a n ; deyim ( l e r ) e n d
[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ıl- mıştır. [3] biçeminde boolean ifade (;) ile sonrakilerden ayrılmıştır.
Örnekler:
Liste 11.2.
i f x > 0
p r i n t ( ’ x p o z i t i f t i r ’ ) e n d
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 ’ ) e n d i f x > 0 ; p r i n t ( ’ x p o z i t i f t i r ’ ) e n d
Liste 11.3.
i f x < 0
p r i n t ( ’ x n e g a t i f t i r ’ )
3 e n d
i f x < 0 t h e n p r i n t ( ’ x n e g a t i f t i r ’ ) e n d i f x < 0 ; p r i n t ( ’ x n e g a t i f t i r ’ ) e n d
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:
syntax e r r o r , unexpected end−o f −i n p u t , e x p e c t i n g keyword_end
Program 11.1.
x = −3 i f x >= 0
p r i n t ( ’ x ya p o z i t i f t i r ’ )
4 p r i n t ( ’ ya da s ı f ı r d ı r ’)
1 /∗ ∗
syntax e r r o r , unexpected end−of−input , e x p e c t i n g keyword_end
∗/
Liste 11.4.
x = −3
2 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 ’) e n d
Liste 11.5.
x =10
i f x == 10
p r i n t " x 12 d i r \n "
e n d
Liste 11.6.
1 d e f p o z i t i f m i x = 8
i f x >= 0
puts "#{x} ya p o z i t i f t i r "
puts " ya da s ı f ı r d ı r "
6 e n d
e n d
puts p o z i t i f m i
Liste 11.7.
1 x =10 i f x == 10
p r i n t " #{x} on ’ dur \n "
e n d
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 "
puts " Merhaba Anday "
e n d
6
i f ad == " Alper "
puts " A d ı n ı z ı bilmiyorum "
e l s e
puts " K i m s i n i z "
11 e n d
/∗ ∗
Merhaba Anday K i m s i n i z
4 ∗/
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.
Şekil 11.3: if-then yönlendiemesi
• if blokunun deyim(leri) ayrı satırlara yazılıyorsa, then anahtarı ge- rekli 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
i f x < 0
puts x n e g a t i f t i r e n d
6
[ 2 ]
i f x < 0 t h e n puts (" x n e g a t i f t i r ") e n d
[ 3 ]
11 x = −7
i f ( x < 0) ; puts (" x n e g a t i f t i r ") e n d
[ 4 ]
i f x < 0 puts (" x n e g a t i f t i r ") e n d
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.
x = 0 i f x < 10 x += 1 puts x
5 e n d
Liste 11.10.
x = 3
i f x < 10 t h e n x += 1 ; puts x e n d
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ön- lendiricidir. 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.
i f b o o l e a n deyimA1
3 . . .
deyimAn e l s e:
deyimB1 . . .
8 deyimBr
Bu yapıda program akışı önce karar noktasındaki boolean deyimini işler. Çıkan değer
1. true ise if blokuna yönlenir ve oradaki deyimA1, . . . , deyimAn de- yimleri işler. else blokuna geçmeden karar yapısından çıkar ve ana akış doğrultusunda karar noktasından sonraki ilk deyime gider. Ora- dan 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 de- yimleri bitirince ana akış doğrultusunda karar noktasından sonraki ilk deyime gider. Oradan doğal akışını sürdürür.
if-elseyapısında, program akışı ya if blokunu ya da else blokunu işler. Her ikisini işlemez.
ifve 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, kay- nak 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
gün = ’ S a l ı ’
i f gün == ’ Cumartesi ’ o r gün == ’ Pazar ’ p r i n t ( ’ Hafta son u nd as ı n . Dinlen ’ ) e l s e
7 p r i n t ( ’ Hafta i ç i n d e s i n ’) p r i n t ( " Ç a l ı ş ! \ n " ) e n d
1 /∗ ∗
Hafta i ç i n d e s i n . Ç a l ı ş !
∗/
Liste 11.13.
x = 23
2 i f x > 0
p r i n t ( ’ x p o z i t i f t i r ’ ) e l s e
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 " )
7 e n d
/∗ ∗x p o z i t i f t i r
3 ∗/
Liste 11.14.
x = −23
2 i f x > 0
p r i n t ( ’ x p o z i t i f t i r ’ ) e l s e
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 " )
7 e n d
/∗ ∗
x ya n e g a t i f t i r ya da s ı f ı r d ı r
3 ∗/
Liste 11.15.
x = 27
2 i f x % 2 ==0
p r i n t ( "#{x } , ç i f t t i r \n ") e l s e
p r i n t ( "#{x } , t e k t i r \n ") e n d
/∗ ∗ 27 t e k t i r
∗/
Liste 11.16.
x = t r u e
2 i f x == t r u e
puts ( ’ x doğrudur ’ )
e l s e
p r i n t ( ’ x doğru d e ğ i l d i r ’) e n d
/∗ ∗
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.
x = 9
2 i f x == 1
p r i n t (" b i r ") e l s i f x == 2
p r i n t (" i k i ")
7 e l s i f x == 3 p r i n t (" üç ") e l s e
p r i n t (" h i ç b i r i d e ğ i l \n ") e n d
Liste 11.18.
x = 9 i f x == 1
4 p r i n t (" b i r ") e l s e i f x == 2
p r i n t (" i k i ") e l s e i f x == 3
p r i n t (" üç ")
9 e l s e
p r i n t (" h i ç b i r i d e ğ i l \n ") e n d
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.
a = 30 i f a >= 21
puts (" i f blokundayım ")
4 e l s i f a >= 21
puts (" e l s i f blokundayım ") e l s e
puts (" e l s e blokundayım ") e n d
/∗ ∗
2 ∗ 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.
# b i l e t . rb
2 #e n c o d i n g UTF−8 puts (’ Kaç y a ş ı n d a ? ’) s t r = g e t s ( )
yaş = s t r . to_i
7 i f yaş <= 2
puts (’ ü c r e t s i z ’)
e l s i f 7 <= yaş a n d yaş < 13 puts (’ y a r ı ü c r e t ’) e l s e
12 puts (’ tam ü c r e t ’) e n d
/∗ ∗
2 Kaç y a ş ı n d a ? 7
y a r ı ü c r e t
∗/
11.2.2 İçiçe elsif
Bazen birden çok koşuldan seçim yapmak için elsif bloklarını içiçe kul- lanmak gerekebilir. if-else arasına istenildiği kadar elseif bloku konu- labilir. 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
puts (’ Kaç puan a l d ı n ı z ’)
5 s t r = g e t s ( ) puan = s t r . to_i
i f puan >= 90 puts (’ P e k i y i ’)
e l s i f puan >=80
10 puts ’ İ y i ’
e l s i f puan >=70 puts ’ Orta ’
e l s i f puan >=60
puts ’ Geçer ’
15 e l s i f puan >=50
puts ’ Z a y ı f ’ e l s e
puts (’ Çok z a y ı f ’) e n d
1 /∗ ∗ Ç ı k t ı :
Kaç puan a l d ı n ı z 93
P e k i y i
6 s e r v e r : i f ti murkar acay$ ruby puan1 . rb Kaç puan a l d ı n ı z
85 İ y i
s e r v e r : i f ti murkar acay$ ruby puan1 . rb
11 Kaç puan a l d ı n ı z 72
Orta
s e r v e r : i f ti murkar acay$ ruby puan1 . rb Kaç puan a l d ı n ı z
16 66 Geçer
s e r v e r : i f ti murkar acay$ ruby puan1 . rb Kaç puan a l d ı n ı z
55
21 Z a y ı f
s e r v e r : i f ti murkar acay$ ruby puan1 . rb Kaç puan a l d ı n ı z
34
Çok z a y ı f
26 ∗/
Program 11.6.
o r d e r = { : s i z e => " o r t a " }
d e f ş e k e r l i _ k a h v e
4 puts " Khveye i k i ş e k e r koy "
e n d
d e f orta_kahve
puts " Kahveye b i r ş e k e r koy "
e n d
9 d e f sade_kahve
puts " Kahveye h i ç ş e k e r koyma "
e n d
14
i f o r d e r [ : s i z e ] == " ş e k e r l i "
ş e k e r l i _ k a h v e
e l s i f o r d e r [ : s i z e ] == " o r t a "
orta_kahve
19 e l s i f o r d e r [ : s i z e ] == " sade "
sade_kahve e l s e
puts " Çay yap "
e n d
/∗ ∗
2 Kahveye b i r ş e k e r koy
∗/
Program 11.7.
p r i n t " B i r s a y ı g i r i n i z : "
2
num = g e t s . to_i i f num < 0
7 puts "#{num} n e g a t i f t i r "
e l s i f num == 0
puts "#{num} s ı f ı r d ı r "
e l s i f num > 0
12
puts "#{num} p o z i t i f t i r "
e n d
1 /∗ ∗
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 B i r s a y ı g i r i n i z : 0
6 0 s ı f ı r d ı 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 diyo- ruz.
Ö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.
çocuk = f a l s e u n l e s s çocuk
puts " yemek v e r "
e l s e
5 puts " s ü t v e r "
e n d
Bazen unless yerine if ! kullanılabilir. Buna if denetiminin tersyüzü (reverse) denilir:
Liste 11.20.
çocuk = f a l s e i f ! çocuk
puts " yemek v e r "
4 e l s e
puts " s ü t v e r "
e n d
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.
x = 5 y = 23
i f x > y
4 puts ( ’ x s a y ı s ı y den büyüktür ’ ) e l s i f x < y
puts ( ’ x s a y ı s ı y den küçüktür ’) e l s e
puts ( ’ x i l e y b i r b i r l e r i n e e ş i t t i r ’)
9 e n d
1 /∗ ∗
x s a y ı s ı y den küçüktü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 ?: opera- tö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.
puts (i f 1 t h e n 2 e l s e 3 e n d) # => 2
2
puts 1 ? 2 : 3 # => 2
x = i f 1 t h e n 2 e l s e 3 e n d
puts x # => 2
7
puts t r u e ? " t r u e " : " f a l s e "
=> " t r u e "
12
puts f a l s e ? " t r u e " : " f a l s e "
=> " f a l s e "
/∗ ∗x s a y ı s ı y den küçüktür
∗/
Program 11.8.
p r i n t " B i r s a y ı g i r i n i z : "
2 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 " : " 12 den küçüktür ")
1 /∗ ∗
B i r 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üçüktür
∗/
Program 11.9.
1 adet = 3
d e ğ i ş t i r = adet <= 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 "
puts "#{adet } #{ d e ğ i ş t i r } . "
/∗ ∗
3 i s e s a y a r a k a l .
3 ∗/
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
( 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.
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 ’)
4 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
9 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
puts ( ’ x s a y ı s ı 11 i l e b ö l ü n e b i l i r ’) e l s e
puts ( ’ x s a y ı s ı i l k beş a s a l s a y ı i l e bölünemez ’)
14 e n d
1 /∗ ∗
x s a y ı s ı 3 i l e b ö l ü n e b i l i r
∗/
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.
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 )
2 i f toplamSaat <= 40
toplamÜcret = s a a t Ü c r e t i ∗ toplamSaat e l s e
f a z l a M e s a i = toplamSaat − 40
toplamÜcret = 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
7 r e t u r n toplamÜcret
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 ı ? ’) ) ü c r e t = f l o a t ( i n p u t (’ s a a t ü c r e t i n e d i r ? ’) )
12 t o t a l = f a z l a M e s a i H e s a p l a ( saat , ü c r e t ) p r i n t (’ Toplam ü c r e t : ’, t o t a l )
main ( )
Ç ı k t ı :
İ ş ç 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 : 5 2 0 . 0
Program 11.11’deki if...else... yapısını Program 11.12’de olduğu gibi de yazabiliriz. Deneyiniz.
Program 11.12.
1 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 f a z l a M e s a i = 0
e l s e:
6 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
11 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 ı ? ’) ) ü c r e t = f l o a t ( i n p u t (’ s a a t ü c r e t i n e d i r ? ’) ) t o t a l = f a z l a M e s a i H e s a p l a ( saat , ü c r e t ) p r i n t (’ Toplam ü c r e t : ’, t o t a l )
16
main ( ) /∗ ∗ Ç ı k t ı :
3 İ ş ç 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 : 5 2 0 . 0
∗/
Program 11.13.
d e f karneNotu ( puan ) i f puan >= 90
harfNotu = ’A ’
4 e l i f puan >= 80 harfNotu = ’B ’ e l i f puan >= 70
harfNotu = ’C ’ e l i f puan >= 60
9 harfNotu = ’D ’
e l s e:
harfNotu = ’F ’ r e t u r n harfNotu e n d
14 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 . to_i
harfNotu = karneNotu ( puan ) p r i n t ( harfNotu )
19
not_yaz
Ç ı k t ı :
Puanı g i r i n i z 87 B
Program 11.14.
p r i n t (" Saat kaç ? ")
2 s a a t = g e t s ( ) . to_i
i f s a a t < 10
puts (" Günaydın ! ")
7 e l s i f s a a t < 12
puts (" Öğ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 ü n l e r ! ")
12
e l s i f s a a t < 22
puts (" İ y i akşamlar ! ")
e l s e
17 puts (" İ y i g e c e l e r ! ") e n d
/∗ ∗
2 Ç ı k t ı l a r : Saat kaç ? 9 Günaydın !
Saat kaç ? 13
7 İ y i g ü n l e r ! Saat kaç ? 17 İ y i g ü n l e r !
12 Saat kaç ? 20 İ y i akşamlar ! Saat kaç ? 23 İ y i g e c e l e r !
17 ∗/
Program 11.15’i yazıp yürütünüz. Deyimlerin işlevlerini tek tek açık- layınız.
Program 11.15.
# y a z a r . rb
3 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 "
8 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 "
e l s e
p r i n t " Herkese selam ! \ n "
13 e n d
/∗ ∗
2 Herkese selam !
∗/
Program 11.16, doğacak çocuklarına cinsiyetine göre ad takacak ana- babnın kararını bildiriyor.
Program 11.16.
n = rand ( 2 )
2
i f n==0
p r i n t (" Çocuğa Alper a d ı v e r i l e c e k ! \ n ") e l s e
p r i n t (" Çocuğa Bahar a d ı v e r i l e c e k \n ")
7 e n d
/∗ ∗ 0
3 Çocuğa Alper a d ı v e r i l e c e k !
∗/
Uyarı:
Ruby’de seçkisiz (random) sayılar Kernel.rand metodu ta- rafından üretilir.
1 rand # 0 . 0 i l e 1 . 0 a r a s ı n d a s e ç k i s i z b i r f l o a t ü r e t i r rand ( 1 0 0 ) # 0 i l e n a r a s ı n d a s e ç k i s i z b i r tamsayı ü r e t i r
Alıştırmalar 11.1.
11.4 case yönlendirmesi
Program 11.17.
#! / u s r / bin / ruby
3 p r i n t " Enter top l e v e l domain : "
domain = g e t s . chomp
c a s e domain
8 when " us "
puts " United S t a t e s "
when " de "
puts " Germany "
when " sk "
13 puts " S l o v a k i a "
when " hu "
puts " Hungary "
e l s e
puts " Unknown "
18 e n d
Program 11.18.
student_grade = 8
2 c a s e student_grade
when 0
puts " Çok kötü "
when 1 . . 4
puts " B a ş a r ı s ı z "
7 when 5 . . 7 puts " İ y i "
when 8 . . 9
puts " Çok İ y i "
when 10
12 puts " Super "
e n d
Program 11.19.
computer = " c64 "
2 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 "
e l s e
7 " Tarih b i l i n m i y o r "
e n d
puts "#{computer } ç ı k ı ş y ı l ı #{y e a r } "
12# c64 ç ı k ı ş y ı l ı 1982