Bölüm 7: Koşullu İfadeler

Bilgisayar ve Programlamaya Giriş
Akışif-elseelse ifswitchÖrnekler
Sercan KÜLCÜ · Giresun Üniversitesi

Giriş

Öğrenme Çıktıları

Akış

Sıralı, seçmeli ve tekrarlı akışı ayırt etmek.

Koşul

Karşılaştırma ve mantık işleçleriyle koşul yazmak.

Karar

if, else if ve else yapılarını doğru sırada kurmak.

switch

Ayrık seçeneklerde switch kullanmak.

Temeller

Üç Temel Akış

SıralıKarar (seçme)Döngü (tekrar)deyim 1deyim 2deyim 3koşul?truefalseA yoluB yoluyalnızca bir yol çalışırkoşul?truegövdefalsetrue oldukça tekrar eder
  • Sıralı yapı deyimleri yazıldığı sırada yürütür; karar yapısı koşula göre farklı yol seçer.
  • Döngü yapısı bir kod bloğunu tekrarlar.
  • Bu üç yapı her algoritmanın temel yürütme modelini oluşturur.

Temeller

Sıralı İşlemler

double taban = 8;
double yukseklik = 5;
double alan = taban * yukseklik / 2;
System.out.println(alan);
1taban8.02yukseklik5.03alan = 8.0 * 5.0 / 2 = 20.0420.0ekranalan, taban ve yukseklik değer almadan hesaplanamaz
  • Her deyim bir öncekinin ürettiği değeri kullanabilir.
  • Sıra değiştirilirse tanımsız veya yanlış değer oluşabilir.

Temeller · Kodu adım adım çalıştır

Sıralı İşlemler Adım Adım

Bellek (değişkenler)taban8.0double

taban = 8 → double kutuya 8.0 olarak yazılır (genişletme).

Bellek (değişkenler)taban8.0doubleyukseklik5.0double

yukseklik = 5.0.

Bellek (değişkenler)taban8.0doubleyukseklik5.0doubleİfadetaban * yukseklik / 240.0 / 2

Soldan sağa: önce taban * yukseklik = 40.0.

Bellek (değişkenler)taban8.0doubleyukseklik5.0doublealan20.0double

40.0 / 2 = 20.0 → alan kutusuna yazılır. Bu satır önceki iki kutunun değerini kullanır.

Bellek (değişkenler)taban8.0doubleyukseklik5.0doublealan20.0double

20.0 yazdırılır. Satır 3, satır 1'den önce olsaydı taban henüz tanımsız olurdu → derleme hatası.

double taban = 8;
double yukseklik = 5;
double alan = taban * yukseklik / 2;
System.out.println(alan);

Kararlar

Karar Verme

  • Koşul boolean değer üretir.
  • if doğru yolu, else yanlış yolu tanımlar.
  • Bağımsız if'lerin hepsi denetlenir; else-if zincirinde ilk doğru dal çalışınca gerisi atlanır.
  • Örnek: not = 95. Sağda iki yazımın farklı sonucu.
bağımsız ifnot >= 90 → trueharf='A'not >= 80 → trueharf='B'sonuç: harf = 'B'✗ yanlışelse ifnot >= 90 → trueharf='A'not >= 80atlandısonuç: harf = 'A'✓ doğru

Kararlar

if-else Yapısı

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son
if (not >= 60) {
    System.out.println("Geçti");
} else {
    System.out.println("Kaldı");
}
  • Sınır değeri koşulun parçasıdır: 60 → Geçti.
  • Her olası değer yalnızca bir dala gider.

Kararlar · Kodu adım adım çalıştır

if-else Adım Adım: not = 75, 60, 45

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

1. çalıştırma: kullanıcı 75 girer.

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

Koşul: not >= 60 → 75 >= 60 → true.

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

true dalı çalışır: Geçti. Diğer dal (else bloğu) atlanır.

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

2. çalıştırma: kullanıcı 60 girer.

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

Koşul: not >= 60 → 60 >= 60 → true. Sınır değeri dahil: >=.

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

true dalı çalışır: Geçti. Diğer dal (else bloğu) atlanır.

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

3. çalıştırma: kullanıcı 45 girer.

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

Koşul: not >= 60 → 45 >= 60 → false.

truefalsenot okunot >= 60yaz "Geçti"yaz "Kaldı"Son

false dalı çalışır: Kaldı. Diğer dal (if bloğu) atlanır.

Scanner klavye = new Scanner(System.in);
int not = klavye.nextInt();
if (not >= 60) {
    System.out.println("Geçti");
} else {
    System.out.println("Kaldı");
}

Kararlar

Çok Yollu Karar: else-if

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf
if (not >= 90) {
    harf = 'A';
} else if (not >= 80) {
    harf = 'B';
} else if (not >= 70) {
    harf = 'C';
} else {
    harf = 'F';
}
  • Koşullar yukarıdan aşağı değerlendirilir; ilk true dal çalışır, gerisi atlanır.
  • Yüksek eşikler önce yazılır: not >= 70 başa yazılsaydı 95 de C alırdı.
  • else hiçbir koşul tutmadığında çalışır.

Kararlar · Kodu adım adım çalıştır

else-if Zinciri: not = 75, 95, 50

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

1. çalıştırma: not = 75. harf bildirildi, henüz değeri yok.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

1. koşul: not >= 90 → 75 >= 90 → false. Sonraki koşula geçilir.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

2. koşul: not >= 80 → 75 >= 80 → false. Sonraki koşula geçilir.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

3. koşul: not >= 70 → 75 >= 70 → true. Bu dal seçilir.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

harf = 'C'. Zincirin geri kalanı denetlenmeden atlanır.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

C yazdırılır.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

2. çalıştırma: not = 95. harf bildirildi, henüz değeri yok.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

1. koşul: not >= 90 → 95 >= 90 → true. Bu dal seçilir.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

harf = 'A'. Zincirin geri kalanı denetlenmeden atlanır.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

A yazdırılır.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

3. çalıştırma: not = 50. harf bildirildi, henüz değeri yok.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

1. koşul: not >= 90 → 50 >= 90 → false. Sonraki koşula geçilir.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

2. koşul: not >= 80 → 50 >= 80 → false. Sonraki koşula geçilir.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

3. koşul: not >= 70 → 50 >= 70 → false. Sonraki koşula geçilir.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

Hiçbir koşul tutmadı → else: harf = 'F'.

truefalsetruefalsetruefalsenot >= 90harf = 'A'not >= 80harf = 'B'not >= 70harf = 'C'harf = 'F'yaz harf

F yazdırılır.

int not = klavye.nextInt();
char harf;
if (not >= 90)      harf = 'A';
else if (not >= 80) harf = 'B';
else if (not >= 70) harf = 'C';
else                harf = 'F';
System.out.println(harf);

Tek deyimli dallarda süslü parantez yazılmayabilir.

Kararlar · Kodu adım adım çalıştır

Bağımsız if Zinciri: not = 95 → 3 satır

not = 95 atanır. Üç if de birbirinden bağımsızdır; hiçbiri diğerinin else dalı değildir.

95 >= 90 → true → A yazılır. Bağımsız if olduğu için sıradaki if yine de denenir.

95 >= 80 → true → B de yazılır. Önceki if’in sonucu bu koşulu etkilemez.

95 >= 70 → true → C de yazılır. Sonuç: 3 satır; tek harf beklenirken yanlış çıktı.

int not = 95;
if (not >= 90) System.out.println("A");
if (not >= 80) System.out.println("B");
if (not >= 70) System.out.println("C");

Kararlar · Kodu adım adım çalıştır

Aynı not = 95, else-if zinciri → 1 satır

Aynı not = 95; bu kez koşullar else if ile zincirlenmiş.

95 >= 90 → true → A yazılır.

İlk dal çalıştığı için else if dalları hiç değerlendirilmez; 80 ve 70 koşulları denenmez.

Sonuç: yalnızca 1 satır. Bağımsız if’te 3 satır (A, B, C), else-if zincirinde 1 satır (A) çıkar.

int not = 95;
if (not >= 90) System.out.println("A");
else if (not >= 80) System.out.println("B");
else if (not >= 70) System.out.println("C");

Kararlar

İç İçe Kararlar

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"
  • Bir karar dalı içinde başka karar bulunabilir: iç koşul yalnızca dış koşul true olduğunda denetlenir.
  • İç içe yapı, ikinci sorunun ancak ilk koşul sağlandığında anlamlı olduğu durumlar içindir.
  • Derin iç içelik okunabilirliği azaltır; koşullar && ile birleştirilebilir.

Kararlar · Kodu adım adım çalıştır

İç İçe Karar: 3 farklı girdi

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

1. çalıştırma: yas = 20, ehliyet = true.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

Dış koşul: yas >= 18 → 20 >= 18 → true. İç if'e girilir.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

İç koşul: ehliyet → true.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

Araç kullanabilir yazdırılır.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

2. çalıştırma: yas = 20, ehliyet = false.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

Dış koşul: yas >= 18 → 20 >= 18 → true. İç if'e girilir.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

İç koşul: ehliyet → false.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

Önce ehliyet almalı yazdırılır.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

3. çalıştırma: yas = 15, ehliyet = true.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

Dış koşul: 15 >= 18 → false. İç if hiç denetlenmez; ehliyet true olsa bile önemsizdir.

truefalsetruefalseyas >= 18ehliyetyaz "Araç kullanabilir"yaz "Önce ehliyet almalı"yaz "Yaş yetersiz"

Dış else çalışır: Yaş yetersiz.

int yas = klavye.nextInt();
boolean ehliyet = klavye.nextBoolean();
if (yas >= 18) {
  if (ehliyet)
    System.out.println("Araç kullanabilir");
  else
    System.out.println("Önce ehliyet almalı");
} else {
  System.out.println("Yaş yetersiz");
}

Kararlar · Kodu adım adım çalıştır

Sarkan else (dangling else): a = −1

Başlangıç: a = -1, b = 5, x = 0. Girinti else’in dış if’e ait olduğunu düşündürür, ama derleyici girintiye bakmaz.

a > 0 → −1 > 0 → false. Dış if’in gövdesi (iç if ve onun else’i dahil) tümüyle atlanır.

else en yakın if’e (if (b > 0)) bağlanır; o if hiç çalışmadığı için else de çalışmadı. x değişmedi: 0 yazılır.

int a = -1, b = 5, x = 0;
if (a > 0)
    if (b > 0)
        x = 1;
    else
        x = 2;
System.out.println(x);

Kararlar · Kodu adım adım çalıştır

Sarkan else’i Süslü Parantezle Düzeltmek

Aynı başlangıç değerleri. Bu kez iç if süslü parantezle kapatılmış; else dış if’e aittir.

a > 0 → false. İç if bloğu atlanır, else bloğuna geçilir.

else bloğu çalışır: x = 2.

2 yazılır. Belirsizliği gidermek için iç içe if’lerde her zaman süslü parantez kullanın.

int a = -1, b = 5, x = 0;
if (a > 0) {
    if (b > 0) x = 1;
} else {
    x = 2;
}
System.out.println(x);

Kararlar

Mantıksal İşleçlerle Karar

boolean uygun = yas >= 18 && belgeVar;
if (uygun) {
    System.out.println("Başvuru alınabilir");
}
yas >= 18belgeVar&&uygunikisi de true olmalıbelgeVartruefalseyas >= 18 ↓truefalsetruefalsefalsefalseuygun değeri
  • && iki koşulun da doğru olmasını ister.
  • || seçeneklerden en az birinin doğru olmasını ister.

Kararlar · Kodu adım adım çalıştır

&& ile Karar: 3 farklı girdi

yas20intbelgeVartruebooleanyas >= 18&&belgeVar

1. çalıştırma: yas = 20, belgeVar = true.

yas20intbelgeVartruebooleanyas >= 18true&&belgeVartrue→ true

20 >= 18 → true; sağ taraf gerekli: belgeVar → true. true && true → true.

yas20intbelgeVartruebooleanyas >= 18true&&belgeVartrue→ true

Başvuru alınabilir yazdırılır.

yas20intbelgeVarfalsebooleanyas >= 18&&belgeVar

2. çalıştırma: yas = 20, belgeVar = false.

yas20intbelgeVarfalsebooleanyas >= 18true&&belgeVarfalse→ false

20 >= 18 → true; sağ taraf gerekli: belgeVar → false. true && false → false.

yas20intbelgeVarfalsebooleanyas >= 18true&&belgeVarfalse→ false

uygun false → blok atlanır, çıktı yok.

yas16intbelgeVartruebooleanyas >= 18&&belgeVar

3. çalıştırma: yas = 16, belgeVar = true.

yas16intbelgeVartruebooleanyas >= 18false&&belgeVardeğerlendirilmedi→ false

16 >= 18 → false. Kısa devre: belgeVar okunmaz, sonuç kesin false.

yas16intbelgeVartruebooleanyas >= 18false&&belgeVardeğerlendirilmedi→ false

uygun false → blok atlanır, çıktı yok.

int yas = klavye.nextInt();
boolean belgeVar = klavye.nextBoolean();
boolean uygun = yas >= 18 && belgeVar;
if (uygun) {
    System.out.println("Başvuru alınabilir");
}

Kararlar

! ve De Morgan Kuralları

ab!(a && b)!a || !b!(a || b)!a && !b
falsefalsetruetruetruetrue
falsetruetruetruefalsefalse
truefalsetruetruefalsefalse
truetruefalsefalsefalsefalse
// Başvuru reddedilsin: 18 yaşından küçük ya da belge yok
if (!(yas >= 18 && belgeVar)) { … }
// De Morgan ile aynı koşul:
if (yas < 18 || !belgeVar) { … }
  • ! parantezin içine dağıtılırken && ile || yer değiştirir, her terim de tersine döner.
  • Karşılaştırmaların tersi: >= ↔ <, > ↔ <=, == ↔ !=.

Kararlar

Kısa Devresiz & ve |

int a = 10, b = 0;
if (b != 0 && a / b > 1) { … }  // güvenli: a / b hiç hesaplanmaz
if (b != 0 &  a / b > 1) { … }  // ArithmeticException: / by zero

Tek karakterli & ve | boolean değerlerde de kullanılır, ama iki tarafı da her zaman değerlendirir.

static int sayac = 0;
static boolean kontrol(boolean v) { sayac++; return v; }
İfade (sayac 0’dan başlar)sayac
kontrol(false) && kontrol(true)1
kontrol(false) & kontrol(true)2
kontrol(true) || kontrol(true)1
kontrol(true) | kontrol(true)2

Kararlar · Kodu adım adım çalıştır

Koşul İşleci: (a > b) ? a : b

a7intb12inta > b?a:b

a = 7, b = 12.

a7intb12inta > bfalse?abakılmadı:btrue

Koşul: a > b → 7 > 12 → false. false olduğu için :'dan sonraki değer seçilir.

a7intb12intenBuyuk12inta > bfalse?abakılmadı:btrue→ 12

enBuyuk = 12. ?: bir ifadedir: değer üretir, atamada kullanılabilir.

a7intb12intenBuyuk12inta > bfalse?abakılmadı:btrue→ 12

12 yazdırılır. Aynı işi if-else 4 satırda yapar.

int a = 7, b = 12;
int enBuyuk = (a > b) ? a : b;
System.out.println(enBuyuk);

Kısa, iki seçenekli değer seçimlerinde kullanın; iç içe ?: okunabilirliği bozar.

Kararlar · Kodu adım adım çalıştır

String Karşılaştırma: == ile equals

değişkenlerdizgi havuzuheap (new ile)s1"java"

Sabit "java" dizgi havuzunda oluşturulur; s1 bu nesneye referans tutar.

değişkenlerdizgi havuzuheap (new ile)s1"java"s2

Aynı sabit yeniden yazıldığında havuzdaki nesne paylaşılır; s2 de aynı nesneyi gösterir.

değişkenlerdizgi havuzuheap (new ile)s1"java"s2s3"java"

new String("java") her zaman yeni bir nesne üretir; s3 heap’teki ayrı nesneyi gösterir.

değişkenlerdizgi havuzuheap (new ile)s1"java"s2s3"java"

== referansları (adresleri) karşılaştırır. s1 ve s2 aynı nesneyi gösterdiği için true.

değişkenlerdizgi havuzuheap (new ile)s1"java"s2s3"java"

s1 ve s3 içerik olarak aynı ama nesneler farklı → adresler farklı → false.

değişkenlerdizgi havuzuheap (new ile)s1"java"s2s3"java"

equals nesnelerin içeriğini karşılaştırır: "java" = "java" → true. Dizgileri hep equals ile karşılaştırın.

String s1 = "java";
String s2 = "java";
String s3 = new String("java");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));

switch

switch Ne Zaman?

switch (ay)case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"
  • Tek bir ifadenin ayrık değerlerine göre seçim yaparken okunabilirdir.
  • case etiketleri sabit seçenekleri temsil eder; eşleşen case'e doğrudan gidilir.
  • Aralık ve karmaşık mantıksal koşullarda if-else çoğunlukla daha uygundur.

switch

switch İfadesi

String mevsim = switch (ay) {
    case 12, 1, 2 -> "Kış";
    case 3, 4, 5 -> "İlkbahar";
    case 6, 7, 8 -> "Yaz";
    case 9, 10, 11 -> "Sonbahar";
    default -> "Geçersiz";
};
123456789101112KışİlkbaharYazSonbaharay1..1213 gibi değer → default: "Geçersiz"
  • Ok biçimi yanlışlıkla sonraki case'e geçişi önler.
  • default beklenmeyen değerleri ele alır. Switch ifadesinde (x = switch …) tüm değerler kapsanmalıdır; int ve String için default zorunludur, switch deyiminde isteğe bağlıdır. Bu yazım Java 14 ve sonrası içindir.

switch · Kodu adım adım çalıştır

switch İfadesi: ay = 4, 12, 13

ay = 4case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

1. çalıştırma: ay = 4.

ay = 4case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

switch (ay) → 4: 4 bu case'in listesinde. Seçilen dalın değeri: "İlkbahar".

ay = 4case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

switch ifadesinin ürettiği değer mevsim'e atanır: mevsim = "İlkbahar". Başka case çalışmaz.

ay = 4case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

İlkbahar yazdırılır.

ay = 12case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

2. çalıştırma: ay = 12.

ay = 12case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

switch (ay) → 12: 12 bu case'in listesinde. Seçilen dalın değeri: "Kış".

ay = 12case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

switch ifadesinin ürettiği değer mevsim'e atanır: mevsim = "Kış". Başka case çalışmaz.

ay = 12case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

Kış yazdırılır.

ay = 13case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

3. çalıştırma: ay = 13.

ay = 13case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

switch (ay) → 13: 13 hiçbir case'te yok → default. Seçilen dalın değeri: "Geçersiz".

ay = 13case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

switch ifadesinin ürettiği değer mevsim'e atanır: mevsim = "Geçersiz". Başka case çalışmaz.

ay = 13case 12, 1, 2→ "Kış"case 3, 4, 5→ "İlkbahar"case 6, 7, 8→ "Yaz"case 9, 10, 11→ "Sonbahar"default→ "Geçersiz"

Geçersiz yazdırılır.

int ay = klavye.nextInt();
String mevsim = switch (ay) {
    case 12, 1, 2 -> "Kış";
    case 3, 4, 5 -> "İlkbahar";
    case 6, 7, 8 -> "Yaz";
    case 9, 10, 11 -> "Sonbahar";
    default -> "Geçersiz";
};
System.out.println(mevsim);

switch

switch İfadesinde yield

int yil = 2024, ay = 2;
int gun = switch (ay) {
    case 4, 6, 9, 11 -> 30;
    case 2 -> {
        System.out.println("Şubat");
        yield yil % 4 == 0 ? 29 : 28;
    }
    default -> 31;
};
System.out.println(gun);

Çıktı: Şubat ve 29 (iki satır).

  • Tek ifadeli dalda değer doğrudan yazılır; birden çok deyim gerekiyorsa dal { } bloğuna alınır ve değer yield ile verilir.
  • Blok yield olmadan biterse derleme hatası olur: switch rule completes without providing a value.
  • Java 14 ve sonrası içindir; artık yıl denetimi burada basitleştirilmiştir (100/400 kuralı yok).

switch · Kodu adım adım çalıştır

Klasik switch: break Unutulursa

case 1:"Pzt"breakcase 2:"Salı"break yok!case 3:"Çar"breakdefault:"Yok"break yok!

gun = 2.

case 1:"Pzt"breakcase 2:"Salı"break yok!case 3:"Çar"breakdefault:"Yok"break yok!

switch (gun) → 2: doğrudan case 2 etiketine atlanır; case 1 hiç denetlenmez.

case 1:"Pzt"breakcase 2:"Salı"break yok!case 3:"Çar"breakdefault:"Yok"break yok!

"Salı" yazdırılır. Bu case'te break yok!

case 1:"Pzt"breakcase 2:"Salı"break yok!case 3:"Çar"breakdefault:"Yok"break yok!

Aşağı düşme (fall-through): etiket denetlenmeden sonraki case'in kodu da çalışır → "Çar".

case 1:"Pzt"breakcase 2:"Salı"break yok!case 3:"Çar"breakdefault:"Yok"break yok!

break switch'ten çıkarır; default çalışmaz. Ok (->) biçimi bu hatayı önler.

int gun = 2;
switch (gun) {
  case 1: System.out.println("Pzt"); break;
  case 2: System.out.println("Salı");
  case 3: System.out.println("Çar"); break;
  default: System.out.println("Yok");
}

switch

if-else ve switch

Ölçütif-elseswitch
Aralık koşuluUygunDoğrudan uygun değil
Tek değere göre çok seçenekKullanılabilirGenellikle daha açık
Karmaşık mantıkUygunSınırlı
Her dal sonuç üretirAtama gerekirswitch ifadesi değer döndürebilir
if-else: aralık koşuluKaldıGeçtiPekiyi05085100not < 50   ·   not < 85   ·   elseher dal bir sayı aralığını kapsarswitch: ayrık değerler1234567case 1, 2, 3, 4, 5"Hafta içi"case 6, 7"Hafta sonu"tek bir değişkenin sabit değerleri

Örnek

Tek mi Çift mi?

int sayi = 17;
if (sayi % 2 == 0)
    System.out.println("Çift");
else
    System.out.println("Tek");
sayisayi % 2-40-3-1-20-1-100112031400 → Çift1 veya -1 → Tek (negatif tek sayıda kalan -1: == 1 testi yanılır)
  • 2 ile bölümden kalan 0 ise sayı çifttir.
  • Negatiflerde de doğru çalışır. Ama Java'da -7 % 2 = -1 olduğundan tek sayıyı sayi % 2 == 1 ile sınamak yanlıştır.

Örnek · Kodu adım adım çalıştır

Tek mi Çift mi? sayi = 17, −4, −7

Bellek (değişkenler)sayi17intİfadesayi % 2 == 0

1. çalıştırma: sayi = 17.

Bellek (değişkenler)sayi17intİfade17 % 2 == 01 == 0

Önce kalan: 17 % 2 = 1.

Bellek (değişkenler)sayi17intİfade1 == 0→ false

1 == 0 → false.

Bellek (değişkenler)sayi17intİfade→ "Tek"

Tek yazdırılır.

Bellek (değişkenler)sayi-4intİfadesayi % 2 == 0

2. çalıştırma: sayi = -4.

Bellek (değişkenler)sayi-4intİfade-4 % 2 == 00 == 0

Önce kalan: -4 % 2 = 0.

Bellek (değişkenler)sayi-4intİfade0 == 0→ true

0 == 0 → true.

Bellek (değişkenler)sayi-4intİfade→ "Çift"

Çift yazdırılır.

Bellek (değişkenler)sayi-7intİfadesayi % 2 == 0

3. çalıştırma: sayi = -7.

Bellek (değişkenler)sayi-7intİfade-7 % 2 == 0-1 == 0

Önce kalan: -7 % 2 = -1 (Java'da kalanın işareti bölünenin işaretidir).

Bellek (değişkenler)sayi-7intİfade-1 == 0→ false

-1 == 0 → false.

Bellek (değişkenler)sayi-7intİfade→ "Tek"

Tek yazdırılır. -7 % 2 == 1 koşulu kullanılsaydı sonuç false olurdu!

int sayi = klavye.nextInt();
if (sayi % 2 == 0)
    System.out.println("Çift");
else
    System.out.println("Tek");

Örnek

Mutlak Değer

int sayi = -8;
if (sayi < 0) {
    sayi = -sayi;
}
System.out.println(sayi);
-10-8-505810sayi < 0 → sayi = -sayi-8 (önce)8 (sonra)0 ve pozitifler değişmez
  • Sıfır ve pozitif değer değişmeden kalır.
  • Integer.MIN_VALUE özel bir taşma durumudur.

Örnek · Kodu adım adım çalıştır

Mutlak Değer: sayi = −8, 5, MIN_VALUE

Bellek (değişkenler)sayi-8int

1. çalıştırma: sayi = -8.

Bellek (değişkenler)sayi-8intİfade-8 < 0→ true

Koşul: sayi < 0 → -8 < 0 → true.

Bellek (değişkenler)sayi8int

sayi = -sayi → -(-8) = 8.

Bellek (değişkenler)sayi8int

8 yazdırılır.

Bellek (değişkenler)sayi5int

2. çalıştırma: sayi = 5.

Bellek (değişkenler)sayi5intİfade5 < 0→ false

Koşul: sayi < 0 → 5 < 0 → false. Blok atlanır, değer değişmez.

Bellek (değişkenler)sayi5int

5 yazdırılır.

Bellek (değişkenler)sayi-2147483648int

3. çalıştırma: sayi = -2147483648 (Integer.MIN_VALUE).

Bellek (değişkenler)sayi-2147483648intİfade-2147483648 < 0→ true

Koşul: sayi < 0 → -2147483648 < 0 → true.

Bellek (değişkenler)sayi-2147483648int

-(-2147483648) = 2147483648 int aralığına sığmaz → taşma: sonuç yine -2147483648!

Bellek (değişkenler)sayi-2147483648int

-2147483648 yazdırılır. Mutlak değer negatif çıktı: özel durum.

int sayi = klavye.nextInt();
if (sayi < 0) {
    sayi = -sayi;
}
System.out.println(sayi);

Örnek · Kodu adım adım çalıştır

Artık Yıl: 2024, 2023, 1900, 2000

yil2024int(yil % 4 == 0&&yil % 100 != 0)||yil % 400 == 0

1. çalıştırma: yil = 2024.

yil2024int(yil % 4 == 0true&&yil % 100 != 0true)||yil % 400 == 0

2024 % 4 = 0 → true; 2024 % 100 = 24 → yil % 100 != 0 → true. Parantez içi: true.

yil2024int(yil % 4 == 0true&&yil % 100 != 0true)||yil % 400 == 0bakılmadı→ true

Sol taraf true → || kısa devre: 400 kuralına bakılmaz. artik = true.

yil2024int(yil % 4 == 0true&&yil % 100 != 0true)||yil % 400 == 0bakılmadı→ true

2024 artık yıl.

yil2023int(yil % 4 == 0&&yil % 100 != 0)||yil % 400 == 0

2. çalıştırma: yil = 2023.

yil2023int(yil % 4 == 0false&&yil % 100 != 0bakılmadı)||yil % 400 == 0

2023 % 4 = 3 → false; && kısa devre yapar. Parantez içi: false.

yil2023int(yil % 4 == 0false&&yil % 100 != 0bakılmadı)||yil % 400 == 0false→ false

Sol taraf false → sağa bakılır: 2023 % 400 = 23 → false. artik = false.

yil2023int(yil % 4 == 0false&&yil % 100 != 0bakılmadı)||yil % 400 == 0false→ false

2023 normal yıl.

yil1900int(yil % 4 == 0&&yil % 100 != 0)||yil % 400 == 0

3. çalıştırma: yil = 1900.

yil1900int(yil % 4 == 0true&&yil % 100 != 0false)||yil % 400 == 0

1900 % 4 = 0 → true; 1900 % 100 = 0 → yil % 100 != 0 → false. Parantez içi: false.

yil1900int(yil % 4 == 0true&&yil % 100 != 0false)||yil % 400 == 0false→ false

Sol taraf false → sağa bakılır: 1900 % 400 = 300 → false. artik = false.

yil1900int(yil % 4 == 0true&&yil % 100 != 0false)||yil % 400 == 0false→ false

1900 normal yıl. 100'e bölünen yüzyıllar, 400'e de bölünmedikçe artık değildir.

yil2000int(yil % 4 == 0&&yil % 100 != 0)||yil % 400 == 0

4. çalıştırma: yil = 2000.

yil2000int(yil % 4 == 0true&&yil % 100 != 0false)||yil % 400 == 0

2000 % 4 = 0 → true; 2000 % 100 = 0 → yil % 100 != 0 → false. Parantez içi: false.

yil2000int(yil % 4 == 0true&&yil % 100 != 0false)||yil % 400 == 0true→ true

Sol taraf false → sağa bakılır: 2000 % 400 = 0 → true. artik = true.

yil2000int(yil % 4 == 0true&&yil % 100 != 0false)||yil % 400 == 0true→ true

2000 artık yıl.

int yil = klavye.nextInt();
boolean artik =
    (yil % 4 == 0 && yil % 100 != 0)
    || yil % 400 == 0;
if (artik)
    System.out.println(yil + " artık yıl");
else
    System.out.println(yil + " normal yıl");

Örnek · Kodu adım adım çalıştır

İkinci Dereceden Denklem: Δ > 0, Δ = 0, Δ < 0

1.0x² + (-3.0)x + 2.0

1. çalıştırma: a = 1.0, b = -3.0, c = 2.0.

1.0x² + (-3.0)x + 2.0Δ = 1.0

d = Δ = b² − 4ac = 9.0 − 8.0 = 1.0.

1.0x² + (-3.0)x + 2.0Δ > 0 → iki kök

1.0 > 0 → true: iki farklı reel kök.

2.01.01.0x² + (-3.0)x + 2.0iki kök

√Δ = 1.0; x1 = (3.0 + 1.0) / 2.0 = 2.0, x2 = 1.0.

2.01.01.0x² + (-3.0)x + 2.0iki kök

2.0 ve 1.0: parabol x eksenini iki noktada keser.

1.0x² + (-2.0)x + 1.0

2. çalıştırma: a = 1.0, b = -2.0, c = 1.0.

1.0x² + (-2.0)x + 1.0Δ = 0.0

d = Δ = b² − 4ac = 4.0 − 4.0 = 0.0.

1.0x² + (-2.0)x + 1.0Δ = 0 → tek kök

Δ > 0 false; Δ == 0 → true: tek (çakışık) kök.

1.01.0x² + (-2.0)x + 1.0tek kök

x = −b / 2a = 2.0 / 2.0 = 1.0: parabol eksene teğet.

1.0x² + (0.0)x + 1.0

3. çalıştırma: a = 1.0, b = 0.0, c = 1.0.

1.0x² + (0.0)x + 1.0Δ = -4.0

d = Δ = b² − 4ac = 0.0 − 4.0 = -4.0.

1.0x² + (0.0)x + 1.0Δ < 0

-4.0 > 0 false, -4.0 == 0 false → else.

1.0x² + (0.0)x + 1.0kök yok

Reel kök yok: parabol ekseni kesmez. Math.sqrt(negatif) NaN verirdi; else bunu önler.

double a = klavye.nextDouble();
double b = klavye.nextDouble();
double c = klavye.nextDouble();
double d = b * b - 4 * a * c;
if (d > 0) {
  double x1 = (-b + Math.sqrt(d)) / (2 * a);
  double x2 = (-b - Math.sqrt(d)) / (2 * a);
  System.out.println(x1 + " ve " + x2);
} else if (d == 0) {
  System.out.println(-b / (2 * a));
} else {
  System.out.println("Reel kök yok");
}

Örnek · Kodu adım adım çalıştır

Üç Sayının En Büyüğü: 3 farklı girdi

7a12b5cenBuyuk?int

1. çalıştırma: 7, 12, 5.

7a12b5cenBuyuk7int

Aday: enBuyuk = a = 7.

7a12b5cenBuyuk7int

b > enBuyuk → 12 > 7 → true.

7a12b5cenBuyuk12int

Yeni aday: enBuyuk = b = 12.

7a12b5cenBuyuk12int

c > enBuyuk → 5 > 12 → false; aday değişmez.

7a12b5cenBuyuk12int

En büyük: 12.

3a3b9cenBuyuk?int

2. çalıştırma: 3, 3, 9.

3a3b9cenBuyuk3int

Aday: enBuyuk = a = 3.

3a3b9cenBuyuk3int

b > enBuyuk → 3 > 3 → false; aday değişmez. Eşit değer adayı değiştirmez.

3a3b9cenBuyuk3int

c > enBuyuk → 9 > 3 → true.

3a3b9cenBuyuk9int

Yeni aday: enBuyuk = c = 9.

3a3b9cenBuyuk9int

En büyük: 9.

8a2b4cenBuyuk?int

3. çalıştırma: 8, 2, 4.

8a2b4cenBuyuk8int

Aday: enBuyuk = a = 8.

8a2b4cenBuyuk8int

b > enBuyuk → 2 > 8 → false; aday değişmez.

8a2b4cenBuyuk8int

c > enBuyuk → 4 > 8 → false; aday değişmez.

8a2b4cenBuyuk8int

En büyük: 8.

int a = klavye.nextInt();
int b = klavye.nextInt();
int c = klavye.nextInt();
int enBuyuk = a;
if (b > enBuyuk)
    enBuyuk = b;
if (c > enBuyuk)
    enBuyuk = c;
System.out.println("En büyük: " + enBuyuk);

Kısa yol: Math.max(a, Math.max(b, c)). "Aday + karşılaştır" kalıbı döngüyle genellenebilir.

Örnek · Kodu adım adım çalıştır

switch ile Hesap Makinesi: *, /0, %

8.0 * 2.5"+""-""*""/"default

1. çalıştırma: kullanıcı 8.0 * 2.5 girer; next() işareti dizgi olarak okur.

8.0 * 2.5"+""-""*""/"default

switch (op) → "*": eşleşen case "*".

8.0 * 2.5"+""-""*""/"default20.0

8.0 * 2.5 = 20.0 yazdırılır. Diğer case'ler çalışmaz.

7.0 / 0.0"+""-""*""/"default

2. çalıştırma: kullanıcı 7.0 / 0.0 girer; next() işareti dizgi olarak okur.

7.0 / 0.0"+""-""*""/"default

switch (op) → "/": eşleşen case "/".

7.0 / 0.0"+""-""*""/"defaulty == 0 ?

Bölmeden önce denetim: y == 0 → true. (double'da 7.0 / 0 hata vermez, Infinity üretir; bu yüzden kontrol ederiz.)

7.0 / 0.0"+""-""*""/"defaultHata!

Hata! yazdırılır.

5.0 % 3.0"+""-""*""/"default

3. çalıştırma: kullanıcı 5.0 % 3.0 girer; next() işareti dizgi olarak okur.

5.0 % 3.0"+""-""*""/"default

switch (op) → "%": hiçbir case eşleşmez → default.

5.0 % 3.0"+""-""*""/"defaultGeçersiz

Geçersiz: % bu hesap makinesinde tanımlı değil; default beklenmeyen girdiyi yakalar.

double x = klavye.nextDouble();
String op = klavye.next();
double y = klavye.nextDouble();
switch (op) {
  case "+" -> System.out.println(x + y);
  case "-" -> System.out.println(x - y);
  case "*" -> System.out.println(x * y);
  case "/" -> {
    if (y == 0) System.out.println("Hata!");
    else System.out.println(x / y);
  }
  default -> System.out.println("Geçersiz");
}

Özet

Bölüm Özeti

  • Sıralı yapı deyimleri yazıldığı sırada yürütür; karar yapısı koşula göre yol seçer.
  • Koşul her zaman boolean bir değer üretmelidir.
  • else-if zincirinde koşullar yukarıdan aşağı denenir; ilk doğru dal çalışır.
  • Aralık ve karmaşık koşullarda if-else, tek değerin ayrık seçeneklerinde switch uygundur.

Özet

Kontrol Soruları

  1. Bağımsız if yapıları ile else-if zinciri nasıl farklıdır?
  2. Not harf dönüşümünde eşikler neden büyükten küçüğe yazılır?
  3. İç içe karar yerine && ne zaman kullanılabilir?
  4. switch için default neden yararlıdır?
  5. Bir sayının çift olduğu hangi koşulla anlaşılır?

Özet

Alıştırmalar

  1. Girilen tam sayının pozitif, negatif veya sıfır olduğunu yazdırın.
  2. Boy ve kilodan vücut kitle indeksini (kilo / boy²) hesaplayıp zayıf / normal / fazla kilolu sınıfını yazdırın.
  3. Üç kenar uzunluğu bir üçgen oluşturuyor mu? Oluşturuyorsa eşkenar, ikizkenar veya çeşitkenar mı?
  4. 1–7 arası gün numarasını switch ile gün adına çevirin; geçersiz girdide uyarı verin.
  5. İki sayının küçüğünü ?: ile bulun; ardından üç sayının küçüğüne genişletin.
  6. Harf notu programına "not 0–100 dışında" kontrolü ekleyin. Bu kontrol zincirin neresine yazılmalı?

Özet

Kaynaklar

Son

Koşullu İfadeler
Sonraki sunum: Döngüler · Çalışma soruları · Simülatör: Karar İzleyici · Terim sözlüğü
1 / 1Sercan KÜLCÜ, Tüm hakları saklıdır.