Bölüm 3: Kontrol Yapıları

Bölüm 3: Kontrol Yapıları · Çalışma Soruları
Sıralı işlemlerif ve else-ifswitchSıcaklıkDöngülerİç içe döngülerbreak ve continue
Sercan KÜLCÜ

Çoktan Seçmeli · Sıralı İşlemler

Soru 1: Sıralı Takas

İki değişkenin değerleri takas edilmek isteniyor. Program ne yazdırır?

int a = 5, b = 9;
a = b;
b = a;
System.out.println(a + " " + b);

C: Deyimler sırayla çalışır: a = b ile a 9 olur ve 5 değeri kaybolur; b = a b'ye yine 9 yazar. Takas için üçüncü bir değişken gerekir: int t = a; a = b; b = t;

Çoktan Seçmeli · Karar Yapıları

Soru 2: Parantezsiz if ve else-if

Program hangi satırları yazdırır?

int t = 25;
if (t > 30)
    System.out.println("sicak");
    System.out.println("su ic");
if (t > 20) {
    System.out.println("ilik");
} else if (t > 10) {
    System.out.println("serin");
}

A: Parantezsiz if'e yalnızca ilk deyim bağlıdır: "sicak" atlanır, "su ic" koşuldan bağımsız yazılır. else-if zincirinde ilk doğru koşulun bloğu çalışır, gerisi atlanır: 25 > 20 → yalnızca "ilik".

Çoktan Seçmeli · Karar Yapıları

Soru 3: Aralık Denetimi

int not değişkeninin 60 ile 89 arasında (ikisi dahil) olduğunu hangi koşul doğru sınar?

D: İki koşulun birlikte doğru olması gerekir: &&. 60 <= not < 90 derlenmez: 60 <= not bir boolean üretir, boolean ile 90 karşılaştırılamaz. || ile her sayı koşulu sağlar. Sonuncuda parantez içi hiçbir zaman doğru olmaz (bir sayı hem 60'tan küçük hem 90 ve üstü olamaz), değili hep true'dur.

Çoktan Seçmeli · Karar Yapıları

Soru 4: Hileli Oyunda Eşikler

Oyun %25 olasılıkla "Kazandiniz!", %35 olasılıkla "Kaybettiniz!", %40 olasılıkla "Tekrar deneyin." yazmalı. nextDouble() [0, 1) aralığında düzgün dağılmış bir sayı verir. Boşluğa hangi eşik yazılmalı?

Random r = new Random();
double olasilik = r.nextDouble();
if (olasilik < 0.25) {
    System.out.println("Kazandiniz!");
} else if (olasilik < ____) {
    System.out.println("Kaybettiniz!");
} else {
    System.out.println("Tekrar deneyin.");
}

C: else-if koşuluna yalnızca ilk koşulu sağlamayan değerler (olasilik ≥ 0.25) ulaşır; bu yüzden eşikler birikimlidir. [0.25, 0.60) aralığının genişliği 0.35'tir, kalan [0.60, 1) 0.40. 0.35 yazılsaydı oranlar %25 / %10 / %65, 0.40 ile %25 / %15 / %60, 0.75 ile %25 / %50 / %25 olurdu.

Hata Bulma · Karar Yapıları

Soru 5: Yanlış Sıralı Zincir

Program 95 için A yazdırmalıydı. Ne yazdırır, neden? Nasıl düzeltilir?

int not = 95;
String harf;
if (not >= 60) {
    harf = "D";
} else if (not >= 70) {
    harf = "C";
} else if (not >= 90) {
    harf = "A";
} else {
    harf = "F";
}
System.out.println(harf);
Cevabı göster

Çıktı: D. 60 ve üstündeki her not için de D.

  • else-if koşulları yukarıdan aşağıya sınanır; ilk doğru koşulun bloğu çalışır, gerisine hiç bakılmaz.
  • 95 >= 60 doğru olduğu için ilk dal seçilir; not >= 90 dalına asla ulaşılamaz.
  • Düzeltme: koşulları büyükten küçüğe dizmek.
if (not >= 90) {
    harf = "A";
} else if (not >= 70) {
    harf = "C";
} else if (not >= 60) {
    harf = "D";
} else {
    harf = "F";
}

Derleyici bu hatayı yakalamaz: mantık hatasıdır.

Çoktan Seçmeli · switch

Soru 6: Hangi switch Derlenir?

Aşağıdaki parçalardan hangisi derlenir?

B: Seçici String olabilir (Java 7+). double (long, float, boolean da) seçici olamaz. case değeri derleme zamanında bilinen bir sabit olmalıdır; b final olmayan bir değişkendir. Aynı değer iki case'te kullanılamaz (duplicate case label).

Çıktı Sorusu · switch

Soru 7: Mevsimler ve Aşağı Düşme

K kış, B bahar, Y yaz, S sonbahar. Döngü hangi ayları dener, program ne yazdırır?

String sonuc = "";
for (int ay = 1; ay <= 12; ay += 4) {
    switch (ay) {
        case 12: case 1: case 2:
            sonuc += "K"; break;
        case 3: case 4: case 5:
            sonuc += "B";
        case 6: case 7: case 8:
            sonuc += "Y"; break;
        default:
            sonuc += "S";
    }
}
System.out.println(sonuc);
Cevabı göster

Çıktı: KBYS

  • ay += 4: döngü 1, 5 ve 9 için çalışır (13 <= 12 yanlış).
  • ay = 1: kış grubu, break → "K".
  • ay = 5: "B" eklenir ama break yok; akış yaz grubuna düşer ve "Y" de eklenir.
  • ay = 9: hiçbir case eşleşmez → default → "S".

Art arda yazılan case 3: case 4: case 5: etiketleri aşağı düşmenin bilerek kullanıldığı biçimdir.

Çoktan Seçmeli · Sıcaklık

Soru 8: Fahrenhayt ve Tam Sayılar

int c = 37; için hangi ifade 98 (37 °C ≈ 98,6 °F) sonucunu verir?

A: Soldan sağa: 37 · 9 = 333, 333 / 5 = 66 (kesir atılır), + 32 = 98. 9 / 5 önce hesaplanırsa 1 olur: 37 + 32 = 69. c / 5 = 7 → 7 · 9 + 32 = 95. Son ifade formülün kendisi yanlış: 124. Kesirli sonuç için c * 1.8 + 32 yazılır.

Çoktan Seçmeli · Döngüler

Soru 9: Çarpım Biriktirme

Program ne yazdırır?

int sayi = 5;
int sonuc = 1;
while (sayi > 0) {
    sonuc *= sayi;
    sayi--;
    System.out.print(sonuc + " ");
}

D: Döngü sayi = 5, 4, 3, 2, 1 için beş tur döner ve her tur bir değer yazar. Çarpma yazdırmadan önce yapıldığı için ilk değer 5'tir (1 hiç yazılmaz). Son turda 120 · 1 = 120 olduğundan 120 iki kez görünür. Döngüden sonra sonuc = 5! = 120, sayi = 0.

Çoktan Seçmeli · Döngüler

Soru 10: Sıfırın Basamak Sayısı

Basamak sayan döngü sayi = 0 için 0 buluyor. Hangi değişiklik 0'ı 1 basamaklı sayar ve diğer pozitif sayılarda de doğru sonuç verir?

int sayac = 0;
while (sayi > 0) {
    sayi = sayi / 10;
    sayac++;
}

B: do-while gövdeyi en az bir kez çalıştırır: 0 → 1 basamak, 1234 → 4 basamak. sayi >= 0 hiç yanlış olmaz (0 / 10 = 0): sonsuz döngü. Sayacı 1'den başlatmak her pozitif sayıda bir fazla sayar. Satırların sırası sonucu değiştirmez.

Adım Adım Çalıştırma · Döngüler

Soru 11: Ters Çevirme İzleme

% 10 son rakamı alır, / 10 siler. Her turdan sonra değişkenleri izleyin. Program ne yazdırır?

Toplam için biriktirici 0; ters de 0'dan kurulacak.

4071 % 10 = 1. ters = 0 · 10 + 1 = 1. 4071 / 10 = 407.

rakam 7: ters = 1 · 10 + 7 = 17; toplam 8.

rakam 0 toplamı değiştirmez ama ters'e bir basamak ekler: 170.

rakam 4: ters = 1704, toplam = 12, sayi 0 oldu.

0 > 0 yanlış: döngü biter. rakam blokta tanımlıydı, artık yok.

Rakamlar sağdan sola geldiği için ters sayı oluştu. Asıl sayı gerekseydi önceden kopyalanmalıydı.

int sayi = 4071;
int ters = 0, toplam = 0;
while (sayi > 0) {
    int rakam = sayi % 10;
    ters = ters * 10 + rakam;
    toplam += rakam;
    sayi = sayi / 10;
}
System.out.println(ters + " " + toplam);

Kod Yazma · Döngüler

Soru 12: Dijital Kök

Bir sayının rakamlarını toplayıp sonuç tek basamak olana kadar işlemi tekrarlayan (dijital kök) kodu iç içe while ile yazın. 98765 ve 999999999 için sonuç nedir?

Cevabı göster
int sayi = 98765;
while (sayi >= 10) {
    int toplam = 0;
    while (sayi > 0) {
        toplam += sayi % 10;
        sayi = sayi / 10;
    }
    sayi = toplam;
}
System.out.println(sayi);
  • Dış döngü: sayı tek basamaklı olana kadar. İç döngü: rakamlar toplamı. toplam her dış turda yeniden 0'dan başlamalıdır.
  • 98765 → 35 → 8. 999999999 → 81 → 9.

Çoktan Seçmeli · İç İçe Döngüler

Soru 13: printf ile Hizalama

System.out.printf("[%3d][%-3d][%02d]%n", 7, 7, 7); ne yazar?

A: %3d 3 karakterlik alana sağa, %-3d sola yaslar; %02d en az 2 basamak yazar ve eksiği baştan 0 ile doldurur. Tablolarda her hücre aynı genişlikte olunca sütunlar hizalanır.

Hata Bulma · İç İçe Döngüler

Soru 14: Artı Eksi Deseni

Her satırı +-+-+-+-+-+-+-+-+-+- (10 kez "+-") olan 3 satırlık desen isteniyor. Kod bu deseni yazdırır mı? Yazdırmıyorsa nasıl düzeltilir?

int satir = 3;
int uzunluk = 21; // satırdaki karakter sayısı
for (int i = 0; i < satir; i++) {
    for (int j = 0; j < uzunluk; j++) {
        if (j % 2 == 0) {
            System.out.print("+");
        } else {
            System.out.print("-");
        }
    }
    System.out.println();
}
Cevabı göster

Hayır. Her satıra +-+-+-+-+-+-+-+-+-+-+ yazılır: 21 karakter, sonda fazladan bir "+".

  • İç döngü j = 0 … 20 için 21 tur döner: çift j'ler (0, 2, …, 20) 11 tane "+", tek j'ler 10 tane "-".
  • İstenen satır 20 karakterdir: uzunluk = 20 ile j = 0 … 19 olur, son j = 19 tektir ve satır "-" ile biter.
  • Başka bir çözüm: iç döngüyü 10 kez dönüp her turda System.out.print("+-"); yazmak.

Sınır hatalarında son turda j'nin değerini ve yazılan karakteri tek tek kontrol etmek işe yarar.

Çıktı Sorusu · İç İçe Döngüler

Soru 15: Sayı Piramidi

Dış döngü satırları, üç iç döngü sırasıyla boşlukları, artan ve azalan rakamları yazıyor. Çıktı nedir? i. satırda kaç karakter vardır?

for (int i = 1; i <= 4; i++) {
    for (int j = 1; j <= 4 - i; j++)
        System.out.print(" ");
    for (int j = 1; j <= i; j++)
        System.out.print(j);
    for (int j = i - 1; j >= 1; j--)
        System.out.print(j);
    System.out.println();
}
Cevabı göster
   1
  121
 12321
1234321
  • i. satırda 4 − i boşluk, sonra 1…i, sonra i − 1…1 yazılır.
  • Rakam sayısı i + (i − 1) = 2i − 1; boşluklarla birlikte satır uzunluğu (4 − i) + (2i − 1) = i + 3.
  • Üçüncü döngü i = 1 iken hiç dönmez: j = 0 >= 1 yanlış.

Adım Adım Çalıştırma · İç İçe Döngüler

Soru 16: Izgara Deseni İzleme

Her hücre için koşul sınanıyor. Hangi hücrelere # yazılır? Çıktıyı adım adım izleyin.

j=1j=2j=3i=1#i=2i=3

i = 1, j = 1: i == j doğru, || sağ tarafa bakmaz → "#".

j=1j=2j=3i=1#.i=2i=3

i = 1, j = 2: iki koşul da yanlış → ".".

j=1j=2j=3i=1#.#i=2i=3

j == 3 doğru → "#". İç döngü bitti; println() satırı bitirir.

j=1j=2j=3i=1#.#i=2.i=3

i = 2, j = 1: iki koşul da yanlış → ".".

j=1j=2j=3i=1#.#i=2.#i=3

i == j doğru → "#".

j=1j=2j=3i=1#.#i=2.##i=3

j == 3 doğru → "#". İç döngü bitti; println() satırı bitirir.

j=1j=2j=3i=1#.#i=2.##i=3.

i = 3, j = 1: iki koşul da yanlış → ".".

j=1j=2j=3i=1#.#i=2.##i=3..

i = 3, j = 2: iki koşul da yanlış → ".".

j=1j=2j=3i=1#.#i=2.##i=3..#

Köşegen ve son sütun burada kesişir: "#". Toplam 3 × 3 = 9 hücre; dış döngü biter.

for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        if (i == j || j == 3)
            System.out.print("#");
        else
            System.out.print(".");
    }
    System.out.println();
}

Çoktan Seçmeli · break ve continue

Soru 17: Döngüden Sonra i

Program ne yazdırır?

int i = 0;
for (i = 1; i < 6; i++) {
    if (i > 3)
        continue;
}
System.out.println(i);

C: continue döngüyü bitirmez, yalnızca o turun kalanını atlar; burada atlanacak bir deyim de yok. Döngü i < 6 yanlış olunca, yani i = 6 iken biter. i döngüden önce bildirildiği için bu son değer döngüden sonra da okunur. continue yerine break olsaydı i = 4'te çıkılır, 4 yazılırdı.

Adım Adım Çalıştırma · break ve continue

Soru 18: İç İçe Döngüde break ve continue

continue iç döngüde, break dış döngüde. Program kaç satır yazdırır? Her deyim hangi döngüyü etkiler?

i = 1: 1 == 3 yanlış, iç döngü başlar. j = 1 ikiye eşit değil, satır yazılır.

j = 2: continue iç döngünün bu turunun kalanını atlar; j++ çalışır, dış döngü etkilenmez.

j = 3 yazılır.

j = 4 yazılır. j = 5 olunca iç döngü biter, dış döngü i++ yapar.

i = 2: iç döngü j = 1'den yeniden başlar.

j = 2 yine atlanır.

j = 3 ve j = 4 yazılır; iç döngü biter.

i = 3: break içinde bulunduğu dış döngüden çıkar; i = 4 hiç denenmez. Toplam 6 satır.

for (int i = 1; i <= 4; i++) {
    if (i == 3) break;
    for (int j = 1; j <= 4; j++) {
        if (j == 2) continue;
        System.out.println("i: " + i + " j: " + j);
    }
}

Adım Adım Çalıştırma · break ve continue

Soru 19: Asallık Testi İzleme

Bölen yalnızca i * i <= sayi olana kadar aranıyor; i döngüden önce bildirildi. Program ne yazdırır?

91 ≥ 2: önce asal olduğu varsayılır (bayrak). i döngüden sonra da kullanılacak.

4 <= 91. 91 % 2 = 1: bölen değil.

9 <= 91. 91 % 3 = 1.

i = 4, 5, 6 da bölmez (kalanlar 3, 1, 1).

49 <= 91. 91 % 7 = 0: bölen bulundu, bayrak indirilir.

break: döngüden hemen çıkılır; i++ çalışmaz, i 7 kalır.

91 = 7 · 13. Yalnızca 6 deneme yapıldı; i = 10 olunca 100 > 91 olurdu.

int sayi = 91;
boolean asal = sayi >= 2;
int i;
for (i = 2; i * i <= sayi; i++) {
    if (sayi % i == 0) {
        asal = false;
        break;
    }
}
System.out.println(sayi + " " + asal + " " + i);

Hata Bulma · break ve continue

Soru 20: continue ile Takılan Döngü

Amaç 2 dışındaki sayıları yazıp "bitti" demek. Program ne yapar? Nasıl düzeltilir?

int i = 0;
while (i < 5) {
    if (i == 2) {
        continue;
    }
    System.out.print(i + " ");
    i++;
}
System.out.println("bitti");
Cevabı göster

0 1 yazar, sonra sonsuza kadar döner; "bitti" hiç yazılmaz.

  • i = 2 olunca continue, gövdenin geri kalanını, yani i++'yı da atlar. i hep 2 kalır, koşul hep doğrudur.
  • while'da güncelleme gövdenin içindedir; continue onu atlayabilir. for'da güncelleme başlıktadır ve continue'dan sonra da çalışır:
for (int i = 0; i < 5; i++) {
    if (i == 2) {
        continue;
    }
    System.out.print(i + " ");
}
System.out.println("bitti");

Düzeltilmiş çıktı: 0 1 3 4 bitti

Son

Bölüm 3: Kontrol Yapıları: Çalışma Soruları
Konu anlatımı: kontrol yapıları sunumu · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.