SEN1001 · 4. hafta · Control Statements: Part 2

Döngüler: while, for, do-while, break/continue, iç içe döngüler

Üç döngü türü, tur sayma, break ve continue, basamak ayıklama ve yıldız desenleri. Vizenin en çok puan taşıyan konusu: iz tablosuyla çıktı bulma ve döngülü metot yazma.

repetition statementloopwhilefordo...whileloop-continuation conditioncounter-controlledsentinel-controlledoff-by-one errorinfinite loopbreakcontinuenested looptrace table

Döngüler (loops) bir grup ifadeyi tekrar tekrar çalıştırır. Vizedeki puanın en büyük kısmı burada: “bu döngü ne basar?” soruları ve “döngü kullanarak şunu hesaplayan bir metot yaz” soruları. İkisinin de anahtarı aynı: kodu kâğıt üstünde tur tur çalıştırmak.

Altın kurallar:

  1. Her turun başında koşulu yaz: T mi F mi? F olduğu anda döngü biter.
  2. Döngüden sonra sayacın değeri bir adım ilerdedir: i <= 5 bitince i = 6.
  3. do-while en az bir kez çalışır, while hiç çalışmayabilir.
  4. break döngüyü bitirir, continue sadece o turu atlar.
  5. İç içe döngüde iç döngü, dışın her turunda baştan sona döner.

while döngüsü

int i = 1;
while (i <= 5) {
    System.out.print(i + " ");
    i++;
}
System.out.println();
System.out.println("i after = " + i);
1 2 3 4 5 
i after = 6

while koşulu her turdan önce kontrol eder. Koşul true ise gövde çalışır, sonra tekrar koşula dönülür. Gövdenin içinde koşulu değiştiren bir şey (i++) olmalı; yoksa koşul hep true kalır ve sonsuz döngü (infinite loop) oluşur.

İz tablosu (trace table) ile çözüm

Sınavda her değişken için bir sütun aç, koşulu ayrı sütunda yaz:

int a = 1, b = 0;
while (a < 20) {
    b = b + a;
    a = a * 3;
}
System.out.println("a=" + a + " b=" + b);
tur         a < 20 ?     b = b + a    a = a * 3
başlangıç                0            1
1           1 < 20 T     1            3
2           3 < 20 T     4            9
3           9 < 20 T     13           27
4           27 < 20 F    → çık
a=27 b=13

Ne zaman while? Kaç tur döneceğini önceden bilmiyorsan: basamakları bitene kadar, kullanıcı doğru şifreyi girene kadar, bir sentinel değer (örneğin -1) gelene kadar (sentinel-controlled).

for döngüsü

Tur sayısı belliyse (counter-controlled) for daha derli toplu:

for (başlatma; koşul; güncelleme) {
    gövde
}

Çalışma sırası: başlatma (bir kez) → koşul → gövde → güncelleme → koşul → gövde → güncelleme → … → koşul false → çık.

int sum = 0;
for (int k = 1; k <= 5; k++) sum += k;
System.out.println(sum);
for (int k = 10; k > 0; k -= 3) System.out.print(k + " ");
System.out.println();
for (int k = 0; k < 10; k += 4) System.out.print(k + " ");
15
10 7 4 1 
0 4 8 

Tur sayısı ve off-by-one

int c1 = 0, c2 = 0, c3 = 0;
for (int k = 0; k < 5; k++) c1++;
for (int k = 1; k <= 5; k++) c2++;
for (int k = 0; k <= 5; k++) c3++;
System.out.println(c1 + " " + c2 + " " + c3);
5 5 6

Bir eksik ya da bir fazla tur hatasına off-by-one error denir. Kural: < ile bitiyorsa son değer dahil değil, <= ile bitiyorsa dahil. Sınavda her zaman ilk ve son turu ayrıca kontrol et.

TUZAK · döngü değişkeninin ömrü. for (int i = 0; ...) başlığında tanımlanan i sadece döngünün içinde yaşar. Döngüden sonra System.out.println(i); yazarsan cannot find symbol hatası alırsın. Değeri sonra lazımsa i’yi döngüden önce tanımla.

do-while döngüsü

int z = 100;
do {
    System.out.println("runs once");
} while (z < 0);
int x = 10;
do {
    System.out.print(x + " ");
    x -= 4;
} while (x > 0);
System.out.println("end " + x);
runs once
10 6 2 end -2

Koşul sonda kontrol edildiği için gövde en az bir kez çalışır. Menü göstermek ya da kullanıcıdan geçerli bir değer gelene kadar tekrar sormak için idealdir. Sondaki while (...) satırından sonra ; var; unutma.

DöngüKoşul ne zaman?En az turTipik kullanım
whilebaşta0bitiş anı belirsiz
forbaşta0tur sayısı belli
do-whilesonda1menü, girdi doğrulama

break ve continue

for (int k = 1; k <= 5; k++) { if (k == 3) continue; System.out.print(k + " "); }
System.out.println();
for (int k = 1; k <= 5; k++) { if (k == 3) break; System.out.print(k + " "); }
System.out.println();
int w = 0;
while (w < 5) {
    w++;
    if (w % 2 == 0) continue;
    System.out.print(w + " ");
}
1 2 4 5 
1 2 
1 3 5 
  • break: içinde bulunduğu döngüden hemen çıkar. Altındaki satırlar ve kalan turlar çalışmaz.
  • continue: bu turun geri kalanını atlar ve bir sonraki tura geçer. for’da önce güncelleme (k++) yapılır, sonra koşul kontrol edilir.

TUZAK · while içinde continue. while’da güncelleme continue’dan sonra yazılmışsa hiç çalışmaz ve sonsuz döngü olur. Yukarıdaki örnekte w++ en başta olduğu için güvenli.

Basamak ayıklama kalıbı

% 10 son basamağı verir, / 10 son basamağı siler. Basamak toplamı, basamak sayısı ve ters çevirme aynı iskeletle yazılır:

int n = 4823, ds = 0, dc = 0;
while (n > 0) {
    ds += n % 10;    // son basamağı topla
    dc++;            // basamak say
    n /= 10;         // son basamağı at
}
System.out.println(ds + " " + dc);
int num = 1234, rev = 0;
while (num > 0) {
    rev = rev * 10 + num % 10;
    num /= 10;
}
System.out.println(rev);
17 4
4321

İç içe döngüler ve desenler

Dış döngü satırları, iç döngü o satırdaki karakterleri yönetir. İç döngü dışın her turunda baştan sona tamamen döner. İç döngü bitince System.out.println() ile alt satıra geçilir; bu satır iç döngünün dışında, dış döngünün içinde olmalı.

for (int r = 1; r <= 3; r++) {
    for (int col = 1; col <= 4; col++) System.out.print("*");
    System.out.println();
}
for (int r = 1; r <= 2; r++)
    for (int col = 1; col <= 3; col++)
        System.out.print(r + "" + col + " ");
****
****
****
11 12 13 21 22 23 

İç döngü sabit sayıda dönüyorsa toplam tur = dış × iç (2 × 3 = 6). İç döngünün sınırı dış değişkene bağlıysa her dış tur için ayrı say ve topla.

Desen formülleri

i satır numarası (1’den başlar), n toplam satır:

DesenBoşlukYıldız
Sol üçgen0i
Ters üçgen0n - i + 1
Sağa yaslı üçgenn - ii
Piramitn - i2 * i - 1
int rows = 4;
for (int r = 1; r <= rows; r++) {                         // sol üçgen
    for (int j = 1; j <= r; j++) System.out.print("*");
    System.out.println();
}
for (int r = 1; r <= rows; r++) {                         // sağa yaslı
    for (int s = 1; s <= rows - r; s++) System.out.print(" ");
    for (int j = 1; j <= r; j++) System.out.print("*");
    System.out.println();
}
for (int r = 1; r <= rows; r++) {                         // piramit
    for (int s = 1; s <= rows - r; s++) System.out.print(" ");
    for (int j = 1; j <= 2 * r - 1; j++) System.out.print("*");
    System.out.println();
}
*
**
***
****
   *
  **
 ***
****
   *
  ***
 *****
*******

Desen sorusunda önce bir tablo kur: her satır için boşluk ve yıldız sayısını yaz, i ile ilişkiyi bul, sonra döngü sınırlarına dök.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
for (i = 0; i <= 5; i++) 5 tur6 tur; <= son değeri dahil eder
Döngü bitince i son yazılan değerdirBir adım fazlası: koşulu bozan değer
do-while koşul false ise hiç çalışmazEn az bir kez çalışır
continue döngüyü bitirirSadece o turu atlar
İç döngüdeki break dış döngüyü de bitirirSadece iç döngüyü
for (...); sonra { } döngü gövdesi; gövdedir, blok bir kez çalışır
println iç döngünün içineDış döngünün içine, iç döngüden sonra
İç içe döngüde tur = dış × iç her zamanİç sınır dışa bağlıysa tur tur say
while’da i++’yı unutmak sorun değilSonsuz döngü

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

What is printed?

int n = 2, sum = 0;
while (n <= 12) {
    sum += n;
    n += 4;
}
System.out.println("n=" + n + " sum=" + sum);
Cevabı göster
n=14 sum=18

İz tablosu (trace table):
n=2: 2 <= 12 T → sum = 2, n = 6
n=6: T → sum = 8, n = 10
n=10: T → sum = 18, n = 14
n=14: 14 <= 12 F → çık.
Döngüden sonra n 14'tür, 10 değil.

Soru 2orta

What is printed?

for (int i = 1; i <= 10; i++) {
    if (i % 4 == 0) continue;
    if (i == 7) break;
    System.out.print(i + " ");
}
Cevabı göster
1 2 3 5 6

i = 4'te 4 % 4 == 0 → continue, bu tur atlanır (yazılmaz). i = 7'de break → döngü tamamen biter; 8, 9, 10'a hiç gelinmez.

Soru 3orta

What is printed?

for (int i = 4; i >= 1; i--) {
    for (int j = i; j <= 4; j++) System.out.print(j);
    System.out.println();
}
Cevabı göster
4
34
234
1234

Dış döngü i = 4, 3, 2, 1. İç döngü j'yi i'den 4'e kadar yazar. i = 4 → "4", i = 3 → "34", i = 2 → "234", i = 1 → "1234". Her satırdan sonra println.

Soru 4zor

What is printed?

int count = 0;
for (int i = 0; i < 4; i++)
    for (int j = i; j < 5; j++)
        count++;
System.out.println("count = " + count);
Cevabı göster
count = 14

İç döngü i'den başladığı için tur sayısı her i'de değişir: i = 0 → 5 tur, i = 1 → 4, i = 2 → 3, i = 3 → 2. Toplam 5 + 4 + 3 + 2 = 14. "4 × 5 = 20" tuzağına düşme.

Soru 5orta

What is printed?

int x = 10;
do {
    System.out.print(x + " ");
    x -= 4;
} while (x > 0);
System.out.println("end " + x);
Cevabı göster
10 6 2 end -2

do-while önce gövdeyi çalıştırır, koşulu sonda kontrol eder. 10 yaz → x = 6 (T), 6 yaz → x = 2 (T), 2 yaz → x = -2 (F) → çık. println aynı satıra end -2 ekler.

Soru 6kolay

What is printed?

int y = 10;
while (y < 5) System.out.println("while body");
do { System.out.println("do-while body"); } while (y < 5);
Cevabı göster
do-while body

while koşulu baştan false: gövde hiç çalışmaz (0 tur). do-while gövdeyi önce bir kez çalıştırır, sonra koşula bakar: en az 1 tur.

Soru 7orta

What is printed?

int m = 50, steps = 0;
while (m != 1) {
    if (m % 2 == 0) m /= 2;
    else m = 3 * m + 1;
    steps++;
    if (steps == 4) break;
}
System.out.println(m + " " + steps);
Cevabı göster
19 4

50 çift → 25 (steps 1). 25 tek → 76 (2). 76 → 38 (3). 38 → 19 (4), steps == 4 → break. m = 19, steps = 4.

Soru 8orta

What is printed?

for (int k = 5; k >= 1; k -= 2) {
    for (int j = 1; j <= k; j++) System.out.print("#");
    System.out.println();
}
Cevabı göster
#####
###
#

Dış döngü k = 5, 3, 1 (her seferinde 2 azalır, -1'de durur). Her satırda k tane #.

Soru 9zor

What is printed?

int p = 0;
for (int k = 1; k <= 3; k++) {
    for (int j = 1; j <= 3; j++) {
        if (j == 2) break;
        p += k * j;
    }
}
System.out.println(p);
Cevabı göster
6

break sadece içinde bulunduğu döngüyü (iç döngü) bitirir. Her k için iç döngü sadece j = 1'de çalışır: p += k. p = 1 + 2 + 3 = 6. Dış döngü normal devam eder.

Soru 10zor

What is printed?

int e = 0;
for (int k = 0; k < 5; k++);
{ e++; }
System.out.println(e);
Cevabı göster
1

for satırının sonundaki ; döngünün gövdesidir: döngü 5 kez boş döner. Alttaki { e++; } döngüye ait değil, bir kez çalışır. Sonuç 1, 5 değil.

Soru 11orta

Write a static method countDivisors(int n) that returns how many positive divisors n has. Example: countDivisors(12) returns 6 (1, 2, 3, 4, 6, 12).

Cevabı göster
for (int i = 1; i <= n; i++) if (n % i == 0) count++;

Sayaç kalıbı: sayacı 0'la başlat, döngüde koşulu kontrol et, uyuyorsa artır, sonda döndür.public static int countDivisors(int n) { int count = 0; for (int i = 1; i <= n; i++) { if (n % i == 0) count++; } return count;}Test: countDivisors(12) → 6, countDivisors(7) → 2 (asal), countDivisors(1) → 1.

Soru 12zor

Write a static void method printInverted(int n) that prints an inverted left-aligned triangle of stars with n rows (first row has n stars, last row has 1).

Cevabı göster
inner loop: for (int j = 1; j <= n - i + 1; j++)

Dış döngü satırlar (i = 1..n), iç döngü o satırdaki yıldızlar. i. satırda n - i + 1 yıldız var.public static void printInverted(int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n - i + 1; j++) { System.out.print("*"); } System.out.println(); }}printInverted(3) çıktısı: üç satır, sırayla 3, 2, 1 yıldız. Alternatif: dış döngüyü for (int i = n; i >= 1; i--) yazıp iç döngüde j <= i kullanmak.

Doğrulama: Tüm çıktılar JDK 26 ile çalıştırıldı (verify/SEN1001/W04.java ve W04b.java). Desen çıktılarındaki boşluklar cat -A ile karakter karakter kontrol edildi. Scope hatası verify/SEN1001/err/Scope.java javac ile alındı.

Deftere not kartı

while (koşul) { ... güncelle; } 0 veya daha çok tur, koşul BAŞTA for (int i = 1; i <= n; i++) { } tur sayısı biliniyorsa do { ... } while (koşul); EN AZ 1 tur, koşul SONDA, sonda ; var for sırası: başlat → koşul → gövde → güncelle → koşul → ... Tur sayısı: i=0;i<n → n i=1;i<=n → n i=0;i<=n → n+1 Döngüden sonra sayaç: for (i=1;i<=5;i++) bitince i = 6 break → içinde olduğu döngüden çık continue → turu atla (for'da güncelleme yapılır) İç içe break sadece İÇ döngüyü bitirir for (...); while (...); → sondaki ; boş gövde Basamak: while (n > 0) { d = n % 10; ... n /= 10; } ters: rev = rev*10 + n%10 İç içe: dış = satır, iç = sütun, iç bitince println() Sol üçgen j<=i Ters j<=n-i+1 Sağa yaslı: n-i boşluk + i yıldız Piramit: n-i boşluk + 2i-1 İç döngü sabitse toplam = dış × iç; dış değişkene bağlıysa tur tur topla for'da tanımlanan i döngü dışında YOK (cannot find symbol)