Bana kod yazmayı öğret baba – Bölüm 5

O değil de, n’oldu şimdi Türkiye’nin tur atlaması imkansız mı oldu?

Hayat çoğu zaman tek bir eğer-yoksa koşuluyla programlanabilecek kadar basit olmuyor maalesef. Türkiye’nin tur atlama durumu kadar karmaşık durumlarla karşılabiliriz. Bir futbol örneğini ele alalım. Varsayalım, ligin son haftasına geldik, Beşiktaş, Galatasaray ve Fenerbahçe hepsi son haftaya kafa kafaya girdiler ve hepsi son maçlarını ligin diğer takımlarıyla oynuyorlar. Öyle bir program yazalım ki, kullanıcı programa maç sonuçlarını yazsın, program da hesap kitap yapıp bu sonuçlarla kimin şampiyon olacağını söylesin. Bu arada compilerımız burada.

Son haftaya girilirken puan tablosu şöyle olsun. Averajları şimdilik karıştırmayalım.

  • Beşiktaş: 78
  • Galatasaray: 77
  • Fenerbahçe: 76

Şimdi biraz kafayı çalıştıralım ve bakalım, maç sonuçlarına göre kim şampiyon oluyor.

  • Eğer BJK kazanırsa: Şampiyon BJK
  • Eğer BJK berabere kalırsa:
    • Eğer GS kazanırsa: Şampiyon GS
    • Eğer GS kazanamazsa:
      • Eğer FB kazanırsa: Şampiyon averaja göre BJK veya FB
      • Eğer FB kazanamazsa: Şampiyon BJK
  • Eğer BJK yenilirse:
    • Eğer GS kazanırsa: Şampiyon GS
    • Eğer GS berabere kalırsa:
      • Eğer FB kazanırsa: Şampiyon FB
      • Eğer FB kazanamazsa: Şampiyon averaja göre BJK veya GS
    • Eğer GS yenilirse:
      • Eğer FB kazanırsa: Şampiyon FB
      • Eğer FB kazanamazsa: Şampiyon BJK

Bu işi çok daha kolay yapabiliriz tabii ki ama gelin, bu karmaşayı bir programa dökelim. En başta kullanıcıya sırasıyla üç takımın maç sonucunu soruyoruz. Kullanıcı k (kazandı), b (berabere kaldı), y (yenildi) şeklinde cevap veriyor. Sonra programımız şampiyonun kim olacağını söylüyor.

bjk_mac_sonucu = input("BJK maci ne oldu? (k/b/y seklinde cevap verelim lutfen)")
gs_mac_sonucu = input("GS maci ne oldu? (k/b/y seklinde cevap verelim lutfen)")
fb_mac_sonucu = input("FB maci ne oldu? (k/b/y seklinde cevap verelim lutfen)")
if bjk_mac_sonucu == "k":
  yazilacak_cumle = "Sampiyon BJK!!!"
elif bjk_mac_sonucu == "b":
  yazilacak_cumle = "Sampiyon BJK!!!"  
  if gs_mac_sonucu == "k":
    yazilacak_cumle = "Sampiyon GS!!!"
  else:
    if fb_mac_sonucu == "k":
      yazilacak_cumle = "Sampiyon averaja gore BJK veya FB" 
    else:
      yazilacak_cumle = "Sampiyon BJK!!!" 
elif bjk_mac_sonucu == "y":
  if gs_mac_sonucu == "k":
    yazilacak_cumle = "Sampiyon GS!!!"  
  if gs_mac_sonucu == "b":
    if fb_mac_sonucu == "k":
      yazilacak_cumle = "Sampiyon FB!!!" 
    else:
      yazilacak_cumle = "Sampiyon averaja gore BJK veya GS"   
  if gs_mac_sonucu == "y":
    if fb_mac_sonucu == "k":
      yazilacak_cumle = "Sampiyon FB!!!" 
    else:
      yazilacak_cumle = "Sampiyon BJK!!!"   
print(yazilacak_cumle)

If içinde if içinde bir daha if. Tam bir curcuna. Gördüğünüz üzere dilediğimiz kadar if’i iç içe yazabiliyoruz. Tek yapmamız gereken, her yeni seviye if için bir girinti seviyesi içe girmemiz. Tabii ki burada her if’in kendi egemenlik alanı olduğunu ve de dışarıdaki if’lerin, egemenlik alanının içerdeki iflerin egemenlik alanını kapsadığını da görmemiz lazım. Bir önceki derste yaptığımız gibi egemenlik alanlarını çizecek olursak, mesela:

Kırmızı bölgeler birinci girinti seviyesindeki if ve elif’lere ait. Eğer kod akışı bu birinci seviyedeki elif’in içine girecek olursa kendini ikinci girinti seviyesindeki mavi bölgelerin birinde bulacak ve hatta belki sonra üçüncü girinti seviyesindeki yeşillerin birinin içerisinde. Uzun lafın kısası, dilediğimiz karmaşık koşullar silsilesini içe içe geçen if’ler sayesinde kodlayabiliyoruz. Fakat tek yöntem bu değil.


Ödev 5.1: Kullanıcıya adını, yaşını ve cinsiyetini (k/e) soran, ekrana eğer kullanıcı 18 yaşından küçükse “Selam [buraya kullanıcının ismi gelecek]!”, eğer 18 yaşından büyük ve erkekse “Selam [buraya kullanıcının ismi gelecek] Bey!”, eğer 18 yaşından büyük ve kadınsa “Selam [buraya kullanıcının ismi gelecek] Hanım!” yazan bir program yazın.


Şimdi yukarıda yazdığımız şampiyonluk belirleyen koda bir gözatalım. Sizce bu kodu daha kısa ve öz bir şekilde yazabilir miydik? Cevap veriyorum: evet. Dikkat ederseniz sonuçlara göre puan hesabını kafamızdan yaptık ve sonuçta en yüksek puana ulaşan takımı şampiyon olarak belirledik. Peki, puan hesabını biz niye yapıyoruz karşımızda dağ gibi Python dururken? Bırakalım o yapsın hesabı ve en yüksek puana ulaşan takım/takımlar kimse bize söylesin. Bundan güzel ödev olur ha bakın.


Ödev 5.2: Yukarıdaki kodu her takımın puan hesabını yapıp en yüksek puanlı takımı şampiyon yazacak şekilde değiştirin. İpucu: şöyle bir satırla başlayabilirsiniz misal: “bjk_puan = 78”


Birden fazla koşulun üst üste bindiği bu şampiyonluk hesabı gibi durumları kodlamak için tek yöntem iç içe geçen if’ler elif’ler, else’ler değil demiştik. Mesela birden fazla koşulu tek bir if içine sığdırabiliyoruz. Nasıl? and (ve), or (veya) kullanarak.

x = input("Bir sayi alayim lutfen?")
x = int(x)
if x >= 100 and x < 1000:
  print("Sayi 3 basamakli.")
else:
  print("Sayi 3 basamakli degil.")

Arada “and” kullanarak “iki koşul birden sağlanırsa” if’in egemenlik alanına gir dedik. Tabii ki bunu ikiden fazla koşul için uygulamamız da mümkün.

x = input("Bir sayi alayim lutfen?")
x = int(x)
y = input("Bir sayi daha?")
y = int(y)
if x >= 100 and x < 1000 and y >= 100 and y < 1000: 
  print("Iki sayi da 3 basamakli") 
elif x >= 100 and x < 1000: 
  print("Sadece ilk sayi 3 basamakli") 
elif y >= 100 and y < 1000:
  print("Sadece ikinci sayi 3 basamakli")  
else:
  print("Sayi 3 basamakli degil.")

Yine bir örnekle birden fazla kuşu vurduk sanki sevgili okurlar. Öncelikle, if içinde 1 değil, 2 değil, 3 değil, tamı tamına 4 tane koşulu yan yana koyduk ve bunun için 3 tane and kullandık. Kod akışının bu if içine girmesi için bu 4 koşulun birden sağlanması gerekiyordu. Yani tam bir “ölme eşeğim ölme” durumu. Eğer kod akışı ilk if’in içine girmiyorsa bu şu anlama geliyordu: Birinci ve ikinci sayıların ikisi birden 3 basamaklı değil. Yani, en az biri 3 basamaklı olma koşulunu sağlamıyor. Bu durumda 3 seçenek kalıyor: 1. Sadece birinci sayı 3 basamaklı. 2. Sadece ikinci sayı 3 basamaklı 3. İkisi de 3 basamaklı değil. If’i takip eden elif’ler kısmında bu üç koşulu da kod akışımıza ekliyoruz dikkat ederseniz. Aynı kodu iç içe geçen if’ler kullanarak da yazabilirim. Mesela sadece ilk if koşulunu şöyle de yazabiliriz:

if x >= 100: 
  if x < 1000: 
    if y >= 100: 
      if y < 1000: 
        print("Iki sayi da 3 basamakli")

veya şöyle:

if x >= 100 and x < 1000: 
  if y >= 100 and y < 1000: 
    print("Iki sayi da 3 basamakli")

Burada tercih tamamen size kalmış. Hangi yöntemi kullanırsanız kullanın temelde aynı mantığı kodlamış oluyorsunuz. Bana sorarsanız daha kısaltılmış, düzenli kod yazımını tercih ettiğimden üç tane and’li ilk yöntemi tercih ederim.


Ödev 5.3: Ödev 5.1’i “and” kullanarak tekrar yazın.


Tabiki bir de “or”umuz, yani “veya”mız var. If’in egemenlik alanına girmek için birden fazla koşulun en az birinin sağlanması yetiyorsa or’u kullanabiliriz. Misal:

x = input("Bir sayi alayim lutfen?")
x = int(x)
if x > 100 or x < 10: 
  print("Sayi 10'dan kucuk veya 100'den buyuk")
else: 
  print("Sayi 10'dan kucuk degil, 100'den buyuk de degil. Tamam buldum 10 ile 100 arasinda.")

Daha önceden bahsettiğimiz gibi, aynı mantığı pek çok farklı şekilde kodlayabilirsiniz: and’ler, or’lar kullanarak ve/veya sadece if’ler else’ler kullanarak. Aynı mantığı iki farklı şekilde yazalım:

sayi1 = input("Birinci sayiyi alayim")
sayi1 = int(sayi1)
sayi2 = input("Ikinci sayiyi alayim")
sayi2 = int(sayi2)
sayi3 = input("Ucuncu sayiyi alayim")
sayi3 = int(sayi3)
if sayi1 < sayi2 or sayi1 < sayi3: 
  print("Birinci sayi en buyuk degil")
else: 
  print("Birinci sayi en buyuk")

veya

if sayi1 > sayi2 and sayi1 > sayi3: 
  print("Birinci sayi en buyuk")
else: 
  print("Birinci sayi en buyuk degil")

Ödev 5.4: Yukarıdaki örnek kodu öyle bir değiştirin ki girilen üç sayıyı “En büyük …, en küçük de ….” şeklinde sıralasın. Tabi bu kodu and’ler ve/veya or’lar kullanarak yazın.

Ödev 5.5: Bu sefer varsayalım ki sadece Beşiktaş ve Galatasaray şampiyonluk yarışındalar ve son haftaya giriyorlar. Beşiktaş’ın puanı 78, averajı da +43 olsun, Galatasaray’ın da puanı 76, averajı da +40 olsun. Öyle bir program yazın ki yine şampiyonu belirlesin. Bunu yaparken önce Beşiktaş’ın, sonra Galatasaray’ın maç sonucunu sorsun. Eğer puan eşitliği varsa (yani BJK berabere kalır, GS kazanır), Galatasaray’ın kaç farklı kazandığını sorsun ve ona göre şampiyonu ekrana yazsın. Varsayalım ki hem puan hem averaj eşitliği durumunda Galatasaray ikili averajdan ötürü şampiyon oluyor.

Ödev 5.6: Bir önceki ödev sorusunu değiştirip programın başında Beşiktaş ve Galatasaray’ın puan ve averajlarını kullanıcıya sorun.


Son olarak biraz if’in içinde ne oluyor ondan bahsedelim. Python’a soru sorma kısmını ikinci dersimizde öğrenmiştik hatırlarsınız. Cevabı true veya false olan sorular soruyorduk ve cevapları boolean olan değişkenlere kaydediyorduk. Burada yaptığımız şey de if’in içine bir boolean sokmak. Eğer boolean’ın değeri True’ysa if’in egemenlik alanına girilecek, yoksa girilmeyecektir. Yani aslında şu iki kod arasında hiçbir fark yok.

sayi = input("Bir sayi alabilir miyim?")
sayi = int(sayi)
if sayi > 27: 
  print("sayi 27'den buyuk")
sayi = input("Bir sayi alabilir miyim?")
sayi = int(sayi)
sayi_27den_buyuk_mu = sayi > 27
if sayi_27den_buyuk_mu: 
  print("sayi 27'den buyuk")

Hatta şöyle saçma şeyler de yapabiliriz. Python’a göre if’in içi bir boolean olduğu sürece sorun yok.

if True:
  print("selam")
if False:
  print("naber")

İki derslik if-else yolculuğunun sonuna geldik dostlar. Artık farklı bir şeyler öğrenmenin zamanı geldi de geçiyor sanki. Ha tabii, unutmadan buyurunuz bir önceki dersin ödev çözümleri:


Ödev 4.1 çözüm

string_sayi = input("100'den kucuk bir sayi alabilir miyim?")
sayi = int(string_sayi)
if sayi <= 100:
  print("Tesekkurler!")
else:
  print("Ayip oluyor!")

Ödev 4.2 çözüm

x = 49.16 * 49.16
y = 4833.4124
z = (599.1764 + 5) * 4
if x == y:
  print("49.16'un karesi 4833.4124'e esit.")
if x == z:
  print("49.16'un karesi (599.1764 + 5) * 4'e esit.")
if y == z:
  print("4833.4124 (599.1764 + 5) * 4'e esit.")

Ödev 4.3 çözüm

x = input("Kucuk bir sayi girin lutfen.")
y = int(x)
if y > 100:
  y = y / 100
  print("Kusura bakma 100'e boldum bunu: " + str(y))

Ödev 4.4 çözüm

x = input("Kucuk bir sayi girin lutfen.")
y = int(x)
if y > 100:
  x = input("Lutfen bir sayi daha girin.")
  print("Ikinci girilen sayi: " + x)

Ödev 4.5 çözüm

x = input("Bir sayi alayim")
x = int(x)
y = input("Bir sayi daha alayim")
y = int(y)
if x == y:
  print("Ayni sayiyi girmissiniz.")
else:
  print("Farkli sayilar bunlar.")

Ödev 4.6 çözüm

x = input("Bir sayi alayim")
x = int(x)
y = input("Bir sayi daha alayim")
y = int(y)
if x == y:
  print("Iki sayi birbiriyle ayni.")
elif x > y:
  print("Birinci sayı ikinciden daha büyük.")
else:
  print("Ikinci sayı birinciden daha büyük.")

Ödev 4.7 çözüm

x = input("Bir sayi alayim")
x = int(x)
if x > 1000:
  print("Sayı 1000’den büyük.")
elif x >= 100:
  print("Sayi 3 basamakli.")
elif x >= 10:
  print("Sayi 2 basamakli.")
elif x >= 0:
  print("Sayi tek basamakli.")

The following two tabs change content below.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.