İçeriğe geç
XDD.baby Yazılım Öğrenme
Sözlük Hata rehberi 0/56

Blok 1 · Ders 5

Dizi ve döngü: bütün takım

Sıralı listeleri dizi olarak tutuyor, for ve while döngüleriyle her eleman için aynı işi yaptırıyorsun.

Bu dersin sonunda

  • Bir listeyi dizi olarak yazıp elemanlarını sıra numarasıyla (index) okuyabilir ve değiştirebilirsin
  • length ile eleman sayısını ve son elemanı bulabilirsin
  • push, pop, includes ve indexOf ile diziye eleman ekleyip çıkarabilir, dizide arama yapabilirsin
  • for, for...of ve while döngüleriyle aynı işi tekrar tekrar yaptırabilir, sonsuz döngüyü Ctrl+C ile durdurabilirsin
  • Objelerden oluşan bir takımda canlıları sayabilir, toplam altını ve en yüksek canı bulabilirsin
  • break ve continue kullanabilir, bir fazla / bir eksik tur hatalarını mesajından ya da yanlış çıktıdan tanıyıp düzeltebilirsin
Bu sayfada
  1. Neden dizi?
  2. Dizi: sıralı liste
  3. Sıra numarası: sayım sıfırdan başlar
  4. Kaç eleman var: length
  5. Elemanı değiştirmek
  6. Eklemek ve çıkarmak: push ve pop
  7. Dizide aramak: includes ve indexOf
  8. Döngü: aynı işi her eleman için yapmak
  9. for döngüsü
  10. for ile diziyi gezmek
  11. for...of: her eleman için
  12. while: ne zaman biteceği belli olmayan döngü
  13. Dizi içinde objeler: takım
  14. Döngüde koşul: saymak, toplamak, en yükseği bulmak
  15. break ve continue
  16. Sık hatalar
  17. Görevler
  18. Kendini sına
  19. Kayıt noktası

Ders 4'te bir şampiyonun bütün bilgisini tek bir objede topladın. Ama LoL tek şampiyonla oynanmaz: takımda beş kişi, bir dalgada altı minyon, dükkânda onlarca eşya var. Bu derste sıralı listeleri dizi olarak tutmayı ve döngü ile aynı işi listedeki her eleman için tekrarlatmayı öğreneceksin. Dersin sonunda beş kişilik bir takımın kaçının ayakta olduğunu, toplam altınını ve en çok canı olanı birkaç satırla bulabileceksin.

Neden dizi?

Takımındaki beş şampiyonu şimdiye kadar öğrendiklerinle tutmak istesen her biri için ayrı bir değişken açardın:

ders5.js
const oyuncu1 = "Ahri"const oyuncu2 = "Garen"const oyuncu3 = "Jinx"const oyuncu4 = "Lux"const oyuncu5 = "Teemo"

Beş kişi için idare eder. Ama altıncı biri gelince oyuncu6'yı elle açman, "Takımda Teemo var mı?" sorusu için beş ayrı karşılaştırma yazman gerekir. 50 minyonluk bir dalga için 50 değişken açardın.

Bilgisayarın asıl gücü aynı işi binlerce kez yorulmadan yapabilmesidir. Ama ona "hepsine şunu yap" diyebilmen için hepsinin tek bir yerde, sırayla durması gerekir. Bu yer dizidir.

Dizi: sıralı liste

Dizi, birden çok değeri sırasıyla tutan tek bir kutudur. Köşeli parantez [ ] içine değerleri virgülle ayırarak yazarsın.

Üç kişilik bir takımla başla; ders5.js'e şunu yaz ve çalıştır:

ders5.js — ogren — Visual Studio Code
ders5.js
const takim = ["Ahri", "Lux", "Jinx"]console.log(takim)console.log(takim.length)
PROBLEMSOUTPUTDEBUG CONSOLETERMINAL
PS C:\kod\ogren> node ders5.js[ 'Ahri', 'Lux', 'Jinx' ]3
Ln 1, Col 1Spaces: 4UTF-8JavaScript

takim tek bir değişken ama içinde üç metin var. takim.length dizide kaç eleman olduğunu söyler.

Node diziyi yazdırırken metinleri tek tırnakla gösterir. Ders 4'teki objelerde olduğu gibi bu yalnızca gösterme biçimi; sen kodda çift tırnak kullanmaya devam et.

Dizide yalnızca metin değil, her tür değer durabilir. Hiç elemanı olmayan boş dizi de geçerlidir; uzunluğu 0'dır:

ders5.js
const canlar = [100, 85, 0, 40, 60]const kulube = []console.log(canlar)console.log(kulube)console.log(kulube.length)
Çıktı
[ 100, 85, 0, 40, 60 ][]0

Sıra numarası: sayım sıfırdan başlar

Dizideki her elemanın bir sıra numarası (index) vardır. Ders 4'te objeyi köşeli parantezle okumuştun; dizide parantezin içine anahtar yerine elemanın numarasını yazarsın. Şimdi dikkat: ilk elemanın numarası 0'dır, 1 değil.

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim[0])console.log(takim[1])console.log(takim[4])
Çıktı
AhriGarenTeemo
takim beş çekmeceli bir raf; numaralar 0'dan başlar 0 Ahri 1 Garen 2 Jinx 3 Lux 4 Teemo 5 yok takim[0] takim[1] takim[2] takim[3] takim[4] takim[5] undefined takim.length → 5 eleman · son numara 4
Şekil 5.1 Dizi, numaralı çekmecelerden (yuvalardan) oluşan bir raf gibidir. Numaralar 0'dan başlar; beş elemanlı dizide son numara 4'tür ve 5 numaralı yuva yoktur.

Neden sıfır? Sıra numarası aslında elemanın baştan kaç adım uzakta olduğunu söyler. Ahri en baştadır, ona ulaşmak için hiç adım atman gerekmez: 0. Garen bir adım ötededir: 1.

Sıfırdan saymak başta herkesi zorlar; bu dersteki hataların çoğu bu bir adımlık kaymadan çıkıyor.

Olmayan sıra numarası: undefined

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim[5])console.log(takim[-1])
Çıktı
undefinedundefined

5 numaralı bir yuva yok. Ders 4'te olmayan bir alanı okuduğunda olduğu gibi hata çıkmaz; "böyle bir değer yok" anlamında undefined gelir. Eksi sayılar da sıra numarası değildir; başka bazı dillerde -1 son elemanı verir, JavaScript'te vermez.

Kaç eleman var: length

length (uzunluk) dizideki eleman sayısını verir. Sonunda parantez yoktur: komut değil, dizinin hazır bir alanıdır; Ders 4'teki ahri.hp gibi nokta ile okunur.

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim.length)console.log(takim[takim.length - 1])
Çıktı
5Teemo

Son eleman

Son console.log satırındaki kalıp her dizide işe yarar: son eleman dizi[dizi.length - 1]. Sayım 0'dan başladığı için son numara her zaman uzunluğun bir eksiğidir: beş elemanlı dizide 4.

Neden doğrudan takim[4] yazmıyoruz? Dizi büyüyüp küçülebilir. Takıma biri katılınca son eleman 5 numaraya geçer ve takim[4] yanlış kişiyi gösterir; takim[takim.length - 1] ise her zaman sonuncuyu.

Köşeli parantezin içine sonucu sayı olan her şeyi yazabilirsin: takim[2 + 1], takim[sira], takim[takim.length - 1]. Döngülerin bütün gücü buradan gelecek.

Sık hataTypeError: takim.length is not a function

Ne zaman çıkar? length'in sonuna parantez koyunca. JavaScript parantezi görünce length'i bir fonksiyon gibi çalıştırmaya kalkar.

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim.length())
Hata çıktısı
C:\kod\ogren\ders5.js:2console.log(takim.length())                  ^ TypeError: takim.length is not a function    at Object.<anonymous> (C:\kod\ogren\ders5.js:2:19)    ... Node.js v24.20.0

Nasıl düzelir? Mesaj "takim.length bir fonksiyon değil" diyor: length bir sayıdır (burada 5) ve sayı çalıştırılamaz. Parantezleri sil: takim.length.

Elemanı değiştirmek

Bir yuvanın içini değiştirmek için o yuvaya yeni değer koyarsın:

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]takim[1] = "Yasuo"console.log(takim)
Çıktı
[ 'Ahri', 'Yasuo', 'Jinx', 'Lux', 'Teemo' ]

takim[1] = "Yasuo" satırını Ders 1'deki gibi sağdan sola oku: "Yasuo'yu 1 numaralı yuvaya koy." Garen'in yerini Yasuo aldı; dizinin uzunluğu değişmedi.

Sayılarla da aynı: yuvadaki değeri okur, hesaplar ve sonucu aynı yuvaya geri koyarsın.

ders5.js
const canlar = [100, 85, 40]canlar[2] = canlar[2] - 30console.log(canlar)
Çıktı
[ 100, 85, 10 ]

Eklemek ve çıkarmak: push ve pop

Takıma biri katıldı ya da ayrıldı. Dizinin sonuna eleman eklemek için push, sonundaki elemanı çıkarmak için pop kullanılır:

ders5.js
const takim = ["Ahri", "Garen", "Jinx"]takim.push("Lux")console.log(takim)takim.pop()takim.pop()console.log(takim)console.log(takim.length)
Çıktı
[ 'Ahri', 'Garen', 'Jinx', 'Lux' ][ 'Ahri', 'Garen' ]2
  • takim.push("Lux"): parantezdeki değeri dizinin sonuna ekler. Uzunluk bir artar.
  • takim.pop(): son elemanı çıkarır. Parantezin içi boştur, çünkü hangi elemanın çıkacağı bellidir: sonuncu. İki kez çağırdık; önce Lux, sonra Jinx gitti.

push ve pop dizinin metotlarıdır: dizinin kendisine bağlı, onun üstünde çalışan fonksiyonlar. Ders 3'te fonksiyonları yalnızca adlarıyla çağırıyordun; metotları ise önlerine dizinin adını ve bir nokta koyarak çağırırsın.

pop çıkardığı elemanı çöpe atmaz, sana verir. İstersen onu bir kutuya koyabilirsin:

ders5.js
const takim = ["Ahri", "Garen", "Jinx"]const cikan = takim.pop()console.log(cikan + " takımdan ayrıldı")console.log(takim)
Çıktı
Jinx takımdan ayrıldı[ 'Ahri', 'Garen' ]

Fonksiyonların nasıl değer geri verdiğini (return) Ders 6'da öğreneceksin. Şimdilik bil ki takim.pop() yazdığın yere çıkan eleman gelir, tıpkı 5 + 3 yazdığın yere 8 gelmesi gibi.

Sık hataTypeError: takim.Push is not a function

Ne zaman çıkar? Metodun adını yanlış yazınca: Push, puhs, Pop. Metot adları da büyük-küçük harfe duyarlıdır.

ders5.js
const takim = ["Ahri"]takim.Push("Lux")
Hata çıktısı
C:\kod\ogren\ders5.js:2takim.Push("Lux")      ^ TypeError: takim.Push is not a function    at Object.<anonymous> (C:\kod\ogren\ders5.js:2:7)    ... Node.js v24.20.0

Nasıl düzelir? Doğrusu küçük harfle push; Ders 1'deki console.lg hatasının aynısı. VS Code nokta koyduğun anda metotları önerir, listeden seçersen yazım hatası yapmazsın.

Dizide aramak: includes ve indexOf

İki sık soru: "Takımda Lux var mı?" ve "Varsa kaç numaralı yuvada?" İlkini includes (içerir), ikincisini indexOf (sırası) cevaplar.

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim.includes("Lux"))console.log(takim.includes("Zed"))console.log(takim.includes("lux"))console.log(takim.indexOf("Jinx"))console.log(takim.indexOf("Zed"))
Çıktı
truefalsefalse2-1
  • includes, Ders 2'den tanıdığın boolean değerlerden birini verir: varsa true, yoksa false.
  • Büyük-küçük harf farklıdır: "lux" ile "Lux" aynı metin değil, bu yüzden üçüncü satır false.
  • indexOf bulduğu elemanın sıra numarasını, bulamazsa -1 verir. Hiçbir eleman -1 numarada durmadığı için -1 "yok" demektir.

includes'un verdiği true ya da false'u doğrudan if'in koşuluna koyabilirsin:

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux"]const secilen = "Jinx"if (takim.includes(secilen)) {    console.log(secilen + " zaten takımda, başka şampiyon seç")} else {    takim.push(secilen)    console.log(secilen + " takıma katıldı")}
Çıktı
Jinx zaten takımda, başka şampiyon seç

secilen'i "Teemo" yapıp yeniden çalıştır: bu kez else bloğu çalışır ve Teemo takıma katıldı yazar. İki bloğu da denemek, Ders 2'deki "çalışıyor ile doğru aynı şey değil" alışkanlığının parçası.

indexOf kullanırken -1 durumunu ayrıca kontrol et:

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]const sira = takim.indexOf("Teemo")if (sira === -1) {    console.log("Teemo takımda yok")} else {    console.log("Teemo " + sira + " numaralı yuvada")}
Çıktı
Teemo 4 numaralı yuvada

Dört metodun kısa özeti:

MetotNe yapar?takim = ["Ahri", "Lux"] iken
push(x)x'i sona eklertakim.push("Jinx") → takım [ 'Ahri', 'Lux', 'Jinx' ] olur
pop()Sondakini çıkarır ve verirtakim.pop() → "Lux" çıkar, takım [ 'Ahri' ] kalır
includes(x)x var mı?takim.includes("Lux") → true
indexOf(x)x kaç numaralı yuvada?takim.indexOf("Lux") → 1, yoksa -1

Döngü: aynı işi her eleman için yapmak

Takımdaki herkesi "savaşa hazır" diye yazdırmak istiyorsun. Şimdiye kadarki bilginle:

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]console.log(takim[0] + " savaşa hazır")console.log(takim[1] + " savaşa hazır")console.log(takim[2] + " savaşa hazır")console.log(takim[3] + " savaşa hazır")console.log(takim[4] + " savaşa hazır")
Çıktı
Ahri savaşa hazırGaren savaşa hazırJinx savaşa hazırLux savaşa hazırTeemo savaşa hazır

Çalışıyor ama beş satırın tek farkı köşeli parantezdeki sayı. Takım 50 kişi olsa 50 satır yazardın; takıma biri katılınca kodu da değiştirmen gerekirdi. İstediğimiz şu: "0'dan başla, her seferinde bir artır, dizinin sonuna gelince dur; her adımda bu satırı çalıştır." Bunun adı döngü.

for döngüsü

JavaScript'te en çok kullanılan döngü for'dur. Önce dizisiz, yalın bir örnek. Parantezin içine bu kursta ilk kez noktalı virgül (;) yazacaksın: Türkçe Q klavyede Shift+, (İ'nin sağındaki tuş).

ders5.js
for (let i = 0; i < 3; i++) {    console.log("Tur " + i)}
Çıktı
Tur 0Tur 1Tur 2

Süslü parantezin içindeki satır üç kez çalıştı ve her seferinde i bir fazlaydı. for'un parantezinde noktalı virgülle ayrılmış üç parça var; süslü parantezin içi de döngünün gövdesi:

for ( let i = 0 ; i < 3 ; i++ ) { 1 2 3 console.log("Tur " + i) gövde } 1 Başlangıç: döngü başlarken bir kez çalışır 2 Koşul: her turdan önce sorulur; false ise döngü biter 3 Artış: her turun sonunda çalışır, i bir artar Gövde: koşul true olduğu sürece her turda çalışır
Şekil 5.2 for satırının parçaları. Parantezdeki üç parça döngüyü yönetir, süslü parantezin içi her turda çalışır.
  1. Başlangıç let i = 0: döngü başlarken bir kez çalışır; i adında bir sayaç kutusu açar.
  2. Koşul i < 3: her turdan önce sorulur. true ise gövde çalışır, false ise döngü biter ve program }'nin altından devam eder.
  3. Artış i++: her turun sonunda sayacı bir artırır.

i++: bir artır

ders5.js
let kill = 0kill++kill++console.log(kill)kill--console.log(kill)
Çıktı
21

kill++, kill = kill + 1 yazmanın kısa yoludur: "kutudaki değeri bir artır." kill-- da bir azaltır. Döngülerde sayaç hemen her zaman i++ ile artırılır.

Neden i? Çoğunlukla İngilizce index sözcüğünün baş harfi diye açıklanır; dünyanın her yerinde döngü sayacına böyle ad verilir. İstersen tur ya da sira gibi daha anlamlı bir ad da verebilirsin.

Turları adım adım izlemek

for döngüsünün çalışma sırası şöyle: başlangıç bir kez, sonra koşul, gövde, artış; yeniden koşul, gövde, artış… Koşul false olana kadar bu çember döner.

başlangıç let i = 0 koşul i < 3 ? gövde console.log(…) artış i++ döngü biter } altındaki satıra geç true tekrar sor false i: 0 → 1 → 2 → 3 i 3 olunca koşul false
Şekil 5.3 for döngüsünün akışı. Koşul her turdan önce sorulur; cevap false olunca döngüden çıkılır.

Aynı şeyi bir tabloyla izleyelim. Döngü hatalarını bulmanın en sağlam yolu, böyle bir tabloyu kâğıda çizmektir:

Adımii < 3Ne olur?
10trueTur 0 yazılır, sonra i++ ile i 1 olur
21trueTur 1 yazılır, i 2 olur
32trueTur 2 yazılır, i 3 olur
43falseDöngü biter, }'nin altındaki satıra geçilir

Koşula dört kez bakıldı ama gövde üç kez çalıştı: son bakışta i 3'tü ve cevap false çıktı.

Sayacı 1'den başlatmak

ders5.js
for (let tur = 1; tur <= 3; tur++) {    console.log(tur + ". tur başladı")}
Çıktı
1. tur başladı2. tur başladı3. tur başladı

Bu kez sayaç tur 1'den başlıyor ve koşulda <= var: "1'den 3'e kadar, 3 dahil." İnsan gibi sayarken bu biçim doğal gelir; dizilerde ise sayacı 0'dan başlatıp < kullanacaksın.

Sık hataSyntaxError: Identifier 'i' has already been declared (for'da virgül)

Ne zaman çıkar? for'un parantezindeki parçaları noktalı virgül yerine virgülle ayırınca.

ders5.js
for (let i = 0, i < 3, i++) {    console.log("Tur " + i)}
Hata çıktısı
C:\kod\ogren\ders5.js:1for (let i = 0, i < 3, i++) {                ^ SyntaxError: Identifier 'i' has already been declared    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Mesaj yanıltıcı: i'yi iki kez tanımlamadın. JavaScript let i = 0, yazısını "virgülden sonra bir kutu daha açılacak" diye okudu ve ikinci i'yi yeni bir kutu sandı. Yalnızca ikinci virgül yanlışsa (i < 3, i++) mesaj SyntaxError: Unexpected token ')' olur.

Nasıl düzelir? Parantezde iki noktalı virgül olmalı: for (let i = 0; i < 3; i++). Mesaj tuhaf geldiğinde önce ^ işaretinin gösterdiği yere bak.

for ile diziyi gezmek

Şimdi döngüyü diziyle birleştir. Sayaç sıra numarası olarak kullanılır:

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]for (let i = 0; i < takim.length; i++) {    console.log((i + 1) + ". oyuncu: " + takim[i])}
Çıktı
1. oyuncu: Ahri2. oyuncu: Garen3. oyuncu: Jinx4. oyuncu: Lux5. oyuncu: Teemo

Her turda i bir sıra numarasıdır: 0, 1, 2, 3, 4. takim[i] de o turda o numaradaki elemandır. Koşul i < takim.length, yani i < 5: i 5 olunca döngü durur, çünkü 5 numaralı yuva yok. Takıma biri katılırsa döngüye dokunman gerekmez; takim.length 6 olur ve döngü kendiliğinden 6 tur döner.

İnsanlar için 1'den saymak istediğimizden ekrana i + 1 yazdırdık: diziden okurken takim[i], ekranda gösterirken i + 1.

for...of: her eleman için

Çoğu zaman sıra numarasına ihtiyacın olmaz, yalnızca elemanların kendisi gerekir. O zaman daha kısa bir yazım var:

ders5.js
const takim = ["Ahri", "Garen", "Jinx", "Lux", "Teemo"]for (const sampiyon of takim) {    console.log(sampiyon + " savaşa hazır")}
Çıktı
Ahri savaşa hazırGaren savaşa hazırJinx savaşa hazırLux savaşa hazırTeemo savaşa hazır

Şöyle oku: "takim'daki her sampiyon için." JavaScript her turda sıradaki elemanı sampiyon kutusuna koyar ve gövdeyi çalıştırır. Sayaç, koşul ve takim[i] yok; bir eksik ya da bir fazla tur hatası yapma şansın da yok.

Kutuya tekil bir ad ver: takim için sampiyon, esyalar için esya. Sayaçlı for'a bundan sonra, ayırt etmek için klasik for diyeceğiz.

sampiyon her turda yeniden açılan bir kutu olduğu için const yazabildik. Klasik for'daki i ise her turun sonunda değiştirildiği için orada let şart.

Sık hataTypeError: Assignment to constant variable. (for'da const)

Ne zaman çıkar? "Önce const yaz" alışkanlığıyla klasik for'un sayacını const ile açınca.

ders5.js
for (const i = 0; i < 3; i++) {    console.log("Tur " + i)}
Hata çıktısı
Tur 0C:\kod\ogren\ders5.js:1for (const i = 0; i < 3; i++) {                          ^ TypeError: Assignment to constant variable.    at Object.<anonymous> (C:\kod\ogren\ders5.js:1:27)    ... Node.js v24.20.0

İlk tur çalıştı (Tur 0). Turun sonunda i++ mühürlü kutuyu değiştirmeye kalkınca program durdu; ^ tam i++'nın altında.

Nasıl düzelir? Klasik for'da sayaç her zaman let: for (let i = 0; ...). for...of'ta ise const doğru, çünkü orada kutu her turda yeniden açılır.

Sık hataİsim yerine 0, 1, 2 çıkıyor (of yerine in)

Ne zaman çıkar? for...of yazarken of yerine in yazınca. Hata mesajı yok, ama elemanlar yerine sıra numaraları gelir.

ders5.js
const takim = ["Ahri", "Garen", "Jinx"]for (const sampiyon in takim) {    console.log(sampiyon)}
Çıktı
012

Nasıl düzelir? in'i of yap. for...in başka bir iş içindir; bu kursta diziyi hep of ile geziyoruz.

Dizinin yuvalarını değiştirmek

for...of'un verdiği kutuya yeni değer koymak dizinin yuvasını değiştirmez. can kutusu her turda dizideki değeri kendine alan ayrı bir kutudur (ona yeni değer koyacağımız için burada let yazdık):

ders5.js
const canlar = [100, 85, 40]for (let can of canlar) {    can = can + 50}console.log(canlar)
Çıktı
[ 100, 85, 40 ]

Dizi hiç değişmedi. Yuvaları değiştirmek için sıra numarasıyla yazarsın; yani klasik for:

ders5.js
const canlar = [100, 85, 40]for (let i = 0; i < canlar.length; i++) {    canlar[i] = canlar[i] + 50}console.log(canlar)
Çıktı
[ 150, 135, 90 ]

while: ne zaman biteceği belli olmayan döngü

for, tur sayısı belli olan işler için rahattır: dizinin her elemanı, 3 tur. Ama bazen tur sayısını önceden bilemezsin: "Baron ölene kadar vur." Bunun için while (-dığı sürece) var:

ders5.js
let baronHp = 100let vurus = 0while (baronHp > 0) {    baronHp = baronHp - 30    vurus++    console.log(vurus + ". vuruş, Baron'un canı: " + baronHp)}console.log("Baron " + vurus + " vuruşta düştü")
Çıktı
1. vuruş, Baron'un canı: 702. vuruş, Baron'un canı: 403. vuruş, Baron'un canı: 104. vuruş, Baron'un canı: -20Baron 4 vuruşta düştü

while (koşul) { ... } "koşul doğru olduğu sürece gövdeyi tekrarla" demektir. Koşula her turdan önce bakılır, tıpkı for'daki gibi. while'da başlangıç ve artış parçaları yoktur: sayacı döngüden önce sen açarsın (let vurus = 0), koşulu değiştiren satırı da gövdeye sen yazarsın (baronHp = baronHp - 30).

Son vuruştaki -20'ye dikkat et: gerçek oyunda can 0'ın altına inmez. Gövdeye bir if ekleyip canı 0'a sabitleyebilirsin; Görev 2'de benzerini yapacaksın.

Koşul en baştan yanlışsa gövde hiç çalışmaz: ilk satırı let baronHp = 0 yapıp çalıştır, ekrana yalnızca Baron 0 vuruşta düştü gelir.

Hangi döngüyü ne zaman seçeceğin:

DurumHangisi?
Dizinin her elemanına sırayla bakmak yeterlifor...of
Sıra numarası da gerekiyor ("3. oyuncu", "Teemo 4 numarada")for
Dizinin yuvalarını değiştireceksin (canlar[i] = ...)for
Diziyle ilgisi olmayan sayım (3 tur, 10 dalga)for
Kaç tur süreceği belli değil ("Baron ölene kadar")while

Sonsuz döngü ve Ctrl+C

while'ın koşulu hiç false olmazsa ne olur? Baron'a vurduğunu yazıp canını azaltmayı unut:

ders5.js — ogren — Visual Studio Code
ders5.js
let baronHp = 100while (baronHp > 0) {    console.log("Baron'a vurdun!")}
PROBLEMSOUTPUTDEBUG CONSOLETERMINAL
PS C:\kod\ogren> node ders5.jsBaron'a vurdun!Baron'a vurdun!Baron'a vurdun!Baron'a vurdun!Baron'a vurdun!Baron'a vurdun!# … durmadan akar. Ctrl+C'ye bas:PS C:\kod\ogren> 
Ln 1, Col 1Spaces: 4UTF-8JavaScript

baronHp hiç değişmiyor, baronHp > 0 hep true: döngü kendiliğinden hiç bitmez. Ctrl+C'den sonra istem geri gelir.

Sonsuz döngü bilgisayarına zarar vermez (en fazla fan sesi artar), ama kendiliğinden de bitmez; durdurmak senin işin:

  1. Terminal panelinin içine bir kez tıkla; klavyeden yazdıkların terminale gitsin.
  2. Ctrl+C'ye bas. Node programı hemen durdurur; ekranda bir an daha yazı akabilir, ardından PS C:\kod\ogren> istemi geri gelir.
  3. Durmazsa bir kez daha bas. Yine durmazsa terminal panelinin sağ üstündeki çöp kutusu simgesine (Kill Terminal) tıkla, sonra Terminal → New Terminal ile yeni bir terminal aç.
  4. Koddaki hatayı düzelt (burada gövdeye baronHp = baronHp - 30 satırını ekle), kaydet ve yeniden çalıştır.

Sonsuz döngünün üç sık sebebi:

  • Koşuldaki değeri değiştirmeyi unutmak. Yukarıdaki örnekte baronHp hiç azalmıyor.
  • Yanlış yöne saymak. for (let i = 0; i < 3; i--) sayacı 0, -1, -2 diye azaltır; i < 3 hep doğru kalır ve döngü hiç bitmez.
  • Hiç yanlış olamayacak bir koşul. while (true) bilerek kurulan sonsuz döngüdür; gövdesinde mutlaka bir çıkış olmalı. Bunu birazdan break ile göreceksin.
Sık hataProgram bitmiyor, terminal aynı satırla doluyor (sonsuz döngü)

Ne zaman çıkar? Döngünün koşulu hiç false olmayınca: değer gövdede değişmiyorsa, sayaç ters yöne gidiyorsa (i--) ya da while (true) içinde break yoksa. Hata mesajı yoktur; aynı satırlar durmadan akar ya da program hiçbir şey yazmadan bekler.

Nasıl düzelir? Terminale tıkla, Ctrl+C ile durdur. Sonra sor: "Bu koşulu false yapacak satır gövdede var mı?" Yoksa ekle (baronHp = baronHp - 30, i++).

Dizi içinde objeler: takım

Şimdiye kadar takımda yalnızca isimler vardı. Gerçek bir takımda her şampiyonun canı, altını, seviyesi vardır; Ders 4'ten bildiğin gibi bunları bir objede toplarsın. Dizinin elemanları obje de olabilir:

ders5.js
const takim = [    { isim: "Ahri", hp: 100, gold: 300 },    { isim: "Garen", hp: 0, gold: 150 },    { isim: "Jinx", hp: 120, gold: 520 },    { isim: "Lux", hp: 0, gold: 80 },    { isim: "Teemo", hp: 70, gold: 210 }]console.log(takim[2])console.log(takim[2].isim + " canı: " + takim[2].hp)console.log(takim.length)
Çıktı
{ isim: 'Jinx', hp: 120, gold: 520 }Jinx canı: 1205

Okunsun diye her objeyi ayrı satıra yazdık; JavaScript için fark etmez. Objelerin arasında virgül var, sonuncusundan sonra yok. takim.length 5'tir: objeler sayılır, içlerindeki alanlar değil.

takim[2].hp'yi soldan sağa oku: takim dizisinin 2 numaralı yuvasındaki objenin hp alanı. Önce yuvayı seçer, sonra o kartın alanını okursun:

takim beş objelik dizi; her obje bir şampiyon kartı 0 1 2 3 4 Ahri hp: 100 gold: 300 Garen hp: 0 gold: 150 Jinx hp: 120 gold: 520 Lux hp: 0 gold: 80 Teemo hp: 70 gold: 210 takim[2].hp → 120 [2] yuvayı seçer, .hp o objenin alanını okur
Şekil 5.4 takim[2].hp: önce [2] ile 2 numaralı yuvadaki obje seçilir, sonra .hp ile o objenin alanı okunur.

Bu takımı break ve continue bölümünün sonuna kadar kullanacağız. Diziyi yazdığın ilk yedi satırı dosyanın başında bırak, altındaki üç console.log satırını sil. Bundan sonraki örneklerde yalnızca dizinin altına yazacağın satırları gösteriyoruz; satır numaraları bu yüzden 8'den başlıyor. Her yeni örnekte bir öncekinin satırlarını silip yenisini yaz. Numarası 1'den başlayan örnekler (hata kartları gibi) ise kendi dizisini kuran ayrı programlardır.

Bütün takımı tek seferde yazdırırsan Node objeleri alt alta dizer:

ders5.js
console.log(takim)
Çıktı
[  { isim: 'Ahri', hp: 100, gold: 300 },  { isim: 'Garen', hp: 0, gold: 150 },  { isim: 'Jinx', hp: 120, gold: 520 },  { isim: 'Lux', hp: 0, gold: 80 },  { isim: 'Teemo', hp: 70, gold: 210 }]

for...of ile gezince her turda sampiyon kutusuna bir obje gelir; alanlarını Ders 4'teki gibi nokta ile okursun:

ders5.js
for (const sampiyon of takim) {    console.log(sampiyon.isim + ": " + sampiyon.hp + " can")}
Çıktı
Ahri: 100 canGaren: 0 canJinx: 120 canLux: 0 canTeemo: 70 can

canlar örneğinde for...of kutusuna yeni değer koymanın diziyi değiştirmediğini görmüştün. Objelerde durum farklı. Takımın maça mavi taraftan başladığını her şampiyonun kartına yaz:

ders5.js
for (const sampiyon of takim) {    sampiyon.taraf = "mavi"}console.log(takim[0])
Çıktı
{ isim: 'Ahri', hp: 100, gold: 300, taraf: 'mavi' }

Dizideki obje değişti. Bu kez kutuya yeni bir değer koymadın, kutudaki objenin içini değiştirdin. sampiyon kutusundaki obje, dizideki objenin kopyası değil, kendisidir; Ders 4'te fonksiyona verilen obje gibi. Var olan bir alan da böyle değişir: döngüde sampiyon.hp = sampiyon.hp + 50 yazsaydın dizideki bütün canlar artardı.

Sık hataSyntaxError: Unexpected token '{' (objeler arasında virgül yok)

Ne zaman çıkar? Dizideki iki objenin arasına virgül koymayı unutunca. Ders 4'teki "virgül unutmak" hatasının dizideki hâli.

ders5.js
const takim = [    { isim: "Ahri", hp: 100 }    { isim: "Garen", hp: 0 }]
Hata çıktısı
C:\kod\ogren\ders5.js:3    { isim: "Garen", hp: 0 }    ^ SyntaxError: Unexpected token '{'    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Nasıl düzelir? ^ ikinci objenin başındaki {'yi gösteriyor: JavaScript önceki satırın sonunda virgül ya da ] bekliyordu. 2. satırın sonuna virgül ekle. Bu hata, virgülün eksik olduğu satırın bir altında gösterilir.

Bir de takımda Ahri olup olmadığını includes ile sormayı dene:

ders5.js
console.log(takim.includes("Ahri"))
Çıktı
false

Döngüde koşul: saymak, toplamak, en yükseği bulmak

Döngünün gövdesine Ders 2'den beri bildiğin if'i koyunca asıl güç ortaya çıkar. Oyunlarda en çok sorulan üç soru: kaç kişi ayakta, toplam ne kadar, en iyisi kim? Üçünün de cevabı aynı iskeletle yazılır: döngüden önce bir kutu aç, döngünün içinde güncelle, döngüden sonra yazdır.

Saymak: kaç kişi ayakta?

ders5.js
let canliSayisi = 0for (const sampiyon of takim) {    if (sampiyon.hp > 0) {        canliSayisi++    }}console.log("Ayakta kalan: " + canliSayisi)
Çıktı
Ayakta kalan: 3

Sayaç döngüden önce 0'dan başlar. Canı 0'dan büyük her şampiyonda bir artar: Ahri, Jinx, Teemo. Döngü bitince içinde 3 vardır.

Toplamak: takımın toplam altını

ders5.js
let toplamAltin = 0for (const sampiyon of takim) {    toplamAltin = toplamAltin + sampiyon.gold}console.log("Takımın toplam altını: " + toplamAltin)
Çıktı
Takımın toplam altını: 1260

Aynı iskelet; bu kez bir artırmak yerine her şampiyonun altınını ekliyoruz. Başlangıç değeri 0 olmalı: döngüden önce henüz kimsenin altını eklenmedi. 100'le başlatsaydın sonuç 100 fazla çıkardı. Sonucu bir kez elle kontrol et: 300, 150, 520, 80 ve 210'un toplamı gerçekten 1260 mı?

En yükseği bulmak: en çok canı olan kim?

ders5.js
let enYuksek = takim[0]for (const sampiyon of takim) {    if (sampiyon.hp > enYuksek.hp) {        enYuksek = sampiyon    }}console.log("En çok canı olan: " + enYuksek.isim + " (" + enYuksek.hp + ")")
Çıktı
En çok canı olan: Jinx (120)

Turları tabloyla izle:

TurSıradakiKemer kimde?Sonuç
1Ahri (100)Ahri (100)Büyük değil, kemer Ahri'de kalır
2Garen (0)Ahri (100)Kemer Ahri'de kalır
3Jinx (120)Ahri (100)120 daha büyük, kemer Jinx'e geçer
4Lux (0)Jinx (120)Kemer Jinx'te kalır
5Teemo (70)Jinx (120)Kemer Jinx'te kalır

enYuksek bir sayı değil, bütün bir obje. Bu sayede sonunda hem ismini hem canını yazdırabildik.

break ve continue

Bazen bütün diziyi gezmen gerekmez. Aradığını bulduysan devam etmek boşa iştir: break döngüyü o anda bitirir. Takımda düşmüş biri var mı? Bunu öğrenmek için bir tane bulman yeter:

ders5.js
for (const sampiyon of takim) {    console.log(sampiyon.isim + " kontrol ediliyor")    if (sampiyon.hp === 0) {        console.log("Düşen var: " + sampiyon.isim)        break    }}console.log("Arama bitti")
Çıktı
Ahri kontrol ediliyorGaren kontrol ediliyorDüşen var: GarenArama bitti

Jinx'e, Lux'a ve Teemo'ya hiç bakılmadı. break yalnızca döngüden çıkar, programı bitirmez: program }'nin altındaki satırdan devam eder, bu yüzden Arama bitti yazıldı. İsimle aramak da aynı kalıptır: koşulu sampiyon.isim === "Lux" yaparsın.

continue ise döngüyü bitirmez, yalnızca o turun geri kalanını atlar ve sıradaki tura geçer. Ölüler saldıramaz:

ders5.js
for (const sampiyon of takim) {    if (sampiyon.hp === 0) {        continue    }    console.log(sampiyon.isim + " saldırıyor")}
Çıktı
Ahri saldırıyorJinx saldırıyorTeemo saldırıyor

Garen'in ve Lux'un turunda continue çalıştı; console.log satırına gelinmeden sıradaki şampiyona geçildi.

continue: hp 0 ise o turu atla Ahrisaldırıyor Garenatlandı Jinxsaldırıyor Luxatlandı Teemosaldırıyor break: düşen birini bulunca dur Ahribakıldı Garenburada break Jinxbakılmadı Luxbakılmadı Teemobakılmadı döngüden çıkıldı: } altındaki satırdan devam
Şekil 5.5 Aynı takımda iki farklı çıkış. continue yalnızca o turu atlar, döngü sona kadar sürer. break döngüyü bitirir, kalanlara hiç bakılmaz.

Sık hatalar

Döngü hatalarının çoğu sıra numarasının bir adım kaymasından çıkar; bunlara "bir eksik / bir fazla" (İngilizcesi off-by-one) hatası denir. Birçoğu mesaj bile vermez: Ders 2'deki gibi bir mantık hatasıdır, program çalışır ama sonuç yanlıştır. Kartlardaki örnekleri denemek istersen ders5.js'teki eski kodu (takım dizisi dahil) sil ya da başlarına // koy. Bir hata aldığında buraya ya da bütün derslerin hatalarının toplandığı hata rehberine bak.

Sık hataSon turda undefined çıkıyor (<= ile bir fazla tur)

Ne zaman çıkar? Diziyi gezerken koşula i < takim.length yerine i <= takim.length yazınca.

ders5.js
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 0; i <= takim.length; i++) {    console.log(takim[i] + " savaşa hazır")}
Çıktı
Ahri savaşa hazırGaren savaşa hazırJinx savaşa hazırundefined savaşa hazır

Üç elemanlı dizide numaralar 0, 1, 2. <= yüzünden i 3 iken de bir tur daha döndü ve olmayan takim[3] okundu.

Nasıl düzelir? Sayaç 0'dan başlıyorsa koşul < olmalı: i < takim.length. Kural: 0'dan başla, < ile bitir.

Sık hataTypeError: Cannot read properties of undefined (reading 'isim') (döngüde bir fazla tur)

Ne zaman çıkar? Olmayan bir yuvadaki objenin alanını okuyunca. En sık sebebi bir önceki karttaki <=: fazladan dönen son turda takim[i] undefined'dır ve undefined'ın alanı okunamaz. Ders 4'te tanıştığın hatanın dizideki hâli.

ders5.js
const takim = [    { isim: "Ahri", hp: 100 },    { isim: "Garen", hp: 0 },    { isim: "Jinx", hp: 120 }]for (let i = 0; i <= takim.length; i++) {    console.log(takim[i].isim + ": " + takim[i].hp)}
Hata çıktısı
Ahri: 100Garen: 0Jinx: 120C:\kod\ogren\ders5.js:7    console.log(takim[i].isim + ": " + takim[i].hp)                         ^ TypeError: Cannot read properties of undefined (reading 'isim')    at Object.<anonymous> (C:\kod\ogren\ders5.js:7:26)    ... Node.js v24.20.0

Üç tur sorunsuz geçti; dördüncü turda takim[3] undefined çıktı ve program durdu. Mesajın sonundaki (reading 'isim') okunmaya çalışılan alanı söyler.

Nasıl düzelir? Koşulu < yap. takim[5].isim gibi sabit bir numarayla da aynı hatayı alırsın; o zaman numaranın takim.length - 1'den büyük olmadığından emin ol.

Sık hataSon eleman atlanıyor (bir eksik tur)

Ne zaman çıkar? "Son numara length - 1" kuralını koşula taşıyınca: i < takim.length - 1. Hata mesajı yok, yalnızca eksik sonuç var.

ders5.js
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 0; i < takim.length - 1; i++) {    console.log(takim[i] + " savaşa hazır")}
Çıktı
Ahri savaşa hazırGaren savaşa hazır

Nasıl düzelir? length - 1 son elemanın numarasıdır, koşulun sınırı değil. Koşulu i < takim.length yap: "numara uzunluktan küçük olduğu sürece."

Sık hataİlk eleman atlanıyor (sayaç 1'den başlamış)

Ne zaman çıkar? İnsanlar gibi 1'den saymaya alışık olduğun için sayacı let i = 1 ile başlatınca.

ders5.js
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 1; i < takim.length; i++) {    console.log(takim[i] + " savaşa hazır")}
Çıktı
Garen savaşa hazırJinx savaşa hazır

Ahri yok, hata mesajı da yok. Üç kişilik takımda fark edersin; büyük bir dizide hiç fark etmeyebilirsin.

Nasıl düzelir? Sayacı let i = 0 ile başlat. Ekranda 1'den saymak istiyorsan sayacı değil, yazdırdığın değeri değiştir: (i + 1) + ". oyuncu". Sıra numarası gerekmiyorsa for...of kullan.

Sık hataDöngü hiç dönmüyor (lenght yazım hatası)

Ne zaman çıkar? length'i lenght diye yanlış yazınca. Hata mesajı çıkmaz; döngü sessizce hiç çalışmaz.

ders5.js
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 0; i < takim.lenght; i++) {    console.log(takim[i] + " savaşa hazır")}console.log("Döngü bitti")
Çıktı
Döngü bitti

Dizide lenght diye bir alan yok; olmayan alan undefined verir. 0 < undefined karşılaştırması false çıkar, bu yüzden ilk turdan önce döngü biter.

Nasıl düzelir? Doğrusu length: önce t, sonra h. Döngü hiç dönmüyorsa koşuldaki değeri yazdır: console.log(takim.lenght) undefined gösterir ve hatayı hemen görürsün.

Sık hatafor'da let'i unutmak: hata yok ama i sızıyor

Ne zaman çıkar? Sayacı let olmadan yazınca: for (i = 0; ...). Şu an yazdığın dosyalarda JavaScript bunu hata saymaz; i adlı kutuyu kendisi, bütün dosyanın görebileceği biçimde açar.

ders5.js
for (i = 0; i < 3; i++) {    console.log("Tur " + i)}console.log("Döngüden sonra i: " + i)
Çıktı
Tur 0Tur 1Tur 2Döngüden sonra i: 3

let ile yazsaydın son satır ReferenceError: i is not defined verirdi: let i yalnızca döngünün içinde yaşar, tıpkı Ders 3'te fonksiyonun içinde açılan kutu gibi (ayrıntısı Ders 10'da). let'siz i ise bütün dosyada ortaktır; iki döngü aynı i'yi kullanınca birbirini bozar:

ders5.js
function minyonCikar() {    for (i = 0; i < 2; i++) {        console.log("  minyon çıktı")    }}for (i = 0; i < 3; i++) {    console.log((i + 1) + ". dalga")    minyonCikar()}
Çıktı
1. dalga  minyon çıktı  minyon çıktı

Üç dalga bekliyordun, bir tane geldi. minyonCikar içindeki döngü ortak i'yi 2'ye getirdi; dıştaki döngü turun sonunda onu 3'e artırdı ve 3 < 3 yanlış olunca bitti. Hata mesajı yok: tam bir mantık hatası.

Nasıl düzelir? Her for'da sayacı let ile aç: for (let i = 0; ...). İki döngüye de let eklersen üç dalga gelir, her birinde iki minyon çıkar.

Görevler

Her görevi ders5.js dosyasında yap; önceki kodu sil ya da satırların başına // koy. Önce kendin dene, takılırsan ipuçlarını sırayla aç. Çözüme en son bak.

Görev 1

Eşya çantası

Çantanda üç eşya var: Doran Kılıcı, İksir ve Totem. Şunları sırayla yap:

  1. Bu üç eşyayla canta adında bir dizi oluştur.
  2. İksir'in yerine sıra numarasıyla "Mana İksiri" koy.
  3. Çantaya "Botlar" ekle.
  4. Eşya sayısını, ilk ve son eşyayı yazdır. Son eşya için canta[3] yazmak yok; dizi büyüse de çalışacak bir yol kullan.
  5. Totem'in kaç numaralı yuvada olduğunu indexOf ile bul ve yazdır.
  6. Son eşyayı çıkar; yeni son eşyayı ve en sonda bütün çantayı yazdır.

Çıktın tam olarak şöyle olmalı:

Metin
Çantada 4 eşya varİlk eşya: Doran KılıcıSon eşya: BotlarTotem 2 numaralı yuvadaSon eşya: Totem[ 'Doran Kılıcı', 'Mana İksiri', 'Totem' ]
İpucu 1

İksir 1 numaralı yuvada, çünkü sayım 0'dan başlıyor. Değiştirmek için canta[1] = ..., eklemek için push, çıkarmak için pop.

İpucu 2

Son eşya her zaman canta[canta.length - 1]. pop'tan sonra aynı satırı bir kez daha yazman yeter; length kendiliğinden bir azalır.

Çözümü göster
ders5.js
const canta = ["Doran Kılıcı", "İksir", "Totem"]canta[1] = "Mana İksiri"canta.push("Botlar")console.log("Çantada " + canta.length + " eşya var")console.log("İlk eşya: " + canta[0])console.log("Son eşya: " + canta[canta.length - 1])console.log("Totem " + canta.indexOf("Totem") + " numaralı yuvada")canta.pop()console.log("Son eşya: " + canta[canta.length - 1])console.log(canta)
Çıktı
Çantada 4 eşya varİlk eşya: Doran KılıcıSon eşya: BotlarTotem 2 numaralı yuvadaSon eşya: Totem[ 'Doran Kılıcı', 'Mana İksiri', 'Totem' ]

Sınır denemesi: pop'u çanta boşalana kadar çağır. Boş çantada canta[canta.length - 1], yani canta[-1], undefined verir ve ekrana Son eşya: undefined gelir. Gerçek bir oyunda önce canta.length === 0 diye bakar, "Çanta boş" yazardın.

Görev 2

Mana dolumu

Mana 0'dan başlıyor ve her tur 35 artıyor. while ile mana 200'e ulaşana kadar her turu yazdır. Mana 200'ü geçemez: son turda 210 değil, 200 yazmalı. En sonda kaç turda dolduğunu yazdır:

Metin
1. tur: mana 352. tur: mana 703. tur: mana 1054. tur: mana 1405. tur: mana 1756. tur: mana 200Mana 6 turda doldu
İpucu 1

İki kutu gerekiyor: mana ve tur sayacı tur. İkisi de let, ikisi de 0'dan başlıyor. Koşul: mana 200'den küçük olduğu sürece.

İpucu 2

Gövdede sırayla: turu bir artır, manaya 35 ekle, mana 200'ü geçtiyse bir if ile onu 200'e indir, satırı yazdır.

Çözümü göster
ders5.js
let mana = 0let tur = 0while (mana < 200) {    tur++    mana = mana + 35    if (mana > 200) {        mana = 200    }    console.log(tur + ". tur: mana " + mana)}console.log("Mana " + tur + " turda doldu")
Çıktı
1. tur: mana 352. tur: mana 703. tur: mana 1054. tur: mana 1405. tur: mana 1756. tur: mana 200Mana 6 turda doldu

Sınır denemesi: mana'yı 200'den başlat; döngü hiç dönmez ve yalnızca Mana 0 turda doldu yazar. 165'ten başlatırsan tek turda tam 200 olur; 199'dan başlatırsan 234'e çıkar ama if onu 200'e indirir.

Görev 3

Ultisi açık olanlar

Takımdaki şampiyonların seviyeleri şöyle:

JavaScript
const takim = [    { isim: "Annie", seviye: 7 },    { isim: "Yasuo", seviye: 5 },    { isim: "Lux", seviye: 6 },    { isim: "Garen", seviye: 4 },    { isim: "Jinx", seviye: 9 }]

LoL'de çoğu şampiyonun ultisi 6. seviyede açılır. Şampiyonları sırayla numaralandırarak her birinin ultisinin açık olup olmadığını yazdır. Sonra kaç kişinin ultisinin açık olduğunu, takımın toplam seviyesini ve en yüksek seviyedeki şampiyonu yazdır:

Metin
1. Annie: seviye 7, ulti açık2. Yasuo: seviye 5, ulti kapalı3. Lux: seviye 6, ulti açık4. Garen: seviye 4, ulti kapalı5. Jinx: seviye 9, ulti açıkUltisi açık olan: 3Toplam seviye: 31En yüksek seviye: Jinx (9)
İpucu 1

Satırların başındaki numara için sıra numarası gerekiyor, bu yüzden klasik for: for (let i = 0; i < takim.length; i++). O turdaki şampiyon takim[i], seviyesi takim[i].seviye. Ultinin açık olması için seviye 6 ya da daha fazla olmalı: hangi karşılaştırma işareti?

İpucu 2

Ekrandaki numara i + 1; alışkanlık olarak parantez içine al: (i + 1) + ". ". Sayaç ve toplam için döngüden önce iki kutu aç: let ultiAcik = 0 ve let toplamSeviye = 0. Toplamı her turda toplamSeviye = toplamSeviye + takim[i].seviye ile büyüt.

İpucu 3

En yüksek seviye için döngüden önce let enYuksek = takim[0]; her turda takim[i].seviye > enYuksek.seviye ise kemer ona geçer: enYuksek = takim[i].

Çözümü göster
ders5.js
const takim = [    { isim: "Annie", seviye: 7 },    { isim: "Yasuo", seviye: 5 },    { isim: "Lux", seviye: 6 },    { isim: "Garen", seviye: 4 },    { isim: "Jinx", seviye: 9 }]let ultiAcik = 0let toplamSeviye = 0let enYuksek = takim[0]for (let i = 0; i < takim.length; i++) {    if (takim[i].seviye >= 6) {        console.log((i + 1) + ". " + takim[i].isim + ": seviye " + takim[i].seviye + ", ulti açık")        ultiAcik++    } else {        console.log((i + 1) + ". " + takim[i].isim + ": seviye " + takim[i].seviye + ", ulti kapalı")    }    toplamSeviye = toplamSeviye + takim[i].seviye    if (takim[i].seviye > enYuksek.seviye) {        enYuksek = takim[i]    }}console.log("Ultisi açık olan: " + ultiAcik)console.log("Toplam seviye: " + toplamSeviye)console.log("En yüksek seviye: " + enYuksek.isim + " (" + enYuksek.seviye + ")")
Çıktı
1. Annie: seviye 7, ulti açık2. Yasuo: seviye 5, ulti kapalı3. Lux: seviye 6, ulti açık4. Garen: seviye 4, ulti kapalı5. Jinx: seviye 9, ulti açıkUltisi açık olan: 3Toplam seviye: 31En yüksek seviye: Jinx (9)

Sınır denemesi: Lux tam 6. seviyede; >= yerine > yazsaydın Lux'un ultisi kapalı görünür ve Ultisi açık olan: 2 çıkardı. Jinx'i dizinin en başına taşı: en yüksek yine Jinx çıkmalı. Herkesin seviyesini 6'nın altına indir: Ultisi açık olan: 0 çıkmalı. Toplamı da bir kez elle doğrula: 7, 5, 6, 4 ve 9'un toplamı 31.

Görev 4

Hata avı

Aşağıdaki program manası 0 olan şampiyonları saymalı ama içinde üç hata var. Gözle aramadan, yalnızca hata mesajlarını okuyarak düzelt: çalıştır, mesajı oku, ilk hatayı düzelt, yeniden çalıştır.

ders5.js✗ Yanlış
const takim = [    { isim: "Lux", mana: 120 },    { isim: "Annie", mana: 0 },    { isim: "Ahri", mana: 35 }]let bosMana = 0for (let i = 0, i <= takim.length(), i++) {    if (takim[i].mana === 0) {        bosMana++    }}console.log("Manası biten: " + bosMana)
Hata çıktısı
C:\kod\ogren\ders5.js:7for (let i = 0, i <= takim.length(), i++) {                ^ SyntaxError: Identifier 'i' has already been declared    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Hepsini düzeltince çıktı Manası biten: 1 olmalı.

İpucu 1

İlk mesaj yanıltıcı: i iki kez tanımlanmadı. for'un parantezindeki üç parçayı hangi işaret ayırır?

İpucu 2

İkinci mesaj TypeError: takim.length is not a function olacak. length bir alan mı, metot mu?

İpucu 3

Üçüncü mesaj TypeError: Cannot read properties of undefined (reading 'mana'). Üç elemanlı dizide döngü kaç tur dönüyor? Son turda i kaç, takim[i] ne?

Çözümü göster
ders5.js
const takim = [    { isim: "Lux", mana: 120 },    { isim: "Annie", mana: 0 },    { isim: "Ahri", mana: 35 }]let bosMana = 0for (let i = 0; i < takim.length; i++) {    if (takim[i].mana === 0) {        bosMana++    }}console.log("Manası biten: " + bosMana)
Çıktı
Manası biten: 1

Sırasıyla gelen mesajlar: SyntaxError: Identifier 'i' has already been declared (noktalı virgül yerine virgül), TypeError: takim.length is not a function (length'in sonundaki parantez), TypeError: Cannot read properties of undefined (reading 'mana') (<= yüzünden bir fazla tur). Yalnızca ilk virgülü düzeltirsen arada SyntaxError: Unexpected token ')' de görürsün: ikinci virgül de noktalı virgül olmalı.

Görev 5

Ban listesi

Takım seçiminde oyuncuların istekleri sırayla geliyor. Yasaklı (ban) şampiyonlar ve kadroda zaten olanlar alınmayacak:

JavaScript
const yasaklar = ["Yasuo", "Teemo", "Zed"]const istekler = ["Ahri", "Teemo", "Lux", "Ahri", "Zed", "Garen"]const kadro = []

İstekleri sırayla gez. İstenen şampiyon yasaklıysa Teemo yasaklı, atlanıyor, kadroda zaten varsa Ahri zaten kadroda, atlanıyor gibi yaz ve sıradaki isteğe geç. İkisi de değilse kadroya ekle ve Lux kadroya girdi gibi yaz. En sonda kadroyu ve kadrodaki şampiyon sayısını yazdır:

Metin
Ahri kadroya girdiTeemo yasaklı, atlanıyorLux kadroya girdiAhri zaten kadroda, atlanıyorZed yasaklı, atlanıyorGaren kadroya girdi[ 'Ahri', 'Lux', 'Garen' ]Kadroda 3 şampiyon var
İpucu 1

İki sorunun ikisi de includes ile sorulur: yasaklar.includes(sampiyon) ve kadro.includes(sampiyon).

İpucu 2

Sıradaki isteğe geçmek için continue, kadroya eklemek için push.

Çözümü göster
ders5.js
const yasaklar = ["Yasuo", "Teemo", "Zed"]const istekler = ["Ahri", "Teemo", "Lux", "Ahri", "Zed", "Garen"]const kadro = []for (const sampiyon of istekler) {    if (yasaklar.includes(sampiyon)) {        console.log(sampiyon + " yasaklı, atlanıyor")        continue    }    if (kadro.includes(sampiyon)) {        console.log(sampiyon + " zaten kadroda, atlanıyor")        continue    }    kadro.push(sampiyon)    console.log(sampiyon + " kadroya girdi")}console.log(kadro)console.log("Kadroda " + kadro.length + " şampiyon var")
Çıktı
Ahri kadroya girdiTeemo yasaklı, atlanıyorLux kadroya girdiAhri zaten kadroda, atlanıyorZed yasaklı, atlanıyorGaren kadroya girdi[ 'Ahri', 'Lux', 'Garen' ]Kadroda 3 şampiyon var

Sınır denemesi: isteklere "teemo" (küçük t) ekle; yasağa takılmadan kadroya girer, çünkü includes büyük-küçük harfe duyarlıdır. istekler'i boş dizi yap: döngü hiç dönmez, ekrana [] ve Kadroda 0 şampiyon var gelir.

Görev 6

TFT dükkânı

9 altının ve 3 yerlik bir kulüben var. Dükkândaki birimlere soldan sağa bakıyorsun:

JavaScript
let altin = 9const kulube = []const dukkan = [    { isim: "Jinx", fiyat: 4 },    { isim: "Garen", fiyat: 1 },    { isim: "Ahri", fiyat: 5 },    { isim: "Lux", fiyat: 4 },    { isim: "Teemo", fiyat: 2 },    { isim: "Annie", fiyat: 1 }]

Kurallar, her birim için bu sırayla:

  1. Kulübe doluysa (3 birim) Kulübe dolu, alışveriş bitti yaz ve dükkâna bakmayı bırak.
  2. Birimin fiyatı altınından fazlaysa Ahri için altın yetmiyor (5 gerekiyor, 4 var) gibi yaz ve sıradaki birime geç. Altının fiyata tam yetiyorsa alabilirsin.
  3. Yoksa birimi al: fiyatını altından düş, ismini kulübeye ekle, Jinx alındı, kalan altın: 5 gibi yaz.

En sonda kulübeyi ve kalan altını yazdır. Çıktın şöyle olmalı:

Metin
Jinx alındı, kalan altın: 5Garen alındı, kalan altın: 4Ahri için altın yetmiyor (5 gerekiyor, 4 var)Lux alındı, kalan altın: 0Kulübe dolu, alışveriş bittiKulübe: [ 'Jinx', 'Garen', 'Lux' ]Kalan altın: 0
İpucu 1

for (const birim of dukkan). Her turda üç soru sırayla: kulübe dolu mu (kulube.length === 3), altın yetmiyor mu, yoksa al.

İpucu 2

Dükkâna bakmayı bırakmak break, sıradaki birime geçmek continue. "Tam yetiyorsa alabilirsin" kuralı yüzünden yetmeme koşulu birim.fiyat > altin olmalı, >= değil.

İpucu 3

Kulübeyi yazdırırken Ders 1'deki virgüllü console.log'u kullan: console.log("Kulübe:", kulube). + ile birleştirirsen dizi Kulübe: Jinx,Garen,Lux gibi düz bir metne dönüşür.

Çözümü göster
ders5.js
let altin = 9const kulube = []const dukkan = [    { isim: "Jinx", fiyat: 4 },    { isim: "Garen", fiyat: 1 },    { isim: "Ahri", fiyat: 5 },    { isim: "Lux", fiyat: 4 },    { isim: "Teemo", fiyat: 2 },    { isim: "Annie", fiyat: 1 }]for (const birim of dukkan) {    if (kulube.length === 3) {        console.log("Kulübe dolu, alışveriş bitti")        break    }    if (birim.fiyat > altin) {        console.log(birim.isim + " için altın yetmiyor (" + birim.fiyat + " gerekiyor, " + altin + " var)")        continue    }    altin = altin - birim.fiyat    kulube.push(birim.isim)    console.log(birim.isim + " alındı, kalan altın: " + altin)}console.log("Kulübe:", kulube)console.log("Kalan altın: " + altin)
Çıktı
Jinx alındı, kalan altın: 5Garen alındı, kalan altın: 4Ahri için altın yetmiyor (5 gerekiyor, 4 var)Lux alındı, kalan altın: 0Kulübe dolu, alışveriş bittiKulübe: [ 'Jinx', 'Garen', 'Lux' ]Kalan altın: 0

Sınır denemesi: > yerine >= yazarsan Lux alınamaz (Lux için altın yetmiyor (4 gerekiyor, 4 var)) ve onun yerine kulübeye Teemo girer; tek bir işaret bütün alışverişi değiştirdi. altin'i 3 yap: kulübe hiç dolmaz, Kulübe dolu satırı çıkmaz, kulübede [ 'Garen', 'Teemo' ] kalır. 0 yaparsan hiçbir birim alınamaz ve kulübe [] olur.

Kendini sına

Soru 1

Bu program ne yazar?

JavaScript
const esyalar = ["Kılıç", "Kalkan", "İksir"]console.log(esyalar[esyalar.length])
Cevabı göster

undefined. Dizide üç eleman var, numaraları 0, 1, 2. esyalar.length 3'tür ve 3 numaralı yuva yoktur. Son elemanı istiyorsan esyalar[esyalar.length - 1] yazmalısın.

Soru 2

Bu döngü kaç tur döner, ne yazar?

JavaScript
for (let i = 2; i < 10; i = i + 3) {    console.log(i)}
Cevabı göster

Üç tur döner ve alt alta 2, 5, 8 yazar. Artış parçası i++ olmak zorunda değil; burada her tur 3 ekleniyor. i 11 olunca 11 < 10 yanlış olur ve döngü biter.

Soru 3

Bu programda iki hata var. Ne yazar, nasıl düzelir?

JavaScript
const takim = ["Ahri", "Garen", "Jinx"]for (let i = 1; i <= takim.length; i++) {    console.log(takim[i])}
Cevabı göster

Alt alta Garen, Jinx, undefined yazar. Sayaç 1'den başladığı için Ahri atlandı; <= yüzünden de olmayan takim[3] okundu. Üç satır çıktığı için ilk bakışta doğru sanabilirsin. Düzeltmek için sayacı let i = 0 ile başlat ve koşulu i < takim.length yap.

Soru 4

Üç satırın her biri ne yazar?

JavaScript
const kulube = ["Annie", "Jinx", "Annie"]console.log(kulube.includes("annie"))console.log(kulube.indexOf("Annie"))console.log(kulube.indexOf("Lux"))
Cevabı göster

false, 0, -1. includes büyük-küçük harfe duyarlı olduğu için "annie" bulunamaz. indexOf aranan değeri ilk gördüğü yerde durur; Annie iki kez olsa da ilkinin numarasını (0) verir. Lux dizide yok, bu yüzden -1.

Soru 5

sayac en sonda kaçtır? continue yerine break yazsaydık kaç olurdu?

JavaScript
const canlar = [50, 0, 80, 0, 30]let sayac = 0for (const can of canlar) {    if (can === 0) {        continue    }    sayac++}console.log(sayac)
Cevabı göster

3. Canı 0 olan iki turda continue çalışır ve sayac++ atlanır; kalan üç turda sayaç artar. break olsaydı 1 yazardı: ilk tur (50) sayılır, ikinci turda 0 görülünce döngü tamamen biter.

Soru 6

Bu program ne yazar?

JavaScript
let altin = 500while (altin < 500) {    altin = altin + 100}console.log(altin)
Cevabı göster

500. Koşula ilk turdan önce bakılır: 500 < 500 yanlış. Gövde hiç çalışmaz, altin değişmeden kalır.

Soru 7

Bir dizideki her sayıyı iki katına çıkarmak istiyorsun. for...of mu kullanırsın, klasik for mu? Neden?

Cevabı göster

Klasik for. for...of'un verdiği kutuya yeni değer koymak yalnızca o kutuyu değiştirir, dizinin yuvasını değil. Yuvayı değiştirmek için numarasıyla yazman gerekir: sayilar[i] = sayilar[i] * 2. Dizide sayı değil obje olsaydı, objelerin alanlarını for...of ile de değiştirebilirdin.

Soru 8

Bu program neden bitmiyor? Nasıl durdurur, nasıl düzeltirsin?

JavaScript
let i = 0while (i < 3) {    console.log("Tur " + i)}
Cevabı göster

Gövdede i'yi değiştiren bir satır yok; i hep 0 kalır, 0 < 3 hep doğrudur ve ekrana durmadan Tur 0 yazılır. Terminale tıklayıp Ctrl+C ile durdurursun. Düzeltmek için gövdenin sonuna i++ eklersin; o zaman Tur 0, Tur 1, Tur 2 yazıp biter.

Kayıt noktası

Git bu klasörde Ders 1'de başlatıldı, bu yüzden git init yazmıyorsun; her dersin sonunda iki komut yeter. VS Code terminalinde, C:\kod\ogren klasöründeyken:

Sık hataCommit mesajını tırnaksız yazmak

Ne zaman çıkar? git commit -m komutunda mesajın tırnaklarını unutunca. Kayıt alınmaz; mesajın içeriğine göre iki farklı hata görürsün:

Terminal — PowerShell
PS C:\kod\ogren> git commit -m Ders 5: diziler ve döngülerfatal: 5:: '5:' is outside repository at 'C:/kod/ogren'PS C:\kod\ogren> git commit -m Ders 5 diziler ve döngülererror: pathspec '5' did not match any file(s) known to giterror: pathspec 'diziler' did not match any file(s) known to giterror: pathspec 've' did not match any file(s) known to giterror: pathspec 'döngüler' did not match any file(s) known to git

Tırnak olmayınca terminal komutu boşluklardan böler. Git mesaj olarak yalnızca ilk sözcüğü (Ders) alır, kalanları kayda eklenecek dosyaların adı sanır. Pathspec "dosya yolu" demek; ikinci hata "5 adında bir dosya bulamadım" diyor. 5: ise C: gibi bir sürücü adına benzediği için ilk hata daha da tuhaf: "5: bu deponun dışında".

Git'in mesajları Windows'un dili Türkçe olsa da İngilizce gelir.

Nasıl düzelir? Mesajı çift tırnak içine al: git commit -m "Ders 5: diziler ve döngüler". git add . ile hazırladığın dosya kaydı bekliyor; yalnızca commit komutunu düzeltip yeniden çalıştırman yeter.

Bir sonraki derste fonksiyonların sonuç döndürmesini (return) öğrenecek ve bu dersteki takımları rastgele hasarla birbirine saldırtan ilk mini projeni, takım savaşını yazacaksın.

İşaret yalnızca bu tarayıcıda saklanır, kimseye gönderilmez.