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. 🔄