Bölüm 3: Kontrol Yapıları
Ç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 >= 90dalı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
breakyok; 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ı.
toplamher 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 = 20ile 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.
i = 1, j = 1: i == j doğru, || sağ tarafa bakmaz → "#".
i = 1, j = 2: iki koşul da yanlış → ".".
j == 3 doğru → "#". İç döngü bitti; println() satırı bitirir.
i = 2, j = 1: iki koşul da yanlış → ".".
i == j doğru → "#".
j == 3 doğru → "#". İç döngü bitti; println() satırı bitirir.
i = 3, j = 1: iki koşul da yanlış → ".".
i = 3, j = 2: iki koşul da yanlış → ".".
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ı, yanii++'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