C
Bölüm 4: Döngüler ve Tekrarlayan İşlemler
Genel Bakış

Bölüm 4: Döngüler ve Tekrarlayan İşlemler

15 Haziran 2025
6 dk okuma süresi
donguler-tekrarlayan-islemler

Döngüler Nedir?

Döngüler, aynı kod bloğunu belirli koşullar altında tekrar tekrar çalıştırmamızı sağlayan yapılardır. Programlamada çok yaygın olan tekrarlayan işlemleri (örneğin bir listedeki her elemanı işlemek) verimli şekilde gerçekleştirmemizi sağlar.

for Döngüsü

Klasik for Döngüsü

// Temel yapı: for (başlangıç; koşul; artış)
for (let i = 0; i < 5; i++) {
    console.log('Sayı:', i);
}
// Çıktı: 0, 1, 2, 3, 4
 
// Geriye doğru sayma
for (let i = 10; i > 0; i--) {
    console.log('Geri sayım:', i);
}
 
// Farklı artış değerleri
for (let i = 0; i <= 20; i += 2) {
    console.log('Çift sayı:', i);
}
// Çıktı: 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20

Dizilerle for Döngüsü

let meyveler = ['elma', 'armut', 'muz', 'çilek', 'portakal'];
 
// Klasik yöntem
for (let i = 0; i < meyveler.length; i++) {
    console.log(`${i + 1}. meyve: ${meyveler[i]}`);
}
 
// İndeks ve değer birlikte
for (let i = 0; i < meyveler.length; i++) {
    let meyve = meyveler[i];
    let buyukHarf = meyve.toUpperCase();
    console.log(`${i}: ${meyve} -> ${buyukHarf}`);
}

for…of Döngüsü (ES6+)

let sayilar = [1, 2, 3, 4, 5];
 
// Değerleri doğrudan alma
for (let sayi of sayilar) {
    console.log('Sayı:', sayi);
}
 
// String karakterleri üzerinde
let kelime = 'JavaScript';
for (let harf of kelime) {
    console.log('Harf:', harf);
}
 
// Çok boyutlu diziler
let matris = [[1, 2], [3, 4], [5, 6]];
for (let satir of matris) {
    for (let eleman of satir) {
        console.log('Eleman:', eleman);
    }
}

for…in Döngüsü

// Obje özellikleri üzerinde
let kullanici = {
    isim: 'Furkan',
    yas: 25,
    sehir: 'İstanbul',
    email: '[email protected]'
};
 
for (let anahtar in kullanici) {
    console.log(`${anahtar}: ${kullanici[anahtar]}`);
}
 
// Dizi indeksleri üzerinde
let renkler = ['kırmızı', 'yeşil', 'mavi'];
for (let indeks in renkler) {
    console.log(`İndeks ${indeks}: ${renkler[indeks]}`);
}
Ipucu

Önemli Fark: for…of değerleri, for…in anahtarları/indeksleri döndürür. Diziler için genelde for…of tercih edilir.

while Döngüsü

Temel while Kullanımı

let sayac = 0;
 
while (sayac < 5) {
    console.log('Sayaç:', sayac);
    sayac++; // Artırmayı unutmayın!
}
 
// Koşullu while
let rastgeleSayi;
while (rastgeleSayi !== 5) {
    rastgeleSayi = Math.floor(Math.random() * 10) + 1;
    console.log('Denenen sayı:', rastgeleSayi);
}
console.log('5 bulundu!');

do…while Döngüsü

let kullaniciGirdisi;
 
// En az bir kez çalışır
do {
    kullaniciGirdisi = prompt('Çıkmak için "exit" yazın:');
    console.log('Girdiniz:', kullaniciGirdisi);
} while (kullaniciGirdisi !== 'exit');
 
// Sayı tahmin oyunu
let hedefSayi = Math.floor(Math.random() * 100) + 1;
let tahmin;
let denemeSayisi = 0;
 
do {
    tahmin = parseInt(prompt('1-100 arası bir sayı tahmin edin:'));
    denemeSayisi++;
    
    if (tahmin > hedefSayi) {
        alert('Daha küçük bir sayı deneyin');
    } else if (tahmin < hedefSayi) {
        alert('Daha büyük bir sayı deneyin');
    }
} while (tahmin !== hedefSayi);
 
alert(`Tebrikler! ${denemeSayisi} denemede bildiniz.`);

Döngü Kontrol Komutları

break Komutu

// Döngüyü tamamen sonlandırır
for (let i = 0; i < 10; i++) {
    if (i === 5) {
        break; // i = 5 olduğunda döngü durur
    }
    console.log(i); // 0, 1, 2, 3, 4
}
 
// İlk çift sayıyı bulma
let sayilar = [1, 3, 7, 4, 9, 6];
let ilkCiftSayi;
 
for (let sayi of sayilar) {
    if (sayi % 2 === 0) {
        ilkCiftSayi = sayi;
        break; // İlk çift sayıyı bulunca dur
    }
}
console.log('İlk çift sayı:', ilkCiftSayi); // 4

continue Komutu

// Mevcut iterasyonu atlar, döngü devam eder
for (let i = 0; i < 10; i++) {
    if (i % 2 === 0) {
        continue; // Çift sayıları atla
    }
    console.log('Tek sayı:', i); // 1, 3, 5, 7, 9
}
 
// Negatif sayıları atlama
let karısıkSayılar = [-2, 5, -1, 8, -3, 12];
for (let sayi of karısıkSayılar) {
    if (sayi < 0) {
        continue; // Negatif sayıları işleme
    }
    console.log('Pozitif sayı:', sayi); // 5, 8, 12
}

İç İçe Döngülerde Etiketler

// Çok boyutlu dizide arama
let matris = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];
 
let arananSayi = 5;
let bulundu = false;
 
// Etiket kullanımı
disSicak: for (let i = 0; i < matris.length; i++) {
    for (let j = 0; j < matris[i].length; j++) {
        if (matris[i][j] === arananSayi) {
            console.log(`Sayı bulundu: [${i}][${j}]`);
            bulundu = true;
            break disSicak; // Dış döngüyü de kır
        }
    }
}
 
if (!bulundu) {
    console.log('Sayı bulunamadı');
}

Modern Dizi Metodları

forEach Metodu

let isimler = ['Furkan', 'Ahmet', 'Ayşe', 'Mehmet'];
 
// Basit forEach
isimler.forEach(function(isim) {
    console.log('Merhaba', isim);
});
 
// Arrow function ile
isimler.forEach((isim, indeks) => {
    console.log(`${indeks + 1}. kişi: ${isim}`);
});
 
// Obje dizileri ile
let ogrenciler = [
    {isim: 'Ali', not: 85},
    {isim: 'Veli', not: 92},
    {isim: 'Ayşe', not: 78}
];
 
ogrenciler.forEach(ogrenci => {
    let durum = ogrenci.not >= 80 ? 'Geçti' : 'Kaldı';
    console.log(`${ogrenci.isim}: ${ogrenci.not} - ${durum}`);
});

map Metodu (Dönüştürme)

let sayilar = [1, 2, 3, 4, 5];
 
// Her elemanı 2 ile çarp
let ikiKatlari = sayilar.map(sayi => sayi * 2);
console.log(ikiKatlari); // [2, 4, 6, 8, 10]
 
// String dizisini büyük harfe çevir
let sehirler = ['istanbul', 'ankara', 'izmir'];
let buyukSehirler = sehirler.map(sehir => sehir.toUpperCase());
console.log(buyukSehirler); // ['ISTANBUL', 'ANKARA', 'IZMIR']
 
// Obje dönüştürme
let kullanicilar = [
    {isim: 'Furkan', yas: 25},
    {isim: 'Ahmet', yas: 30}
];
 
let tamIsimler = kullanicilar.map(kullanici => ({
    tamIsim: kullanici.isim,
    kategori: kullanici.yas >= 30 ? 'Yetişkin' : 'Genç'
}));
 
console.log(tamIsimler);

filter Metodu (Filtreleme)

let sayilar = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
 
// Çift sayıları filtrele
let ciftSayilar = sayilar.filter(sayi => sayi % 2 === 0);
console.log(ciftSayilar); // [2, 4, 6, 8, 10]
 
// 5'ten büyük sayılar
let buyukSayilar = sayilar.filter(sayi => sayi > 5);
console.log(buyukSayilar); // [6, 7, 8, 9, 10]
 
// Ürün filtreleme
let urunler = [
    {isim: 'Laptop', fiyat: 5000, kategori: 'elektronik'},
    {isim: 'Kitap', fiyat: 25, kategori: 'eğitim'},
    {isim: 'Telefon', fiyat: 3000, kategori: 'elektronik'},
    {isim: 'Kalem', fiyat: 5, kategori: 'kırtasiye'}
];
 
// Elektronik ürünler
let elektronikUrunler = urunler.filter(urun => urun.kategori === 'elektronik');
 
// 100 TL altı ürünler
let ucuzUrunler = urunler.filter(urun => urun.fiyat < 100);
 
console.log(elektronikUrunler);
console.log(ucuzUrunler);

reduce Metodu (Toplama/Birleştirme)

let sayilar = [1, 2, 3, 4, 5];
 
// Toplam hesaplama
let toplam = sayilar.reduce((acc, sayi) => acc + sayi, 0);
console.log('Toplam:', toplam); // 15
 
// En büyük sayıyı bulma
let enBuyuk = sayilar.reduce((max, sayi) => sayi > max ? sayi : max);
console.log('En büyük:', enBuyuk); // 5
 
// Obje dizisinden toplam hesaplama
let alisveris = [
    {urun: 'Ekmek', fiyat: 5},
    {urun: 'Süt', fiyat: 12},
    {urun: 'Peynir', fiyat: 45}
];
 
let toplamFiyat = alisveris.reduce((toplam, item) => toplam + item.fiyat, 0);
console.log('Toplam fiyat:', toplamFiyat); // 62
 
// Kelime sayma
let metin = 'bu bir test metni bu test';
let kelimeSayilari = metin.split(' ').reduce((sayilar, kelime) => {
    sayilar[kelime] = (sayilar[kelime] || 0) + 1;
    return sayilar;
}, {});
 
console.log(kelimeSayilari); // {bu: 2, bir: 1, test: 2, metni: 1}

Pratik Örnekler

Çarpım Tablosu

function carpimTablosu(sayi) {
    console.log(`${sayi} Çarpım Tablosu:`);
    console.log('='.repeat(20));
    
    for (let i = 1; i <= 10; i++) {
        let sonuc = sayi * i;
        console.log(`${sayi} x ${i} = ${sonuc}`);
    }
}
 
carpimTablosu(7);

Fibonacci Serisi

function fibonacci(n) {
    if (n <= 0) return [];
    if (n === 1) return [0];
    if (n === 2) return [0, 1];
    
    let seri = [0, 1];
    
    for (let i = 2; i < n; i++) {
        let sonrakiSayi = seri[i-1] + seri[i-2];
        seri.push(sonrakiSayi);
    }
    
    return seri;
}
 
console.log(fibonacci(10)); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

Öğrenci Not Sistemi

let ogrenciler = [
    {isim: 'Ali', notlar: [85, 90, 78, 92]},
    {isim: 'Veli', notlar: [76, 88, 82, 79]},
    {isim: 'Ayşe', notlar: [95, 87, 91, 89]},
    {isim: 'Fatma', notlar: [65, 70, 68, 72]}
];
 
function ogrenciRaporu(ogrenciler) {
    console.log('ÖĞRENCI NOT RAPORU');
    console.log('='.repeat(50));
    
    ogrenciler.forEach((ogrenci, indeks) => {
        // Ortalama hesaplama
        let toplam = ogrenci.notlar.reduce((sum, not) => sum + not, 0);
        let ortalama = toplam / ogrenci.notlar.length;
        
        // En yüksek ve en düşük not
        let enYuksek = Math.max(...ogrenci.notlar);
        let enDusuk = Math.min(...ogrenci.notlar);
        
        // Harf notu
        let harfNotu = ortalama >= 90 ? 'AA' :
                      ortalama >= 80 ? 'BB' :
                      ortalama >= 70 ? 'CC' :
                      ortalama >= 60 ? 'DD' : 'FF';
        
        console.log(`${indeks + 1}. ${ogrenci.isim}:`);
        console.log(`   Notlar: ${ogrenci.notlar.join(', ')}`);
        console.log(`   Ortalama: ${ortalama.toFixed(2)}`);
        console.log(`   En Yüksek: ${enYuksek}, En Düşük: ${enDusuk}`);
        console.log(`   Harf Notu: ${harfNotu}`);
        console.log('-'.repeat(30));
    });
    
    // Sınıf ortalaması
    let tumNotlar = ogrenciler.flatMap(ogrenci => ogrenci.notlar);
    let sinifOrtalamasi = tumNotlar.reduce((sum, not) => sum + not, 0) / tumNotlar.length;
    
    console.log(`Sınıf Ortalaması: ${sinifOrtalamasi.toFixed(2)}`);
}
 
ogrenciRaporu(ogrenciler);

Basit Envanter Sistemi

let envanter = [
    {id: 1, urun: 'Laptop', stok: 5, fiyat: 5000},
    {id: 2, urun: 'Mouse', stok: 25, fiyat: 150},
    {id: 3, urun: 'Klavye', stiyat: 8, fiyat: 300},
    {id: 4, urun: 'Monitor', stok: 0, fiyat: 2000}
];
 
function envanterRaporu(envanter) {
    console.log('ENVANTER RAPORU');
    console.log('='.repeat(60));
    
    let toplamDeger = 0;
    let tukenenUrunler = [];
    let azalanStoklar = [];
    
    envanter.forEach(item => {
        let urunDegeri = item.stok * item.fiyat;
        toplamDeger += urunDegeri;
        
        console.log(`${item.urun.padEnd(15)} | Stok: ${item.stok.toString().padStart(3)} | Fiyat: ${item.fiyat}₺ | Değer: ${urunDegeri}₺`);
        
        if (item.stok === 0) {
            tukenenUrunler.push(item.urun);
        } else if (item.stok < 10) {
            azalanStoklar.push(item.urun);
        }
    });
    
    console.log('='.repeat(60));
    console.log(`Toplam Envanter Değeri: ${toplamDeger}₺`);
    
    if (tukenenUrunler.length > 0) {
        console.log('⚠️  Tükenen Ürünler:', tukenenUrunler.join(', '));
    }
    
    if (azalanStoklar.length > 0) {
        console.log('🔻 Azalan Stoklar:', azalanStoklar.join(', '));
    }
}
 
envanterRaporu(envanter);

Pratik Egzersizler

Egzersiz 1: Asal Sayı Bulucu

function asalSayiBul(baslangic, bitis) {
    // 1. Verilen aralıktaki tüm asal sayıları bulun
    // 2. Asal sayıları bir dizide saklayın
    // 3. Toplamlarını hesaplayın
    // 4. Sonuçları rapor halinde döndürün
}
 
// Test: asalSayiBul(10, 50)

Egzersiz 2: Kelime Analizi

function kelimeAnalizi(metin) {
    // 1. Metindeki toplam kelime sayısı
    // 2. En uzun ve en kısa kelime
    // 3. Kelime sıklık tablosu
    // 4. Sesli harf sayısı
    // 5. Sonuçları obje olarak döndürün
}
 
// Test: kelimeAnalizi("Bu bir test metni bu test")

Egzersiz 3: Alışveriş Sepeti Analizi

let sepet = [
    {urun: 'Ekmek', fiyat: 5, adet: 2, kategori: 'temel'},
    {urun: 'Süt', fiyat: 12, adet: 1, kategori: 'temel'},
    {urun: 'Çikolata', fiyat: 25, adet: 3, kategori: 'atıştırmalık'},
    {urun: 'Elma', fiyat: 8, adet: 1, kategori: 'meyve'}
];
 
function sepetAnalizi(sepet) {
    // 1. Toplam fiyat hesaplama
    // 2. Kategori bazında gruplama
    // 3. En pahalı ve en ucuz ürün
    // 4. İndirim uygulama (kategoriye göre)
    // 5. Detaylı rapor oluşturma
}
Ipucu

Performans İpucu: Büyük dizilerle çalışırken, işlem türünü dikkatli seçin. map/filter/reduce chain’leri okunabilir ama her biri dizinin tamamını dolaşır. Tek bir for döngüsü daha performanslı olabilir.

Sıradaki Bölüm

Bir sonraki bölümde Fonksiyonlar öğreneceksiniz. Kodunuzu düzenli, yeniden kullanılabilir parçalara ayırmanın yollarını keşfedeceksiniz.

Öğrendikleriniz:

  • ✅ for, while, do-while döngülerini
  • ✅ for…of ve for…in kullanımını
  • ✅ break ve continue komutlarını
  • ✅ Modern dizi metodlarını (forEach, map, filter, reduce)
  • ✅ İç içe döngüler ve performans ipuçlarını
  • ✅ Pratik problemlerde döngü mantığını

Artık JavaScript’te tekrarlayan işlemleri verimli şekilde gerçekleştirebiliyorsunuz! Sırada bu işlemleri fonksiyonlar halinde organize etmeyi öğrenmek var. 🔄