Bölüm 8: Döngüler

Bilgisayar ve Programlamaya Giriş
forwhiledo-whileİç içeÖrnekler
Sercan KÜLCÜ · Giresun Üniversitesi

Giriş

Öğrenme Çıktıları

Döngü

for, while ve do-while yapılarını seçmek.

Kalıplar

Sayaç ve biriktirici ile hesap yapmak.

İç içe

İç içe döngülerle satır-sütun desenleri üretmek.

İzleme

Döngüyü sınır değerlerle adım adım doğrulamak.

Döngüler

Döngünün Bileşenleri

  • İlk değer verme: döngüden önce bir kez kurulan durum.
  • Koşul: her turdan önce (do-while’da sonra) sorulur; false ise çıkılır.
  • Gövde: her turda yapılan iş.
  • Güncelleme: koşulu sona yaklaştırır; unutulursa döngü bitmez.
Bu dört renk bölüm boyunca aynı anlamda kullanılır.
ilk değer vermesayac = 1sayac <= n ?koşulgövdeisi yapgüncellemesayac++truetekrarfalsesonraki deyim

Döngüler

for Döngüsü

int n = 4;
int toplam = 0;
for (int i = 1; i <= n; i++) {
    toplam += i;
}
System.out.println(toplam);

ilk değer vermekoşulgövdegüncelleme

  • Tekrar sayısı belli olduğunda for uygundur; dört parça tek satırda toplanır.
  • Sıra: ilk değer verme → koşul → gövde → güncelleme → koşul …
  • i yalnızca döngü içinde tanımlıdır.
ilk değer vermeint i = 1i <= nkoşulgövdetoplam += igüncellemei++truetekrarfalseprintln(toplam)

Döngüler · Kodu adım adım çalıştır

Kod İzleme: for ile 1 + 2 + 3 + 4

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4

n = 4: 1’den 4’e kadar toplayacağız.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam0

Biriktirici toplam = 0 ile başlar (henüz hiçbir sayı eklenmedi).

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam0i1

İlk değer verme: int i = 1 yalnızca bir kez çalışır.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam0i1

Koşul: i <= n → 1 <= 4 → true → gövdeye gir.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam1i1

Gövde: toplam = 0 + 1 = 1.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam1i2

Güncelleme: i++ → i = 2. Sonra yine koşula dönülür.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam1i2

Koşul: i <= n → 2 <= 4 → true → gövdeye gir.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam3i2

Gövde: toplam = 1 + 2 = 3.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam3i3

Güncelleme: i++ → i = 3. Sonra yine koşula dönülür.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam3i3

Koşul: i <= n → 3 <= 4 → true → gövdeye gir.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam6i3

Gövde: toplam = 3 + 3 = 6.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam6i4

Güncelleme: i++ → i = 4. Sonra yine koşula dönülür.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam6i4

Koşul: i <= n → 4 <= 4 → true → gövdeye gir.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam10i4

Gövde: toplam = 6 + 4 = 10.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam10i5

Güncelleme: i++ → i = 5. Sonra yine koşula dönülür.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam10i5

Koşul: i <= n → 5 <= 4 → false → döngü biter.

int i = 1ilk değer vermei <= nkoşultoplam += igövdei++güncellemetruetekrar (koşula dön)falseprintln(toplam)döngüden sonran4toplam10

Döngüden sonra println 10 yazar. i artık yok: kapsamı döngüydü. Gövde 4 kez, koşul 5 kez çalıştı.

int n = 4;
int toplam = 0;
for (int i = 1; i <= n; i++) {
    toplam += i;
}
System.out.println(toplam);

Döngüler

for Döngüsünün Esnek Biçimleri

BaşlıkÇalışma
for (int i = 0, j = 9; i < j; i++, j--)i ve j birlikte: (0,9) … (4,5), 5 tur
for (int i = 0; i <= 10; i += 2)0 2 4 6 8 10
for (int i = 5; i >= 1; i--)geri sayım: 5 4 3 2 1
int k = 0;
for (;;) {            // üç bölüm de boş: koşul true sayılır
    k++;
    if (k == 3) break;  // çıkış koşulu şart
}
System.out.println(k);   // 3
  • İlk değer verme, koşul ve güncelleme bölümlerinin her biri isteğe bağlıdır.
  • İlk değer verme bölümünde aynı tipte birden çok değişken, güncellemede virgülle birden çok ifade yazılabilir.

Döngüler

++i ile i++ Farkı

for (int i = 0; i < 3; i++) System.out.print(i + " ");   // 0 1 2
for (int i = 0; i < 3; ++i) System.out.print(i + " ");   // 0 1 2

for’un güncelleme bölümünde ifadenin değeri kullanılmaz; ikisi de yalnızca i’yi 1 artırır, fark yoktur.

Başlangıçİfadesonuçsonra
a = 5b = a++b = 5a = 6
a = 5b = ++ab = 6a = 6
idx = 0d[idx++]10idx = 1
idx = 0d[++idx]20idx = 1
  • i++ önce eski değeri verir, sonra artırır; ++i önce artırır, sonra yeni değeri verir.
  • Tabloda d = {10, 20, 30}; fark yalnızca değer kullanıldığında ortaya çıkar. Okunabilirlik için sayaçta i++ yazın.

Döngüler

while Döngüsü

int sayi = 5;
int faktoriyel = 1;
while (sayi > 1) {
    faktoriyel *= sayi;
    sayi--;
}
System.out.println(faktoriyel);

ilk değer vermekoşulgövdegüncelleme

  • Koşul gövdeden önce kontrol edilir.
  • Başlangıçta false ise gövde hiç çalışmaz.
  • İlk değer verme döngüden önce, güncelleme gövdenin içinde yazılır.
ilk değer vermesayi = 5faktoriyel = 1sayi > 1koşulgövdefaktoriyel *= sayigüncellemesayi--truetekrarfalseprintln(faktoriyel)

Döngüler · Kodu adım adım çalıştır

Kod İzleme: while ile 5!

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi5

İlk değer verme: sayi = 5 (5! hesaplanacak).

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi5faktoriyel1

Çarpım biriktiricisi 1 ile başlar (0 olsaydı sonuç hep 0 olurdu).

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi5faktoriyel1

Koşul: 5 > 1 → true → gövde çalışır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi5faktoriyel5

faktoriyel = 1 × 5 = 5.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi4faktoriyel5

Güncelleme: sayi-- → 4. Koşul sona yaklaşır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi4faktoriyel5

Koşul: 4 > 1 → true → gövde çalışır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi4faktoriyel20

faktoriyel = 5 × 4 = 20.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi3faktoriyel20

Güncelleme: sayi-- → 3. Koşul sona yaklaşır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi3faktoriyel20

Koşul: 3 > 1 → true → gövde çalışır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi3faktoriyel60

faktoriyel = 20 × 3 = 60.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi2faktoriyel60

Güncelleme: sayi-- → 2. Koşul sona yaklaşır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi2faktoriyel60

Koşul: 2 > 1 → true → gövde çalışır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi2faktoriyel120

faktoriyel = 60 × 2 = 120.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi1faktoriyel120

Güncelleme: sayi-- → 1. Koşul sona yaklaşır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi1faktoriyel120

Koşul: 1 > 1 → false → döngüden çıkılır.

sayi = 5faktoriyel = 1ilk değer vermesayi > 1koşulfaktoriyel *= sayigövdesayi--güncellemetruetekrar (koşula dön)falseprintln(faktoriyel)döngüden sonrasayi1faktoriyel120

120 yazılır: 5 × 4 × 3 × 2 = 120. Gövde 4 kez çalıştı; 1 ile çarpmaya gerek yok.

int sayi = 5;
int faktoriyel = 1;
while (sayi > 1) {
    faktoriyel *= sayi;
    sayi--;
}
System.out.println(faktoriyel);

Döngüler

do-while Döngüsü

Scanner klavye = new Scanner(System.in);
int secim;
do {
  System.out.print("Seçim (1/0): ");
  secim = klavye.nextInt();
  if (secim == 1)
    System.out.println("Merhaba!");
} while (secim != 0);
System.out.println("Güle güle");

ilk değer vermekoşulgövdegüncelleme

  • Koşul gövdeden sonra kontrol edilir → gövde en az bir kez çalışır.
  • Menü ve girdi doğrulama için doğal seçimdir.
  • while (…); sonundaki noktalı virgül unutulmamalı.
ilk değer vermeint secim;gövdemenuyu yazgüncellemesecim = nextInt()secim != 0koşultruefalseprintln("Güle güle")

Döngüler · Kodu adım adım çalıştır

Kod İzleme: do-while menüsü (girdi 1, 2, 0)

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim?klavye1 2 0

Klavyeden okumak için Scanner (dosya başında import java.util.Scanner;). Kullanıcı sırayla 1, 2, 0 yazacak.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim?klavye1 2 0

secim bildirildi ama değeri yok; koşul ilk kez gövdeden sonra sorulacağı için sorun olmaz.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim?klavye1 2 0

1. tur: koşula bakmadan gövdeye girilir, menü yazılır.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim1klavye2 0

Kullanıcı 1 yazar → secim = 1.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim1klavye2 0

secim == 1 → true: «Merhaba!» yazılır.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim1klavye2 0

Koşul: 1 != 0 → true → başa dön.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim1klavye2 0

2. tur: koşula bakmadan gövdeye girilir, menü yazılır.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim2klavye0

Kullanıcı 2 yazar → secim = 2.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim2klavye0

secim == 1 → false: hiçbir şey yapılmaz.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim2klavye0

Koşul: 2 != 0 → true → başa dön.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim2klavye0

3. tur: koşula bakmadan gövdeye girilir, menü yazılır.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim0klavye—

Kullanıcı 0 yazar → secim = 0.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim0klavye—

secim == 1 → false: hiçbir şey yapılmaz.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim0klavye—

Koşul: 0 != 0 → false → döngü biter.

int secim;ilk değer vermeprint("Seçim…")if (secim == 1) …gövdesecim = nextInt()güncellemesecim != 0koşultrue → tekrarfalseprintln("Güle güle")döngüden sonrasecim0klavye—

Gövde 3 kez çalıştı; koşul da 3 kez soruldu (while’da gövde sayısından bir fazla sorulurdu).

Scanner klavye = new Scanner(System.in);
int secim;
do {
  System.out.print("Seçim (1/0): ");
  secim = klavye.nextInt();
  if (secim == 1)
    System.out.println("Merhaba!");
} while (secim != 0);
System.out.println("Güle güle");

Döngüler

Döngü Seçimi

DurumTercih
1’den n’ye say, n kez tekrarlafor
Sayı 0 olana kadar basamak işlewhile
Menü göster, geçerli girdi gelene kadar sordo-while
Kullanıcı “0” yazana kadar toplawhile / do-while

Üçü de birbirine çevrilebilir; seçim okunabilirlik içindir.

Tekrar sayısıönceden belli mi?evetforhayırEn az bir kezçalışmalı mı?evethayırdo-whilewhile

Dallanma

break ve continue

for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) continue;
    if (i == 8) break;
    System.out.print(i + " ");
}
System.out.println("| bitti");
  • continue: turun kalanını atlar, güncellemeye (i++) geçer.
  • break: en yakın döngüyü hemen bitirir.
  • Aşırı kullanım akışı izlemeyi zorlaştırır.
i <= 10 ?i % 3 == 0 ?i == 8 ?print(i)i++continuebreakdöngü sonu

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

Kod İzleme: break ve continue

1i2i3i4i5i6i7i8i9i10i

i = 1: 1 % 3 = 1 → false; 1 == 8 → false. İki kontrol de geçildi.

1iyazıldı2i3i4i5i6i7i8i9i10i

1 yazılır.

1iyazıldı2i3i4i5i6i7i8i9i10i

i = 2: 2 % 3 = 2 → false; 2 == 8 → false. İki kontrol de geçildi.

1iyazıldı2iyazıldı3i4i5i6i7i8i9i10i

2 yazılır.

1iyazıldı2iyazıldı3icontinue4i5i6i7i8i9i10i

i = 3: 3 % 3 == 0 → true → continue: print atlanır, doğrudan i++.

1iyazıldı2iyazıldı3icontinue4i5i6i7i8i9i10i

i = 4: 4 % 3 = 1 → false; 4 == 8 → false. İki kontrol de geçildi.

1iyazıldı2iyazıldı3icontinue4iyazıldı5i6i7i8i9i10i

4 yazılır.

1iyazıldı2iyazıldı3icontinue4iyazıldı5i6i7i8i9i10i

i = 5: 5 % 3 = 2 → false; 5 == 8 → false. İki kontrol de geçildi.

1iyazıldı2iyazıldı3icontinue4iyazıldı5iyazıldı6i7i8i9i10i

5 yazılır.

1iyazıldı2iyazıldı3icontinue4iyazıldı5iyazıldı6icontinue7i8i9i10i

i = 6: 6 % 3 == 0 → true → continue: print atlanır, doğrudan i++.

1iyazıldı2iyazıldı3icontinue4iyazıldı5iyazıldı6icontinue7i8i9i10i

i = 7: 7 % 3 = 1 → false; 7 == 8 → false. İki kontrol de geçildi.

1iyazıldı2iyazıldı3icontinue4iyazıldı5iyazıldı6icontinue7iyazıldı8i9i10i

7 yazılır.

1iyazıldı2iyazıldı3icontinue4iyazıldı5iyazıldı6icontinue7iyazıldı8ibreak9i10i

i = 8: 8 % 3 = 2 → false; 8 == 8 → true → break: döngü burada biter, 9 ve 10’a hiç gelinmez.

1iyazıldı2iyazıldı3icontinue4iyazıldı5iyazıldı6icontinue7iyazıldı8ibreak9i10i

Döngü break ile bitti; akış döngüden sonraki satırdan sürer.

for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) continue;
    if (i == 8) break;
    System.out.print(i + " ");
}
System.out.println("| bitti");

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

Etiketli break dis: iki döngüden birden çık

i = 1, j = 1: 1·1 = 1 ≠ 4, 1 1 yazılır.

j = 2: 1·2 = 2 ≠ 4 → 1 2 yazılır.

j = 3: 1·3 = 3 ≠ 4 → 1 3 yazılır; iç döngü biter.

i = 2; iç döngü yeniden başlar: j = 1, 2·1 = 2 ≠ 4 → 2 1 yazılır.

i = 2, j = 2: 2·2 = 4 → break dis. Yazdırmadan her iki döngüden birden çıkılır; i = 3 hiç denenmez.

Etiketli break dış döngünün ardındaki satıra atlar: bitti yazılır. Çıktı: 4 sayı satırı + bitti.

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

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

Karşılaştırma: düz break yalnızca iç döngüyü bitirir

i = 1: j = 1, 2, 3 için 1·j ≠ 4; 1 1, 1 2, 1 3 yazılır.

i = 2, j = 1: 2·1 = 2 ≠ 4 → 2 1 yazılır.

i = 2, j = 2: 2·2 = 4 → düz break yalnızca iç döngüyü bitirir; dış döngü devam eder.

i++ → 3; iç döngü yeniden başlar: j = 1 → 3 1 yazılır.

j = 2 ve j = 3: 3·2 = 6, 3·3 = 9 ≠ 4 → 3 2 ve 3 3 yazılır.

Dış döngü de biter, bitti yazılır. Düz break ile 7 sayı satırı, etiketli break ile 4 sayı satırı çıktı.

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

Döngüler

Sonsuz Döngü

-3-2-10123456i < 5hedef: i ≥ 5i-- : hedeften uzaklaşırfor (int i = 0; i < 5; i--) → i = 0, −1, −2, … koşul hep truewhile (i < 5) { … } // i++ yok → i hep 0
  • Koşul hiçbir zaman false olmuyorsa döngü bitmez: program “donmuş” görünür.
  • Not: i-- ile int sınırı aşılırsa değer sarar ve döngü yaklaşık 2,1 milyar turdan sonra biter; pratikte sonsuz sayılır.
  • Sayaç yanlış yönde güncellenmiş ya da hiç güncellenmemiş olabilir.
  • Kasıtlı while (true) döngülerinde de içeride bir break koşulu olmalıdır. Takılırsa programı Ctrl+C ile durdurun.

Döngüler · Kodu adım adım çalıştır

double Sayaç Tuzağı: x += 0.1

Başlangıç: n = 0. Amaç 0,1’er artıp 10 tur dönmek.

x = 0.0, koşul 0.0 < 1.0 → true.

Gövde: n = 1.

Güncelleme: x = 0.1. 0,1 ikili tabanda tam gösterilemez; küçük hatalar birikir.

10. turun sonu (arada 8 tur atlandı): n = 10, x = 0.8999999999999999.

Güncelleme: x = 0.9999999999999999, tam 1.0 değil. Koşul true: döngü bir tur fazla döner.

11. tur: n = 11.

x = 1.0999999999999999, koşul false → döngü biter.

11 yazılır; beklenen 10 idi.

int n = 0;
for (double x = 0; x < 1.0; x += 0.1) {
    n++;
}
System.out.println(n);

x != 1.0 yazılsaydı x hiçbir zaman tam 1.0 olmayacağından döngü bitmezdi. Gerçek sayılarda sayaç yerine int kullanın.

Doğrulama

Döngü Değişmezi

  • Her turun başında doğru kalan bir özelliktir.
  • Toplam döngüsünde: toplam = 1 + 2 + … + (i − 1).
  • Döngü bitince (i = n + 1) değişmez, sonucun doğru olduğunu söyler.
1234turun başı: i = 1toplam = 0= (boş toplam)

Başlangıçta hiçbir sayı işlenmedi: toplam = 0 (boş toplam). Değişmez baştan doğru.

1234turun başı: i = 2toplam = 1= 1

i = 2 turunun başında toplam, 1 … 1 sayılarının toplamı: 1.

1234turun başı: i = 3toplam = 3= 1 + 2

i = 3 turunun başında toplam, 1 … 2 sayılarının toplamı: 3.

1234turun başı: i = 4toplam = 6= 1 + 2 + 3

i = 4 turunun başında toplam, 1 … 3 sayılarının toplamı: 6.

1234turun başı: i = 5toplam = 10= 1 + 2 + 3 + 4

i = 5 → koşul false. Değişmez hâlâ doğru: toplam = 1 + 2 + 3 + 4 = 10 → sonuç doğru.

Doğrulama

Sınır Hataları (1’den 5’e say)

for (i = 1; i <= 5; i++)-2-101✓2✓3✓4✓5✓6doğru: 5 turfor (i = 1; i < 5; i++)✓✓✓✓bir eksik: 5 işlenmezfor (i = 0; i <= 5; i++)!✓✓✓✓✓bir fazla: 6 turfor (i = 1; i <= 5; i--)!!!✓…yanlış yön: pratikte sonsuz
  • < ile <=, 0 ile 1 başlangıcı arasındaki fark bir tur eksik/fazla demektir (“off-by-one”).
  • Test: ilk turu, son turu ve tur sayısını elle kontrol edin.

Doğrulama · Kodu adım adım çalıştır

Sınır Hatası Denetimi: i < 5 → 5 tur

Başlangıç: i = 0, sayac = 0. Koşul 0 < 5 → true.

Tur 1: i = 0 yazılır, sayac = 1 olur.

Tur 2: i = 1 yazılır, sayac = 2 olur.

Tur 3: i = 2 yazılır, sayac = 3 olur.

Tur 4: i = 3 yazılır, sayac = 4 olur.

Tur 5: i = 4 yazılır, sayac = 5 olur.

i++ → 5; 5 < 5 → false, döngü biter. Tam 5 tur: i = 0…4.

int sayac = 0;
for (int i = 0; i < 5; i++) {
    System.out.print(i + " ");
    sayac++;
}
System.out.println("| tur: " + sayac);

Doğrulama · Kodu adım adım çalıştır

Sınır Hatası: i <= 5 → 6 tur

Başlangıç: i = 0, sayac = 0. Koşul 0 <= 5 → true.

Tur 1: i = 0 yazılır, sayac = 1 olur.

Tur 2: i = 1 yazılır, sayac = 2 olur.

Tur 3: i = 2 yazılır, sayac = 3 olur.

Tur 4: i = 3 yazılır, sayac = 4 olur.

Tur 5: i = 4 yazılır, sayac = 5 olur.

Tur 6: i = 5 yazılır, sayac = 6 olur.

i++ → 6; 6 <= 5 → false. <= yüzünden fazladan bir tur döndü: sayac = 6, beklenen 5 değil.

int sayac = 0;
for (int i = 0; i <= 5; i++) {
    System.out.print(i + " ");
    sayac++;
}
System.out.println("| tur: " + sayac);

Örnek

Basamak Sayısı

int sayi = -507;
long kalan = sayi;
if (kalan < 0) kalan = -kalan;
int basamak = 0;
do {
    basamak++;
    kalan /= 10;
} while (kalan > 0);
System.out.println(basamak);
kalanbasamak5070/ 10tur 1+1501/ 10tur 2+152/ 10tur 3+103kalan > 0 false → dursonuç: 3 basamak
  • Her / 10 son basamağı atar; kaç kez bölündüğünü sayarız.
  • do-while sayesinde 0 da 1 basamak sayılır; ayrı bir özel durum gerekmez.
  • long kopya, -2147483648 gibi uç değerde işaret değiştirirken taşmayı önler.

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

Kod İzleme: basamak sayısı (sayi = −507)

−507sayi = -507sayi-507basamak–

Negatif bir sayıyla deneyelim: sayi = −507.

−507kalan = -507sayi-507basamak–

int değer long’a kopyalanır (−2147483648’in tersi int’e sığmaz, long’a sığar).

507kalan = 507sayi-507basamak–

−507 < 0 → true → kalan = 507. İşaret basamak sayısını değiştirmez.

507kalan = 507sayi-507basamak0

Sayaç basamak = 0.

507kalan = 507sayi-507basamak1

Gövde: bir basamak sayıldı → basamak = 1.

507kalan = 50sayi-507basamak1

kalan = 507 / 10 = 50 (tam sayı bölmesi son basamağı atar).

507kalan = 50sayi-507basamak1

Koşul: 50 > 0 → true → tekrar.

507kalan = 50sayi-507basamak2

Gövde: bir basamak sayıldı → basamak = 2.

507kalan = 5sayi-507basamak2

kalan = 50 / 10 = 5 (tam sayı bölmesi son basamağı atar).

507kalan = 5sayi-507basamak2

Koşul: 5 > 0 → true → tekrar.

507kalan = 5sayi-507basamak3

Gövde: bir basamak sayıldı → basamak = 3.

507kalan = 0sayi-507basamak3

kalan = 5 / 10 = 0 (tam sayı bölmesi son basamağı atar).

507kalan = 0sayi-507basamak3

Koşul: 0 > 0 → false → bitti.

507kalan = 0sayi-507basamak3

3 yazılır. sayi = 0 olsaydı do-while gövdeyi yine bir kez çalıştırır → 1 basamak (doğru).

int sayi = -507;
long kalan = sayi;
if (kalan < 0) kalan = -kalan;
int basamak = 0;
do {
    basamak++;
    kalan /= 10;
} while (kalan > 0);
System.out.println(basamak);

Örnek

Rakamlar Toplamı

int sayi = 725;
long kalan = sayi;
if (kalan < 0) kalan = -kalan;
int toplam = 0;
while (kalan > 0) {
    toplam += (int) (kalan % 10);
    kalan /= 10;
}
System.out.println(toplam);
kalan% 10toplam7255+5/ 10722+7/ 1077+14/ 100kalan > 0 false → dur7 + 2 + 5 = 14
  • % 10 son rakamı verir.
  • / 10 işlenen son rakamı sayıdan çıkarır.
  • Burada while yeterli: 0 için gövde hiç çalışmaz, toplam 0 kalır (doğru).

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

Kod İzleme: rakamlar toplamı (sayi = 725)

725sayi = 725toplam–

Rakamları 7, 2 ve 5 olan sayı: 725.

725kalan = 725toplam–

Üzerinde çalışmak için kopya: kalan = 725.

725kalan = 725toplam–

725 < 0 → false: işaret değişmez.

725kalan = 725toplam0

Biriktirici toplam = 0.

725kalan = 725toplam0

Koşul: 725 > 0 → true.

725kalan = 725% 10 → 5toplam5

Son rakam 725 % 10 = 5; toplam = 0 + 5 = 5.

725kalan = 72toplam5

kalan = 725 / 10 = 72: işlenen rakam atıldı.

725kalan = 72toplam5

Koşul: 72 > 0 → true.

725kalan = 72% 10 → 2toplam7

Son rakam 72 % 10 = 2; toplam = 5 + 2 = 7.

725kalan = 7toplam7

kalan = 72 / 10 = 7: işlenen rakam atıldı.

725kalan = 7toplam7

Koşul: 7 > 0 → true.

725kalan = 7% 10 → 7toplam14

Son rakam 7 % 10 = 7; toplam = 7 + 7 = 14.

725kalan = 0toplam14

kalan = 7 / 10 = 0: işlenen rakam atıldı.

725kalan = 0toplam14

Koşul: 0 > 0 → false.

725kalan = 0toplam14

14 yazılır: 7 + 2 + 5 = 14. sayi değişmedi, yalnızca kopyası (kalan) tüketildi.

int sayi = 725;
long kalan = sayi;
if (kalan < 0) kalan = -kalan;
int toplam = 0;
while (kalan > 0) {
    toplam += (int) (kalan % 10);
    kalan /= 10;
}
System.out.println(toplam);

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

Sayıyı Ters Çevirme ve Palindrom (1221)

1221sayi = 1221ters–

Rakamları tersten okununca da aynı kalan sayıya palindrom denir. Deneyelim: 1221.

1221kalan = 1221ters0

Kopya üzerinde çalışılır; ters sayı 0’dan kurulacak.

1221kalan = 1221ters0

Koşul: 1221 > 0 → true.

1221kalan = 1221% 10 → 1ters1

rakam = 1221 % 10 = 1; ters = 0 × 10 + 1 = 1 (eski rakamlar bir basamak sola kayar).

1221kalan = 122ters1

kalan = 1221 / 10 = 122.

1221kalan = 122ters1

Koşul: 122 > 0 → true.

1221kalan = 122% 10 → 2ters12

rakam = 122 % 10 = 2; ters = 1 × 10 + 2 = 12 (eski rakamlar bir basamak sola kayar).

1221kalan = 12ters12

kalan = 122 / 10 = 12.

1221kalan = 12ters12

Koşul: 12 > 0 → true.

1221kalan = 12% 10 → 2ters122

rakam = 12 % 10 = 2; ters = 12 × 10 + 2 = 122 (eski rakamlar bir basamak sola kayar).

1221kalan = 1ters122

kalan = 12 / 10 = 1.

1221kalan = 1ters122

Koşul: 1 > 0 → true.

1221kalan = 1% 10 → 1ters1221

rakam = 1 % 10 = 1; ters = 122 × 10 + 1 = 1221 (eski rakamlar bir basamak sola kayar).

1221kalan = 0ters1221

kalan = 1 / 10 = 0.

1221kalan = 0ters1221

Koşul: 0 > 0 → false.

1221kalan = 0ters1221

Ters sayı 1221 yazılır.

1221kalan = 0ters1221

1221 == 1221 → true: 1221 bir palindromdur. (123 için ters 321 olur → false.)

int sayi = 1221;
int kalan = sayi, ters = 0;
while (kalan > 0) {
    int rakam = kalan % 10;
    ters = ters * 10 + rakam;
    kalan /= 10;
}
System.out.println(ters);
System.out.println(ters == sayi);  // palindrom mu?

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

Armstrong Sayısı: 153 = 1³ + 5³ + 3³

153sayi = 153toplam–

Armstrong sayısı: rakamlarının (basamak sayısı kadar) kuvvetleri toplamı kendisine eşit. 153 üç basamaklı → küpler.

153kalan = 153toplam0

kalan = 153, toplam = 0.

153kalan = 153toplam0

Koşul: 153 > 0 → true.

153kalan = 1533³ = 27toplam27

r = 3; toplam = 0 + 3×3×3 = 27.

153kalan = 15toplam27

kalan /= 10 → 15.

153kalan = 15toplam27

Koşul: 15 > 0 → true.

153kalan = 155³ = 125toplam152

r = 5; toplam = 27 + 5×5×5 = 152.

153kalan = 1toplam152

kalan /= 10 → 1.

153kalan = 1toplam152

Koşul: 1 > 0 → true.

153kalan = 11³ = 1toplam153

r = 1; toplam = 152 + 1×1×1 = 153.

153kalan = 0toplam153

kalan /= 10 → 0.

153kalan = 0toplam153

Koşul: 0 > 0 → false.

153kalan = 0toplam153

1 + 125 + 27 = 153 → true. Diğer 3 basamaklı Armstrong sayıları: 370, 371, 407.

int sayi = 153;
int kalan = sayi, toplam = 0;
while (kalan > 0) {
    int r = kalan % 10;
    toplam += r * r * r;   // 3 basamak: küp
    kalan /= 10;
}
System.out.println(toplam == sayi);

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

Mükemmel Sayı: 28

1234567891011121314toplam = 0

Mükemmel sayı: kendisi hariç bölenlerinin toplamı kendisine eşit (6 = 1 + 2 + 3). 28’i deneyelim.

1234567891011121314toplam = 0

Bölenler toplamı 0’dan başlar. n’nin kendisi hariç en büyük böleni en fazla n / 2 = 14.

1bölen234567891011121314toplam = 1

i = 1: 28 % 1 = 0 → bölen, toplam = 1.

1bölen2bölen34567891011121314toplam = 1 + 2 = 3

i = 2: 28 % 2 = 0 → bölen, toplam = 3.

1bölen2bölen34567891011121314toplam = 1 + 2 = 3

i = 3: 28 % 3 = 1 → bölmüyor.

1bölen2bölen34bölen567891011121314toplam = 1 + 2 + 4 = 7

i = 4: 28 % 4 = 0 → bölen, toplam = 7.

1bölen2bölen34bölen567891011121314toplam = 1 + 2 + 4 = 7

i = 5: 28 % 5 = 3 → bölmüyor.

1bölen2bölen34bölen567891011121314toplam = 1 + 2 + 4 = 7

i = 6: 28 % 6 = 4 → bölmüyor.

1bölen2bölen34bölen567bölen891011121314toplam = 1 + 2 + 4 + 7 = 14

i = 7: 28 % 7 = 0 → bölen, toplam = 14.

1bölen2bölen34bölen567bölen891011121314toplam = 1 + 2 + 4 + 7 = 14

i = 8: 28 % 8 = 4 → bölmüyor.

1bölen2bölen34bölen567bölen891011121314toplam = 1 + 2 + 4 + 7 = 14

i = 9: 28 % 9 = 1 → bölmüyor.

1bölen2bölen34bölen567bölen891011121314toplam = 1 + 2 + 4 + 7 = 14

i = 10: 28 % 10 = 8 → bölmüyor.

1bölen2bölen34bölen567bölen891011121314toplam = 1 + 2 + 4 + 7 = 14

i = 11: 28 % 11 = 6 → bölmüyor.

1bölen2bölen34bölen567bölen891011121314toplam = 1 + 2 + 4 + 7 = 14

i = 12: 28 % 12 = 4 → bölmüyor.

1bölen2bölen34bölen567bölen891011121314toplam = 1 + 2 + 4 + 7 = 14

i = 13: 28 % 13 = 2 → bölmüyor.

1bölen2bölen34bölen567bölen891011121314bölentoplam = 1 + 2 + 4 + 7 + 14 = 28

i = 14: 28 % 14 = 0 → bölen, toplam = 28.

1bölen2bölen34bölen567bölen891011121314bölentoplam = 1 + 2 + 4 + 7 + 14 = 28

i = 15 <= 14 → false: döngü biter.

1bölen2bölen34bölen567bölen891011121314bölentoplam = 1 + 2 + 4 + 7 + 14 = 28

1 + 2 + 4 + 7 + 14 = 28 → true. Sonraki mükemmel sayılar: 496, 8128.

int n = 28;
int toplam = 0;
for (int i = 1; i <= n / 2; i++) {
    if (n % i == 0) toplam += i;
}
System.out.println(toplam == n);

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

Onluktan İkiliye Çevirme: 13 → 1101

bölmekalan (bit)bitler aşağıdan yukarı okunurikili–basamak–

13’ü ikiliye çevireceğiz: sürekli 2’ye bölüp kalanları topluyoruz.

bölmekalan (bit)bitler aşağıdan yukarı okunurikili0basamak1

ikili sonucu ondalık rakamlarla (1 ve 0) kuracağız; basamak = 1 birler basamağı.

bölmekalan (bit)bitler aşağıdan yukarı okunurikili0basamak1

Koşul: 13 > 0 → true.

bölmekalan (bit)13 / 2 = 61← bitbitler aşağıdan yukarı okunurikili1basamak1

13 % 2 = 1 → ikili += 1 × 1 → 1.

bölmekalan (bit)13 / 2 = 61bitler aşağıdan yukarı okunurikili1basamak10

Sonraki bit bir basamak solda: basamak = 10; n = n / 2 = 6.

bölmekalan (bit)13 / 2 = 61bitler aşağıdan yukarı okunurikili1basamak10

Koşul: 6 > 0 → true.

bölmekalan (bit)13 / 2 = 616 / 2 = 30← bitbitler aşağıdan yukarı okunurikili1basamak10

6 % 2 = 0 → ikili += 0 × 10 → 1.

bölmekalan (bit)13 / 2 = 616 / 2 = 30bitler aşağıdan yukarı okunurikili1basamak100

Sonraki bit bir basamak solda: basamak = 100; n = n / 2 = 3.

bölmekalan (bit)13 / 2 = 616 / 2 = 30bitler aşağıdan yukarı okunurikili1basamak100

Koşul: 3 > 0 → true.

bölmekalan (bit)13 / 2 = 616 / 2 = 303 / 2 = 11← bitbitler aşağıdan yukarı okunurikili101basamak100

3 % 2 = 1 → ikili += 1 × 100 → 101.

bölmekalan (bit)13 / 2 = 616 / 2 = 303 / 2 = 11bitler aşağıdan yukarı okunurikili101basamak1000

Sonraki bit bir basamak solda: basamak = 1000; n = n / 2 = 1.

bölmekalan (bit)13 / 2 = 616 / 2 = 303 / 2 = 11bitler aşağıdan yukarı okunurikili101basamak1000

Koşul: 1 > 0 → true.

bölmekalan (bit)13 / 2 = 616 / 2 = 303 / 2 = 111 / 2 = 01← bitbitler aşağıdan yukarı okunurikili1101basamak1000

1 % 2 = 1 → ikili += 1 × 1000 → 1101.

bölmekalan (bit)13 / 2 = 616 / 2 = 303 / 2 = 111 / 2 = 01bitler aşağıdan yukarı okunurikili1101basamak10000

Sonraki bit bir basamak solda: basamak = 10000; n = n / 2 = 0.

bölmekalan (bit)13 / 2 = 616 / 2 = 303 / 2 = 111 / 2 = 01bitler aşağıdan yukarı okunurikili1101basamak10000

Koşul: 0 > 0 → false.

bölmekalan (bit)13 / 2 = 616 / 2 = 303 / 2 = 111 / 2 = 01bitler aşağıdan yukarı okunurikili1101basamak10000

1101 yazılır: 1·8 + 1·4 + 0·2 + 1·1 = 13. (Büyük sayılarda int taşar; sonuç String ile kurulabilir.)

int n = 13;
int ikili = 0, basamak = 1;
while (n > 0) {
    ikili += (n % 2) * basamak;
    basamak *= 10;
    n /= 2;
}
System.out.println(ikili);   // 1101

Örnek

Üs Alma

int taban = 2, us = 4;
int sonuc = 1;
for (int i = 0; i < us; i++) {
    sonuc *= taban;
}
System.out.println(sonuc);
1×2i=02×2i=14×2i=28×2i=316sonuci = 4: 4 < 4 false → dur2 × 2 × 2 × 2 = 16
  • Döngü tam üs kez çalışır; her tur bir kez tabanla çarpar.
  • us = 0 ise döngü hiç çalışmaz, sonuç 1 kalır (2⁰ = 1).
  • Negatif üsleri kapsamaz; büyük sonuçlar int sınırını aşar.

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

Kod İzleme: 2⁴

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4

2⁴ hesaplanacak: taban = 2, us = 4.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc1

Çarpımın etkisiz elemanı 1: sonuc = 1 (= 2⁰).

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc1i0

İlk değer verme: i = 0. Döngü üs kez (0, 1, 2, 3) dönecek.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc1i0

Koşul: 0 < 4 → true.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc2i0

sonuc = 1 × 2 = 2 (= 21).

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc2i1

Güncelleme: i = 1.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc2i1

Koşul: 1 < 4 → true.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc4i1

sonuc = 2 × 2 = 4 (= 22).

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc4i2

Güncelleme: i = 2.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc4i2

Koşul: 2 < 4 → true.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc8i2

sonuc = 4 × 2 = 8 (= 23).

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc8i3

Güncelleme: i = 3.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc8i3

Koşul: 3 < 4 → true.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc16i3

sonuc = 8 × 2 = 16 (= 24).

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc16i4

Güncelleme: i = 4.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc16i4

Koşul: 4 < 4 → false.

int i = 0ilk değer vermei < uskoşulsonuc *= tabangövdei++güncellemetruetekrar (koşula dön)falseprintln(sonuc)döngüden sonrataban2us4sonuc16

16 yazılır. Değişmez: her turun başında sonuc = 2i.

int taban = 2, us = 4;
int sonuc = 1;
for (int i = 0; i < us; i++) {
    sonuc *= taban;
}
System.out.println(sonuc);

Örnek

Asal Sayı

int n = 29;
boolean asal = n >= 2;
for (int i = 2; asal && i <= n / i; i++) {
    if (n % i == 0) asal = false;
}
System.out.println(asal);
i29 % ii ≤ 29/i212≤14323≤9414≤7545≤56—6≤4false → durhiçbir kalan 0 değil → asal = true
  • 0 ve 1 asal değildir: asal = n >= 2.
  • Bölen aramak için √n’e kadar gitmek yeter: i <= n / i ≡ i × i ≤ n (taşma riski yok).
  • asal && sayesinde bölen bulununca döngü durur.

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

Kod İzleme: 29 asal mı?

2i3i4i5i6ibölen adayların29asal?

n = 29 asal mı?

2i3i4i5i6ibölen adayların29asaltrue

29 >= 2 → true. Aksi kanıtlanana kadar asal kabul ediyoruz.

2i29 / 2 = 143i4i5i6ibölen adayların29asaltrue

Başlangıç: ilk bölen adayı i = 2.

2i29 / 2 = 143i4i5i6ibölen adayların29asaltrue

Koşul: true && 2 <= 29/2 = 14 → true.

2i29 % 2 = 13i4i5i6ibölen adayların29asaltrue

29 % 2 = 1 → bölmüyor.

2i29 % 2 = 13i29 / 3 = 94i5i6ibölen adayların29asaltrue

Güncelleme: i = 3.

2i29 % 2 = 13i29 / 3 = 94i5i6ibölen adayların29asaltrue

Koşul: true && 3 <= 29/3 = 9 → true.

2i29 % 2 = 13i29 % 3 = 24i5i6ibölen adayların29asaltrue

29 % 3 = 2 → bölmüyor.

2i29 % 2 = 13i29 % 3 = 24i29 / 4 = 75i6ibölen adayların29asaltrue

Güncelleme: i = 4.

2i29 % 2 = 13i29 % 3 = 24i29 / 4 = 75i6ibölen adayların29asaltrue

Koşul: true && 4 <= 29/4 = 7 → true.

2i29 % 2 = 13i29 % 3 = 24i29 % 4 = 15i6ibölen adayların29asaltrue

29 % 4 = 1 → bölmüyor.

2i29 % 2 = 13i29 % 3 = 24i29 % 4 = 15i29 / 5 = 56ibölen adayların29asaltrue

Güncelleme: i = 5.

2i29 % 2 = 13i29 % 3 = 24i29 % 4 = 15i29 / 5 = 56ibölen adayların29asaltrue

Koşul: true && 5 <= 29/5 = 5 → true.

2i29 % 2 = 13i29 % 3 = 24i29 % 4 = 15i29 % 5 = 46ibölen adayların29asaltrue

29 % 5 = 4 → bölmüyor.

2i29 % 2 = 13i29 % 3 = 24i29 % 4 = 15i29 % 5 = 46i29 / 6 = 4bölen adayların29asaltrue

Güncelleme: i = 6.

2i29 % 2 = 13i29 % 3 = 24i29 % 4 = 15i29 % 5 = 46ibölen adayların29asaltrue

Koşul: true && 6 <= 29/6 = 4 → false: √29’i geçtik, daha büyük bölen aramaya gerek yok.

2i29 % 2 = 13i29 % 3 = 24i29 % 4 = 15i29 % 5 = 46ibölen adayların29asaltrue

true yazılır. 4 bölen denendi.

int n = 29;
boolean asal = n >= 2;
for (int i = 2; asal && i <= n / i; i++) {
    if (n % i == 0) asal = false;
}
System.out.println(asal);

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

Kod İzleme (devam): 21 asal mı?

2i3i4i5i6ibölen adayların21asal?

n = 21 asal mı?

2i3i4i5i6ibölen adayların21asaltrue

21 >= 2 → true. Aksi kanıtlanana kadar asal kabul ediyoruz.

2i21 / 2 = 103i4i5i6ibölen adayların21asaltrue

Başlangıç: ilk bölen adayı i = 2.

2i21 / 2 = 103i4i5i6ibölen adayların21asaltrue

Koşul: true && 2 <= 21/2 = 10 → true.

2i21 % 2 = 13i4i5i6ibölen adayların21asaltrue

21 % 2 = 1 → bölmüyor.

2i21 % 2 = 13i21 / 3 = 74i5i6ibölen adayların21asaltrue

Güncelleme: i = 3.

2i21 % 2 = 13i21 / 3 = 74i5i6ibölen adayların21asaltrue

Koşul: true && 3 <= 21/3 = 7 → true.

2i21 % 2 = 13i21 % 3 = 04i5i6ibölen adayların21asalfalse

21 % 3 = 0 → bölen bulundu: asal = false.

2i21 % 2 = 13i21 % 3 = 04i5i6ibölen adayların21asalfalse

Güncelleme: i = 4.

2i21 % 2 = 13i21 % 3 = 04i5i6ibölen adayların21asalfalse

Koşul: asal = false → && kısa devre yapar, i <= n / i hiç hesaplanmaz → döngü biter.

2i21 % 2 = 13i21 % 3 = 04i5i6ibölen adayların21asalfalse

false yazılır. Bölen bulunur bulunmaz döngü durdu.

int n = 21;
boolean asal = n >= 2;
for (int i = 2; asal && i <= n / i; i++) {
    if (n % i == 0) asal = false;
}
System.out.println(asal);

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

1’den n’ye Asal Sayıları Listeleme (n = 20)

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

2’den 20’ye her k için asal testi (iç döngü) yapılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 2: iç döngü hiç çalışmaz (2 > k / 2) → asal = true → yazılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 3: iç döngü hiç çalışmaz (2 > k / 2) → asal = true → yazılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 4: 4 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 5: 2 … 2 arasında bölen yok → asal = true → yazılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 6: 6 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 7: 2 … 2 arasında bölen yok → asal = true → yazılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 8: 8 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 9: 9 % 3 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 10: 10 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 11: 2 … 3 arasında bölen yok → asal = true → yazılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 12: 12 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 13: 2 … 3 arasında bölen yok → asal = true → yazılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 14: 14 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 15: 15 % 3 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 16: 16 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 17: 2 … 4 arasında bölen yok → asal = true → yazılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 18: 18 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 19: 2 … 4 arasında bölen yok → asal = true → yazılır.

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 20: 20 % 2 = 0 → asal = false, break (iç döngü erken biter).

234567891011121314151617181920yeşil = asal, soluk = bileşik, kesikli = henüz bakılmadı

k = 21 > 20: bitti. 2..20 arasında 8 asal var. (Eratosthenes eleği daha hızlıdır.)

int n = 20;
for (int k = 2; k <= n; k++) {
    boolean asal = true;
    for (int i = 2; i <= k / i; i++) {
        if (k % i == 0) { asal = false; break; }
    }
    if (asal) System.out.print(k + " ");
}

Örnek

Fibonacci Dizisi

int adet = 5;
long a = 0, b = 1;
for (int i = 0; i < adet; i++) {
    System.out.print(a + " ");
    long sonraki = a + b;
    a = b;
    b = sonraki;
}
a (yazdırılır)bi=00112358i=10112358i=20112358i=30112358i=40112358çıktı: 0 1 1 2 3
  • Her terim önceki ikisinin toplamı: 0 1 1 2 3 5 8 …
  • Güncelleme sırası iki önceki değeri korur; b = sonraki önce yazılsaydı eski b kaybolurdu.
  • Dizi hızlı büyür; long bile 93. terimden sonra taşar.

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

Kod İzleme: ilk 5 Fibonacci sayısı

yazılan dizia–b–sonraki–

İlk 5 Fibonacci sayısı yazılacak.

yazılan dizia0b1sonraki–

Dizinin ilk iki terimi: a = 0, b = 1.

0yazılan dizia0b1sonraki–

i = 0 < 5 → true. Sıradaki terim a = 0 yazılır.

0yazılan dizia0b1sonraki1

sonraki = 0 + 1 = 1.

0yazılan dizia ← b ← sonrakia1b1sonraki1

Kaydırma: a = 1, b = 1. Sıra önemli: önce a = b, sonra b = sonraki. Sonra i++.

01yazılan dizia1b1sonraki–

i = 1 < 5 → true. Sıradaki terim a = 1 yazılır.

01yazılan dizia1b1sonraki2

sonraki = 1 + 1 = 2.

01yazılan dizia ← b ← sonrakia1b2sonraki2

Kaydırma: a = 1, b = 2. Sıra önemli: önce a = b, sonra b = sonraki. Sonra i++.

011yazılan dizia1b2sonraki–

i = 2 < 5 → true. Sıradaki terim a = 1 yazılır.

011yazılan dizia1b2sonraki3

sonraki = 1 + 2 = 3.

011yazılan dizia ← b ← sonrakia2b3sonraki3

Kaydırma: a = 2, b = 3. Sıra önemli: önce a = b, sonra b = sonraki. Sonra i++.

0112yazılan dizia2b3sonraki–

i = 3 < 5 → true. Sıradaki terim a = 2 yazılır.

0112yazılan dizia2b3sonraki5

sonraki = 2 + 3 = 5.

0112yazılan dizia ← b ← sonrakia3b5sonraki5

Kaydırma: a = 3, b = 5. Sıra önemli: önce a = b, sonra b = sonraki. Sonra i++.

01123yazılan dizia3b5sonraki–

i = 4 < 5 → true. Sıradaki terim a = 3 yazılır.

01123yazılan dizia3b5sonraki8

sonraki = 3 + 5 = 8.

01123yazılan dizia ← b ← sonrakia5b8sonraki8

Kaydırma: a = 5, b = 8. Sıra önemli: önce a = b, sonra b = sonraki. Sonra i++.

01123yazılan dizia5b8sonraki–

Koşul: 5 < 5 → false → döngü biter. Çıktı: 0 1 1 2 3.

int adet = 5;
long a = 0, b = 1;
for (int i = 0; i < adet; i++) {
    System.out.print(a + " ");
    long sonraki = a + b;
    a = b;
    b = sonraki;
}

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

Sayı Tahmin Oyunu (while + Random + Scanner)

1255075100olası aralık 1..100

Random rastgele sayı üretir (dosya başında import java.util.Random; ve java.util.Scanner).

1255075100olası aralık 1..100

Klavyeden okumak için Scanner.

1255075100olası aralık 1..100hedef = 37 (gizli)

nextInt(100) 0..99 verir, +1 ile 1..100. Bu çalıştırmada hedef = 37 çıktı (her çalıştırmada farklı).

1255075100olası aralık 1..100hedef = 37 (gizli)

tahmin = 0 hiçbir zaman hedef olamaz → döngüye kesin girilir.

1255075100olası aralık 1..100hedef = 37 (gizli)

Koşul: 0 != 37 → true.

1255075100olası aralık 1..100tahmin 50hedef = 37 (gizli)

Kullanıcı 50 yazar; deneme = 1.

1255075100olası aralık 1..49tahmin 50hedef = 37 (gizli)

50 > 37 → «Aşağı». Olası aralık 1..49. Her seferinde ortayı söylemek aralığı yarıya indirir.

1255075100olası aralık 1..49tahmin 50hedef = 37 (gizli)

Koşul: 50 != 37 → true.

1255075100olası aralık 1..49tahmin 25hedef = 37 (gizli)

Kullanıcı 25 yazar; deneme = 2.

1255075100olası aralık 26..49tahmin 25hedef = 37 (gizli)

25 < 37 → «Yukarı». Olası aralık 26..49.

1255075100olası aralık 26..49tahmin 25hedef = 37 (gizli)

Koşul: 25 != 37 → true.

1255075100olası aralık 26..49tahmin 37hedef = 37 (gizli)

Kullanıcı 37 yazar; deneme = 3.

1255075100olası aralık 37..37tahmin 37hedef = 37 (gizli)

37 ne küçük ne büyük: iki if de false, ileti yok.

1255075100olası aralık 37..37tahmin 37hedef = 37 (gizli)

Koşul: 37 != 37 → false → döngü biter.

1255075100olası aralık 37..37tahmin 37hedef = 37 (gizli)

Kaç tur süreceği baştan belli değil → while doğru seçim.

Random rnd = new Random();
Scanner klavye = new Scanner(System.in);
int hedef = rnd.nextInt(100) + 1;  // 1..100
int tahmin = 0, deneme = 0;
while (tahmin != hedef) {
  tahmin = klavye.nextInt();
  deneme++;
  if (tahmin < hedef) System.out.println("Yukarı");
  if (tahmin > hedef) System.out.println("Aşağı");
}
System.out.println(deneme + ". denemede bildin");

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

Bekçi Değer: while (true) + break, girdi 5, 3, 0

Girdi kuyruğu (klavyeden girilecek sayılar): 5, 3, 0. Koşul true olduğundan döngü kendiliğinden bitmez; çıkış break ile sağlanır.

nextInt() kuyruktan 5 okur. 5 == 0 → false, break çalışmaz.

toplam = 0 + 5 = 5. Döngü başa döner (true).

nextInt() → 3. 3 == 0 → false.

toplam = 5 + 3 = 8.

nextInt() → 0 (bekçi değer). 0 == 0 → true → break: döngüden çıkılır; 0 toplama eklenmez.

Toplam: 8 yazılır. Bekçi değer (sentinel) veri sonunu işaretler; kendisi veriye katılmaz.

Scanner sc = new Scanner(System.in);
int toplam = 0;
while (true) {
    int sayi = sc.nextInt();
    if (sayi == 0) break;
    toplam += sayi;
}
System.out.println("Toplam: " + toplam);

Döngüler

İç İçe Döngü

for (int satir = 0; satir < 3; satir++) {
  for (int sutun = 0; sutun < 4; sutun++) {
    System.out.printf("(%d,%d) ", satir, sutun);
  }
  System.out.println();
}
sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2(2,0)(2,1)(2,2)(2,3)dış döngü →satır seçeriç döngü →hücreleri gezer
  • İç döngü, dış döngünün her turunda baştan sona tamamlanır.
  • Gövde satır × sutun = 3 × 4 = 12 kez çalışır.

Döngüler · Kodu adım adım çalıştır

Kod İzleme: 3 × 4 ızgara

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)satır 1satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

Dış döngü satir = 0; iç döngü sutun = 0’dan başlar → (0,0).

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)satır 1satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 1 < 4 → true → (0,1) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)satır 1satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 2 < 4 → true → (0,2) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 3 < 4 → true → (0,3) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

sutun = 4 < 4 → false: iç döngü bitti. println satırı sonlandırır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

satir++ → satir = 1; iç döngü yeniden sutun = 0’dan başlar.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 1 < 4 → true → (1,1) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 2 < 4 → true → (1,2) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 3 < 4 → true → (1,3) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2dış döngü →satır seçeriç döngü →hücreleri gezer

sutun = 4 < 4 → false: iç döngü bitti. println satırı sonlandırır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2(2,0)dış döngü →satır seçeriç döngü →hücreleri gezer

satir++ → satir = 2; iç döngü yeniden sutun = 0’dan başlar.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2(2,0)(2,1)dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 1 < 4 → true → (2,1) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2(2,0)(2,1)(2,2)dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 2 < 4 → true → (2,2) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2(2,0)(2,1)(2,2)(2,3)dış döngü →satır seçeriç döngü →hücreleri gezer

sutun++ → 3 < 4 → true → (2,3) yazılır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2(2,0)(2,1)(2,2)(2,3)dış döngü →satır seçeriç döngü →hücreleri gezer

sutun = 4 < 4 → false: iç döngü bitti. println satırı sonlandırır.

sütun 0sütun 1sütun 2sütun 3satır 0(0,0)(0,1)(0,2)(0,3)satır 1(1,0)(1,1)(1,2)(1,3)satır 2(2,0)(2,1)(2,2)(2,3)dış döngü →satır seçeriç döngü →hücreleri gezer

satir = 3 < 3 → false: dış döngü de bitti. Toplam 3 × 4 = 12 printf.

for (int satir = 0; satir < 3; satir++) {
  for (int sutun = 0; sutun < 4; sutun++) {
    System.out.printf("(%d,%d) ", satir, sutun);
  }
  System.out.println();
}

Döngüler · Kodu adım adım çalıştır

Çarpım Tablosu (iç içe döngü, 3 × 3)

i \ jj = 1j = 2j = 3i = 11×1=1i = 2i = 3hücre (i, j) = i × j%4d: 4 karakter genişlik

Dış döngü i = 1; iç döngü j = 1’den başlar: 1 × 1 = 1.

i \ jj = 1j = 2j = 3i = 111×2=2i = 2i = 3hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 2: 1 × 2 = 2, 4 karakterlik alana sağa yaslı yazılır.

i \ jj = 1j = 2j = 3i = 1121×3=3i = 2i = 3hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 3: 1 × 3 = 3, 4 karakterlik alana sağa yaslı yazılır.

i \ jj = 1j = 2j = 3i = 1123i = 2i = 3hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 4 <= 3 → false; println ile satır biter.

i \ jj = 1j = 2j = 3i = 1123i = 22×1=2i = 3hücre (i, j) = i × j%4d: 4 karakter genişlik

Dış döngü i = 2; iç döngü j = 1’den başlar: 2 × 1 = 2.

i \ jj = 1j = 2j = 3i = 1123i = 222×2=4i = 3hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 2: 2 × 2 = 4, 4 karakterlik alana sağa yaslı yazılır.

i \ jj = 1j = 2j = 3i = 1123i = 2242×3=6i = 3hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 3: 2 × 3 = 6, 4 karakterlik alana sağa yaslı yazılır.

i \ jj = 1j = 2j = 3i = 1123i = 2246i = 3hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 4 <= 3 → false; println ile satır biter.

i \ jj = 1j = 2j = 3i = 1123i = 2246i = 33×1=3hücre (i, j) = i × j%4d: 4 karakter genişlik

Dış döngü i = 3; iç döngü j = 1’den başlar: 3 × 1 = 3.

i \ jj = 1j = 2j = 3i = 1123i = 2246i = 333×2=6hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 2: 3 × 2 = 6, 4 karakterlik alana sağa yaslı yazılır.

i \ jj = 1j = 2j = 3i = 1123i = 2246i = 3363×3=9hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 3: 3 × 3 = 9, 4 karakterlik alana sağa yaslı yazılır.

i \ jj = 1j = 2j = 3i = 1123i = 2246i = 3369hücre (i, j) = i × j%4d: 4 karakter genişlik

j = 4 <= 3 → false; println ile satır biter.

i \ jj = 1j = 2j = 3i = 1123i = 2246i = 3369hücre (i, j) = i × j%4d: 4 karakter genişlik

i = 4 <= 3 → false. Sınırları 10 yapınca klasik 10 × 10 çarpım tablosu çıkar.

for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        System.out.printf("%4d", i * j);
    }
    System.out.println();
}

Örnek

Desen Problemini Çözme

  1. Beklenen çıktıyı küçük bir n (ör. 4) için kareli kâğıda çizin.
  2. Her satırda kaç boşluk ve kaç karakter olduğunu tabloya dökün.
  3. Sayıları satır numarasıyla ilişkilendirin (3, 2, 1, 0 → n − satır).
  4. Dış döngü = satır; her parça için bir iç döngü.
1234boşlukyıldızsatır 1···*31satır 2··**22satır 3·***13satır 4****04n − satirsatir

Örnek

Artan Üçgen

int n = 4;
for (int satir = 1; satir <= n; satir++) {
    for (int sutun = 1; sutun <= satir; sutun++) {
        System.out.print("*");
    }
    System.out.println();
}
  • Satır r ise r yıldız yazılır.
  • İç döngünün üst sınırı dış döngü değişkenidir.
1234satır 1*satır 2**satır 3***satır 4****

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

Kod İzleme: artan üçgen (n = 4)

1234satır 1satır 2satır 3satır 4· = boşlukturuncu = imleç

n = 4 satırlık üçgen. Izgarada her hücre bir karakter.

1234satır 1*satır 2satır 3satır 4· = boşlukturuncu = imleç

satir = 1: iç döngü sutun = 1 … 1 → bu satıra 1 yıldız.

1234satır 1*satır 2satır 3satır 4· = boşlukturuncu = imleç

sutun = 2 <= 1 → false. println ile alt satıra geçilir.

1234satır 1*satır 2*satır 3satır 4· = boşlukturuncu = imleç

satir = 2: iç döngü sutun = 1 … 2 → bu satıra 2 yıldız.

1234satır 1*satır 2**satır 3satır 4· = boşlukturuncu = imleç

sutun = 2 <= 2 → true → *

1234satır 1*satır 2**satır 3satır 4· = boşlukturuncu = imleç

sutun = 3 <= 2 → false. println ile alt satıra geçilir.

1234satır 1*satır 2**satır 3*satır 4· = boşlukturuncu = imleç

satir = 3: iç döngü sutun = 1 … 3 → bu satıra 3 yıldız.

1234satır 1*satır 2**satır 3**satır 4· = boşlukturuncu = imleç

sutun = 2 <= 3 → true → *

1234satır 1*satır 2**satır 3***satır 4· = boşlukturuncu = imleç

sutun = 3 <= 3 → true → *

1234satır 1*satır 2**satır 3***satır 4· = boşlukturuncu = imleç

sutun = 4 <= 3 → false. println ile alt satıra geçilir.

1234satır 1*satır 2**satır 3***satır 4*· = boşlukturuncu = imleç

satir = 4: iç döngü sutun = 1 … 4 → bu satıra 4 yıldız.

1234satır 1*satır 2**satır 3***satır 4**· = boşlukturuncu = imleç

sutun = 2 <= 4 → true → *

1234satır 1*satır 2**satır 3***satır 4***· = boşlukturuncu = imleç

sutun = 3 <= 4 → true → *

1234satır 1*satır 2**satır 3***satır 4****· = boşlukturuncu = imleç

sutun = 4 <= 4 → true → *

1234satır 1*satır 2**satır 3***satır 4****· = boşlukturuncu = imleç

sutun = 5 <= 4 → false. println ile alt satıra geçilir.

1234satır 1*satır 2**satır 3***satır 4****· = boşlukturuncu = imleç

satir = 5 <= 4 → false: bitti. Toplam 1 + 2 + 3 + 4 = 10 yıldız.

int n = 4;
for (int satir = 1; satir <= n; satir++) {
  for (int sutun = 1; sutun <= satir; sutun++) {
    System.out.print("*");
  }
  System.out.println();
}

Örnek

Sağa Yaslı Üçgen

int n = 3;
for (int satir = 1; satir <= n; satir++) {
    for (int bosluk = 0; bosluk < n - satir; bosluk++)
        System.out.print(" ");
    for (int yildiz = 0; yildiz < satir; yildiz++)
        System.out.print("*");
    System.out.println();
}
  • Her satır boşluk bölümü ve karakter bölümünden oluşur.
  • Boşluk azalırken yıldız artar.
123satır 1··*satır 2·**satır 3***

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

Kod İzleme: sağa yaslı üçgen (n = 3)

123satır 1satır 2satır 3· = boşlukturuncu = imleç

n = 3. Her satır: önce n - satir boşluk, sonra satir yıldız.

123satır 1·satır 2satır 3· = boşlukturuncu = imleç

satir = 1: 2 boşluk gerekiyor. bosluk = 0 → ' ' yazılır.

123satır 1··satır 2satır 3· = boşlukturuncu = imleç

bosluk = 1 < 2 → ' ' yazılır.

123satır 1··*satır 2satır 3· = boşlukturuncu = imleç

Boşluklar bitti; 1 yıldız: yildiz = 0 → *

123satır 1··*satır 2satır 3· = boşlukturuncu = imleç

Satır tamam (her satır n = 3 karakter): println.

123satır 1··*satır 2·satır 3· = boşlukturuncu = imleç

satir = 2: 1 boşluk gerekiyor. bosluk = 0 → ' ' yazılır.

123satır 1··*satır 2·*satır 3· = boşlukturuncu = imleç

Boşluklar bitti; 2 yıldız: yildiz = 0 → *

123satır 1··*satır 2·**satır 3· = boşlukturuncu = imleç

yildiz = 1 < 2 → *

123satır 1··*satır 2·**satır 3· = boşlukturuncu = imleç

Satır tamam (her satır n = 3 karakter): println.

123satır 1··*satır 2·**satır 3· = boşlukturuncu = imleç

satir = 3: bosluk < 3 − 3 = 0 → false: bu satırda hiç boşluk yok.

123satır 1··*satır 2·**satır 3*· = boşlukturuncu = imleç

Boşluklar bitti; 3 yıldız: yildiz = 0 → *

123satır 1··*satır 2·**satır 3**· = boşlukturuncu = imleç

yildiz = 1 < 3 → *

123satır 1··*satır 2·**satır 3***· = boşlukturuncu = imleç

yildiz = 2 < 3 → *

123satır 1··*satır 2·**satır 3***· = boşlukturuncu = imleç

Satır tamam (her satır n = 3 karakter): println.

int n = 3;
for (int satir = 1; satir <= n; satir++) {
  for (int bosluk = 0; bosluk < n - satir; bosluk++)
    System.out.print(" ");
  for (int yildiz = 0; yildiz < satir; yildiz++)
    System.out.print("*");
  System.out.println();
}

Örnek

Satıra Göre Sayılar

DesenBoşlukKarakter
Artan üçgen0satır
Azalan üçgen0n - satır + 1
Sağa yaslın - satırsatır
Piramitn - satır2 × satır - 1
**********Artan üçgen**********Azalan üçgen**********Sağa yaslı****************Piramitn = 4 · kesikli kare: boşluk, dolu kare: karakter

Örnek

Sayı Üçgeni

int n = 4;
for (int satir = 1; satir <= n; satir++) {
    for (int deger = 1; deger <= satir; deger++) {
        System.out.print(deger + " ");
    }
    System.out.println();
}
  • Yazdırılan değer sütun değişkeninden gelir.
  • Aynı yapı karakter yerine sayı üretir.
1234satır 11satır 212satır 3123satır 41234

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

Kod İzleme: sayı üçgeni (n = 4)

1234satır 1satır 2satır 3satır 4· = boşlukturuncu = imleç

Her hücreye bir deger + " " (sayı ve boşluk) yazılır.

1234satır 11satır 2satır 3satır 4· = boşlukturuncu = imleç

satir = 1: değer 1’den 1’e kadar. deger = 1 → “1 ”

1234satır 11satır 2satır 3satır 4· = boşlukturuncu = imleç

deger = 2 <= 1 → false; println.

1234satır 11satır 21satır 3satır 4· = boşlukturuncu = imleç

satir = 2: değer 1’den 2’ye kadar. deger = 1 → “1 ”

1234satır 11satır 212satır 3satır 4· = boşlukturuncu = imleç

deger = 2 → “2 ” (yazılan sayı iç döngü değişkeni).

1234satır 11satır 212satır 3satır 4· = boşlukturuncu = imleç

deger = 3 <= 2 → false; println.

1234satır 11satır 212satır 31satır 4· = boşlukturuncu = imleç

satir = 3: değer 1’den 3’e kadar. deger = 1 → “1 ”

1234satır 11satır 212satır 312satır 4· = boşlukturuncu = imleç

deger = 2 → “2 ” (yazılan sayı iç döngü değişkeni).

1234satır 11satır 212satır 3123satır 4· = boşlukturuncu = imleç

deger = 3 → “3 ” (yazılan sayı iç döngü değişkeni).

1234satır 11satır 212satır 3123satır 4· = boşlukturuncu = imleç

deger = 4 <= 3 → false; println.

1234satır 11satır 212satır 3123satır 41· = boşlukturuncu = imleç

satir = 4: değer 1’den 4’e kadar. deger = 1 → “1 ”

1234satır 11satır 212satır 3123satır 412· = boşlukturuncu = imleç

deger = 2 → “2 ” (yazılan sayı iç döngü değişkeni).

1234satır 11satır 212satır 3123satır 4123· = boşlukturuncu = imleç

deger = 3 → “3 ” (yazılan sayı iç döngü değişkeni).

1234satır 11satır 212satır 3123satır 41234· = boşlukturuncu = imleç

deger = 4 → “4 ” (yazılan sayı iç döngü değişkeni).

1234satır 11satır 212satır 3123satır 41234· = boşlukturuncu = imleç

deger = 5 <= 4 → false; println.

int n = 4;
for (int satir = 1; satir <= n; satir++) {
  for (int deger = 1; deger <= satir; deger++) {
    System.out.print(deger + " ");
  }
  System.out.println();
}

Örnek

İçi Boş Kare

int n = 4;
for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    if (i == 0 || i == n - 1 || j == 0 || j == n - 1)
      System.out.print("*");
    else
      System.out.print(" ");
  }
  System.out.println();
}
  • Yalnızca ilk/son satır veya ilk/son sütun yıldızdır.
  • ||: dört koşuldan biri true ise yeter.
  • Diğer hücrelere boşluk yazılır; yoksa kare kayar.
0123i = 0****i = 1*··*i = 2*··*i = 3****

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

Kod İzleme: içi boş kare (n = 4)

0123i = 0i = 1i = 2i = 3· = boşlukturuncu = imleç

n = 4. Kenar: ilk/son satır (i = 0, 3) veya ilk/son sütun (j = 0, 3).

0123i = 0*i = 1i = 2i = 3· = boşlukturuncu = imleç

i = 0, j = 0: i == 0 → true → *

0123i = 0**i = 1i = 2i = 3· = boşlukturuncu = imleç

i = 0, j = 1: i == 0 → true → *

0123i = 0***i = 1i = 2i = 3· = boşlukturuncu = imleç

i = 0, j = 2: i == 0 → true → *

0123i = 0****i = 1i = 2i = 3· = boşlukturuncu = imleç

i = 0, j = 3: i == 0 → true → *

0123i = 0****i = 1i = 2i = 3· = boşlukturuncu = imleç

j = 4 < 4 → false; println.

0123i = 0****i = 1*i = 2i = 3· = boşlukturuncu = imleç

i = 1, j = 0: j == 0 → true → *

0123i = 0****i = 1*·i = 2i = 3· = boşlukturuncu = imleç

i = 1, j = 1: dört koşulun hepsi false → else → boşluk

0123i = 0****i = 1*··i = 2i = 3· = boşlukturuncu = imleç

i = 1, j = 2: dört koşulun hepsi false → else → boşluk

0123i = 0****i = 1*··*i = 2i = 3· = boşlukturuncu = imleç

i = 1, j = 3: j == 3 → true → *

0123i = 0****i = 1*··*i = 2i = 3· = boşlukturuncu = imleç

j = 4 < 4 → false; println.

int n = 4;
for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    if (i == 0 || i == n - 1 || j == 0 || j == n - 1)
      System.out.print("*");
    else
      System.out.print(" ");
  }
  System.out.println();
}

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

Kod İzleme (devam): satır 2 ve 3

0123i = 0****i = 1*··*i = 2*i = 3· = boşlukturuncu = imleç

i = 2, j = 0: j == 0 → true → *

0123i = 0****i = 1*··*i = 2*·i = 3· = boşlukturuncu = imleç

i = 2, j = 1: dört koşulun hepsi false → else → boşluk

0123i = 0****i = 1*··*i = 2*··i = 3· = boşlukturuncu = imleç

i = 2, j = 2: dört koşulun hepsi false → else → boşluk

0123i = 0****i = 1*··*i = 2*··*i = 3· = boşlukturuncu = imleç

i = 2, j = 3: j == 3 → true → *

0123i = 0****i = 1*··*i = 2*··*i = 3· = boşlukturuncu = imleç

j = 4 < 4 → false; println.

0123i = 0****i = 1*··*i = 2*··*i = 3*· = boşlukturuncu = imleç

i = 3, j = 0: i == 3 → true → *

0123i = 0****i = 1*··*i = 2*··*i = 3**· = boşlukturuncu = imleç

i = 3, j = 1: i == 3 → true → *

0123i = 0****i = 1*··*i = 2*··*i = 3***· = boşlukturuncu = imleç

i = 3, j = 2: i == 3 → true → *

0123i = 0****i = 1*··*i = 2*··*i = 3****· = boşlukturuncu = imleç

i = 3, j = 3: i == 3 → true → *

0123i = 0****i = 1*··*i = 2*··*i = 3****· = boşlukturuncu = imleç

j = 4 < 4 → false; println.

0123i = 0****i = 1*··*i = 2*··*i = 3****· = boşlukturuncu = imleç

i = 4 < 4 → false: kare tamam. 16 hücrenin 12’si kenar.

int n = 4;
for (int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    if (i == 0 || i == n - 1 || j == 0 || j == n - 1)
      System.out.print("*");
    else
      System.out.print(" ");
  }
  System.out.println();
}

Örnek

Sık Hatalar

  • println çağrısını iç döngüye koymak her karakteri ayrı satıra yazar.
  • < ve <= farkı bir eksik veya bir fazla karakter üretir.
  • Boşluğu yıldızdan sonra yazmak hizalamayı tersine çevirir.
  • Dış döngü değişkenini iç döngüde yanlış güncellemek akışı bozar.
doğru******println iç döngüde******

Örnek

Test Tasarımı

  • Her problem için normal bir değer seçin.
  • 0, 1, negatif ve üst sınıra yakın değerleri ayrı test edin.
  • Beklenen sonucu kodu çalıştırmadan hesaplayın.
  • Değişkenleri tur tur izleyerek ilk sapmayı bulun.
Basamak sayısı testisayıbeklenen
Normal40964
Sıfır01
Negatif−5073
Uç değer−214748364810

Özet

Bölüm Özeti

  • Her döngü ilk değer verme, koşul, gövde ve güncelleme parçalarından oluşur.
  • Tekrar sayısı belliyse for, koşul sürdükçe while, en az bir tur gerekiyorsa do-while seçilir.
  • Sayaç ve biriktirici kalıpları basamak, üs ve seri problemlerinde tekrar kullanılır.
  • İç içe döngüde dış döngü satırı, iç döngü satırdaki öğeleri üretir.
  • Rakam kalıbı (% 10, / 10): basamak sayısı, ters çevirme, palindrom, Armstrong; bölen kalıbı: asal ve mükemmel sayı.
  • Döngüler 0, 1 ve sınır değerleriyle elle izlenerek test edilmelidir.

Özet

Kontrol Soruları

  1. while ve do-while arasındaki temel fark nedir?
  2. break ile continue ne yapar?
  3. Rakamlar toplamında % 10 ve / 10 ne işe yarar?
  4. Artan üçgende iç döngünün üst sınırı neden satır değişkenidir?
  5. println iç döngüye yazılırsa çıktı nasıl değişir?

Özet

Alıştırmalar

  1. Klavyeden 0 girilene kadar sayı okuyup toplamlarını ve ortalamalarını yazan programı yazın (while).
  2. 1’den 100’e kadar 3’e ya da 5’e bölünen sayıların toplamını bulun (cevap: 2418).
  3. n satırlık piramit çizin: satır r’de n − r boşluk ve 2r − 1 yıldız (n = 4 için elle izleyin).
  4. Bir sayının faktöriyelini for ile hesaplayın; 13! neden int’e sığmaz, long ile deneyin.
  5. Kullanıcıdan 1–5 arası bir not alana kadar tekrar soran girdi doğrulamasını do-while ile yazın.
  6. 1..1000 arasındaki tüm Armstrong (3 basamaklı) ve mükemmel sayıları listeleyin.

Özet

Kaynaklar

Son

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