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.
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:
- Her turun başında koşulu yaz: T mi F mi? F olduğu anda döngü biter.
- Döngüden sonra sayacın değeri bir adım ilerdedir:
i <= 5bitince i = 6. - do-while en az bir kez çalışır, while hiç çalışmayabilir.
- break döngüyü bitirir, continue sadece o turu atlar.
- İç 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 sonraSystem.out.println(i);yazarsancannot find symbolhatası 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 tur | Tipik kullanım |
|---|---|---|---|
while | başta | 0 | bitiş anı belirsiz |
for | başta | 0 | tur sayısı belli |
do-while | sonda | 1 | menü, 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:
| Desen | Boşluk | Yıldız |
|---|---|---|
| Sol üçgen | 0 | i |
| Ters üçgen | 0 | n - i + 1 |
| Sağa yaslı üçgen | n - i | i |
| Piramit | n - i | 2 * 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üşünce | Doğrusu |
|---|---|
for (i = 0; i <= 5; i++) 5 tur | 6 tur; <= son değeri dahil eder |
Döngü bitince i son yazılan değerdir | Bir adım fazlası: koşulu bozan değer |
| do-while koşul false ise hiç çalışmaz | En az bir kez çalışır |
| continue döngüyü bitirir | Sadece o turu atlar |
| İç döngüdeki break dış döngüyü de bitirir | Sadece iç döngüyü |
for (...); sonra { } döngü gövdesi | ; gövdedir, blok bir kez çalışır |
| println iç döngünün içine | Dış 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ğil | Sonsuz döngü |
Kendini test et
Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.
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
İ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.
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
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.
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
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.
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
İç 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.
What is printed?
int x = 10;
do {
System.out.print(x + " ");
x -= 4;
} while (x > 0);
System.out.println("end " + x);Cevabı göster
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.
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
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.
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
50 çift → 25 (steps 1). 25 tek → 76 (2). 76 → 38 (3). 38 → 19 (4), steps == 4 → break. m = 19, steps = 4.
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 #.
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
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.
What is printed?
int e = 0;
for (int k = 0; k < 5; k++);
{ e++; }
System.out.println(e);Cevabı göster
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.
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
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.
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
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ı.