Karar yapılarının kullanım şekli nedir?

Karar Yapıları: Kodunun Akıllı Olmasını Sağla

Karar yapıları, programlarının akışını kontrol etmenin temel taşıdır. Basitçe söylemek gerekirse, belirli koşullar sağlandığında hangi kod bloğunun çalışacağını belirlemene yardımcı olurlar. Bu, kodunu çok daha dinamik ve akıllı hale getirir.

  1. Temel `if` ve `else` Yapısı: İki Yol Ayrımı

En temel karar yapısı `if` ifadesidir. Bir koşulun doğru olup olmadığını kontrol eder ve doğruysa içindeki kod bloğunu çalıştırır.

Örneğin, bir öğrencinin sınav notuna göre geçip kalacağını belirlemek isteyelim. Eğer not 50'den büyük veya eşitse (not >= 50), öğrenci geçmiştir. Değilse, öğrenci kalmıştır.

python

not = 75

if not >= 50:

print("Geçtiniz!")

else:

print("Kaldınız.")

Burada, not değişkeninin değeri 75 olduğu için koşul (not >= 50) doğrudur ve "Geçtiniz!" çıktısı alınır. Eğer not değişkeni 40 olsaydı, koşul yanlış olurdu ve `else` bloğu çalışarak "Kaldınız." çıktısı verilirdi.

  1. `elif` ile Çoklu Koşullar: Birden Fazla Seçenek

Bazen sadece iki seçenekle sınırlı kalmayız. Farklı puan aralıklarına göre farklı başarı seviyeleri belirlemek isteyebiliriz. İşte burada `elif` (else if) devreye girer.

Bir öğrencinin aldığı puana göre notunu harf olarak belirleyelim:

  • 90 ve üstü: A
  • 80-89: B
  • 70-79: C
  • 60-69: D
  • 50-59: E
  • 50 altı: F

Bu durumu `if`, `elif` ve `else` ile şöyle ifade edebiliriz:

python

puan = 85

if puan >= 90:

harfNotu = "A"

elif puan >= 80:

harfNotu = "B"

elif puan >= 70:

harfNotu = "C"

elif puan >= 60:

harfNotu = "D"

elif puan >= 50:

harfNotu = "E"

else:

harfNotu = "F"

print(f"Aldığınız puan: {puan}, Harf Notunuz: {harfNotu}")

Bu kodda, puan 85 olduğu için ilk `if` koşulu (puan >= 90) yanlış olur. Ardından ilk `elif` koşulu (puan >= 80) doğru olduğu için harfNotu "B" olarak atanır ve diğer kontroller yapılmaz. Bu, hem okunaklılığı artırır hem de gereksiz yere koşulların kontrol edilmesini engeller.

  1. Mantıksal Operatörler: Koşulları Birleştirme

Bazen bir kararın birden fazla koşula bağlı olması gerekir. İşte burada mantıksal operatörler (`and`, `or`, `not`) devreye girer.

Örnek: Bir kullanıcıya özel indirim kuponu göndermek istiyoruz. Bu kuponu yalnızca 100 TL'den fazla alışveriş yapan VE son siparişi 30 gün içinde veren müşterilere göndereceğiz.

python

toplamHarcama = 120

sonSiparisGunu = 15 # Bugünden 15 gün önce

if toplamHarcama > 100 and (30 - sonSiparisGunu) <= 30:

print("Size özel indirim kuponu gönderildi!")

else:

print("Kupon hakkınız bulunmuyor.")

Bu örnekte, hem toplamHarcama 100'den büyük olmalı hem de son siparişin üzerinden 30 günden az zaman geçmiş olmalı. Her iki koşul da doğru olduğunda indirim kuponu gönderilir. and operatörü, iki koşulun da doğru olmasını gerektirir.

Diğer bir senaryo: Bir kullanıcının yönetici olup olmadığını veya belirli bir rolü olup olmadığını kontrol edebiliriz. Bu durumda or kullanırız.

python

kullaniciRolleri = ["editor", "yazar"]

if "admin" in kullaniciRolleri or "editor" in kullaniciRolleri:

print("Yönetim paneline erişebilirsiniz.")

else:

print("Bu alana erişiminiz yok.")

Burada, kullanıcının rol listesinde "admin" veya "editor" varsa erişim izni verilir. Deneyimlerime göre, karmaşık koşulları daha küçük ve anlaşılır parçalara ayırmak, kodun okunurluğunu ciddi şekilde artırır.

  1. `switch-case` (Python'da `match-case`): Birden Fazla Eşleşme

Bazı programlama dillerinde `switch-case` yapısı bulunur. Python 3.10 ve sonrasında bu işlevi `match-case` ile yerine getirebiliriz. Bu yapı, belirli bir değişkenin değerine göre farklı kod bloklarını çalıştırmak için kullanılır.

Örneğin, bir kullanıcının seçtiği sevkiyat yöntemine göre işlem yapmak isteyelim:

python

sevkiyatYontemi = "kargo"

match sevkiyatYontemi:

case "posta":

print("Standart posta ile gönderiliyor.")

case "kargo":

print("Hızlı kargo ile gönderiliyor.")

case "express":

print("En hızlı express kargo ile gönderiliyor.")

case _: # Varsayılan durum

print("Geçersiz sevkiyat yöntemi.")

Bu kodda, sevkiyatYontemi değişkeninin değeri "kargo" olduğu için ilgili `case` bloğu çalışır. Eğer değişkenin değeri hiçbir `case` ile eşleşmezse, `_` (wildcard) ile belirtilen varsayılan blok çalışır. Bu yapı, çok sayıda `elif` kullanmak yerine daha temiz bir alternatif sunar.

Pratik İpucu: Özellikle bir değişkenin belirli değerlere göre farklı davranışlar sergilemesi gerektiğinde `match-case` (veya diğer dillerdeki `switch-case`) kullanmak, kodunu daha düzenli ve bakımı kolay hale getirir.