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

Blok 1 · Ders 8

Tekrar ve yardımsız mini sınav

Blok 1'in bütün konularını birbirine bağlayan tekrar, çıktı tahmin soruları, hata bulma alıştırmaları ve kendi başına çözeceğin üç küçük program.

Bu dersin sonunda

  • Blok 1'in yedi kavramını (değişken, karar, fonksiyon, obje, dizi, döngü, return) tek bir programda birlikte kullanabilirsin
  • Bir programın çıktısını çalıştırmadan, iz tablosu tutarak satır satır tahmin edebilirsin
  • Bir hata mesajından yola çıkıp hatanın gerçekte yapıldığı satırı bulabilir ve düzeltebilirsin
  • Dükkân, seviye atlama ve skor tablosu programlarını çözüme bakmadan yazıp sınır değerleriyle sınayabilirsin
  • Sonuçlarına bakarak hangi dersi tekrar etmen gerektiğine karar verebilirsin
  • Takıldığında yardım almadan önce izleyeceğin adımları uygulayabilirsin
Bu sayfada
  1. Blok 1'in haritası
  2. Yedi kavram tek programda
  3. Çıktıyı tahmin etmek: iz tablosu
  4. Bölüm 1: Çıktıyı tahmin et
  5. Bölüm 2: Hatayı bul
  6. Yardımsız çalışma kuralları
  7. Bölüm 3: Üç küçük program
  8. Sonucunu değerlendir
  9. Blok 1'in en sık beş hatası
  10. Kayıt noktası

Blok 1'in sonuna geldin. Değişkeni, kararı, fonksiyonu, objeyi, diziyi, döngüyü ve return'ü tek tek öğrendin; Ders 7'de hata avlamayı ve kodunu GitHub'a koymayı ekledin. Bu derste yeni bir kavram yok. Önce hepsini tek bir haritada birleştireceksin, sonra kendini yardımsız bir sınavla ölçeceksin: on iki çıktı tahmini, yedi hata avı ve sıfırdan yazacağın üç küçük program.

Amaç yüksek puan almak değil, Blok 2'ye geçmeden zayıf noktanı bulmak. Dersin sonundaki tablo, kaçırdığın her soru için hangi derse dönmen gerektiğini gösterecek.

Blok 1'in haritası

Yedi kavramı belli bir sırayla öğrendin ve her biri öncekilerin üstüne kuruldu. Karar bir değişkenin değerine bakar, fonksiyon kararları ve adımları bir ad altında paketler. Obje ilgili değerleri tek kutuda toplar, dizi objeleri sıraya dizer, döngü o diziyi gezer; return da fonksiyonun bulduğu sonucu çağrıldığı yere geri götürür. Harita bu sırayı gösteriyor; altındaki tablo her kavramı tek satırda özetliyor.

Değişken let hp = 100 Ders 1 Karar if (hp <= 0) Ders 2–3 Fonksiyon vur(hedef) Ders 3 Obje { hp: 100 } Ders 4 Dizi [ahri, lux] Ders 5 Döngü for (...) { } Ders 5 return return hasar Ders 6 Sınav hepsi birlikte Ders 8 veriyi tutar akışı yönetir işi paketler, sonucu verir
Şekil 8.1 Blok 1'in kavram haritası. Her kavram öncekilerin üstüne kurulur; bu sınav hepsini birlikte ister.
KavramNe işe yarar?En kısa hâliDers
DeğişkenBir değeri adıyla saklar. let ile açılanın içi değişebilir, const mühürlüdür.let hp = 100Ders 1
KararKoşula göre bir yol seçer. else if ile çok seçenek, &&, ||, ! ile birleşik koşul kurulur.if (hp <= 0) { … }Ders 2
Ders 3
FonksiyonBir işi paketler. Bir kez yazılır, parametrelere farklı değerler verilerek çok kez çağrılır.vur(hedef, 40)Ders 3
ObjeBir şeyin bütün bilgilerini anahtar ve değer çiftleriyle tek kutuda toplar.{ isim: "Ahri", hp: 100 }Ders 4
DiziSıralı liste tutar. Sıra numarası 0'dan başlar, son elemanınki length - 1.["Ahri", "Lux"]Ders 5
DöngüAynı işi her eleman için ya da koşul doğru kaldıkça tekrarlar.for (const sampiyon of takim) { … }Ders 5
returnFonksiyonun sonucunu çağrıldığı yere geri verir ve fonksiyonu orada bitirir.return hasar * 2Ders 6

Ders 7'de bunların yanına iki alışkanlık ekledin: hatayı console.log ve hata ayıklayıcıyla avlamak, işini Git ile kaydedip GitHub'a göndermek. Sınavda ikisini de kullanacaksın.

Yedi kavram tek programda

Gerçek programlar yedi kavramı aynı anda kullanır: dizinin içinde objeler durur, döngü onları tek tek gezer, her biri için bir fonksiyon çağrılır, fonksiyon içeride karar verir ve sonucu return ile geri yollar.

Aşağıdaki program, takımını iyileştiren bir destek şampiyonunu taklit ediyor: her canlı şampiyona 150 can veriyor ama kimsenin canını en yüksek değerinin (maxHp) üstüne çıkarmıyor ve ölülere dokunmuyor. C:\kod\ogren klasöründe ders8.js adında yeni bir dosya aç, programı kendin yaz ve çalıştır.

ders8.js
const takim = [    { isim: "Garen", hp: 300, maxHp: 620 },    { isim: "Lux", hp: 0, maxHp: 490 },    { isim: "Jinx", hp: 560, maxHp: 580 }] function iyilestir(sampiyon, miktar) {    if (sampiyon.hp === 0) {        return 0    }    const eksik = sampiyon.maxHp - sampiyon.hp    let verilen = miktar    if (eksik < miktar) {        verilen = eksik    }    sampiyon.hp = sampiyon.hp + verilen    return verilen} let toplam = 0for (const sampiyon of takim) {    const eklenen = iyilestir(sampiyon, 150)    toplam = toplam + eklenen    console.log(sampiyon.isim + " +" + eklenen + " can aldı")}console.log("Toplam iyileştirme: " + toplam)console.log(takim)
Çıktı
Garen +150 can aldıLux +0 can aldıJinx +20 can aldıToplam iyileştirme: 170[  { isim: 'Garen', hp: 450, maxHp: 620 },  { isim: 'Lux', hp: 0, maxHp: 490 },  { isim: 'Jinx', hp: 580, maxHp: 580 }]

Hangi satırda hangi kavram var:

KavramBu programdaki yeri
Dizi ve objetakim, üç objeden oluşan bir dizi (1–5. satırlar). Her objenin isim, hp ve maxHp alanı var.
Fonksiyoniyilestir(sampiyon, miktar) iki parametre alıyor (7. satır) ve döngüde her şampiyon için çağrılıyor (22. satır).
Karar8. satır ölüyü ayırıyor; 13. satır canın en yüksek değeri aşmasını engelliyor.
Değişkeneksik hesaplandıktan sonra değişmediği için const. verilen 14. satırda değişebildiği, toplam her turda büyüdüğü için let.
Döngüfor (const sampiyon of takim) her şampiyonu sırayla sampiyon kutusuna koyuyor (21. satır). Bu kutu, 7. satırdaki parametreyle aynı adı taşısa da ayrı bir kutudur: 22. satırdaki çağrı içindekini fonksiyonun sampiyon parametresine verir.
return17. satır verilen canı geri yolluyor. 9. satırdaki return 0 ölü için bir erken çıkış: fonksiyon orada biter.

Çıktının ikinci ve üçüncü satırlarına dikkat et. Lux'un satırı ölünün atlandığını, Jinx'in satırı tavanın, yani maxHp sınırının çalıştığını gösteriyor: Jinx'in 20 canı eksikti, 150 değil 20 aldı. Bir programın çalışması yetmez; bu sınır durumlarında da doğru davranması gerekir.

Sondaki dizi çıktısı herkesin son durumunu gösteriyor: Jinx'in hp'si artık maxHp'sine eşit. Node, tek satıra sığmayan bir diziyi böyle alt alta yazar.

Çıktıyı tahmin etmek: iz tablosu

Bölüm 1'de programları çalıştırmadan okuyacaksın. Bunun için kafanda bilgisayar gibi çalışman gerekiyor. ders8.js'teki önceki programı sil (ya da satırlarının başına // koy) ve şu kısa programı yaz: çalıştırınca 2 canlı yazıyor.

ders8.js — ogren — Visual Studio Code
ders8.js
const canlar = [80, 0, 35]let canli = 0for (const can of canlar) {    if (can > 0) {        canli++    }}console.log(canli + " canlı")
PROBLEMSOUTPUTDEBUG CONSOLETERMINAL
PS C:\kod\ogren> node ders8.js2 canlı
Ln 1, Col 1Spaces: 4UTF-8JavaScript

Programı çalıştırınca cevabı Node söylüyor. Sınavda ise bu cevabı çalıştırmadan, kendin bulacaksın.

Peki çalıştırmadan nasıl bilirdin? En güvenilir yol bir kâğıda iz tablosu (trace table) çizmek: her değişkene ve koşula bir sütun, her adıma bir satır. Ders 5'te döngü turlarını izlediğin tablolar tam olarak buydu; artık onlara bir ad veriyoruz.

Adım can 3. satır can > 0 4. satır canli 5. satır Başta – – 0 1. tur 80 true 1 2. tur 0 false 1 3. tur 35 true 2 Döngü bitti, 8. satır yazar: 2 canlı
Şekil 8.2 Yukarıdaki programın iz tablosu. Her tur yeni bir satır. canli arttığında yeşil ve kalın, değişmediğinde soluk.
  1. Sütunları aç. Programdaki her değişkene ve her koşula bir sütun ver.
  2. Satır satır ilerle. Bir değer değişince yeni satıra yaz; eskisini silme, üstünde dursun.
  3. Koşulu hesapla. Her if ve döngü koşulunun sonucunu true ya da false diye yaz.
  4. Çıktıyı harfi harfine yaz. console.log'a gelince o anki değerlerle ekrana tam olarak ne çıkacağını yaz: boşluklar, tırnaklar ve büyük-küçük harf dahil.

Bölüm 1: Çıktıyı tahmin et

On iki program, Blok 1'in sırasıyla. Her birinin ekrana tam olarak ne yazacağını tahmin et ve tahminini yazmadan cevabı açma. Döngülü sorularda iz tablosu çiz.

Tahminin tutmadıysa kodu ders8.js'e yaz, çalıştır ve farkın nereden geldiğini bulana kadar console.log ekle. Yanlış tahmin, en çok şey öğreten tahmindir.

Soru 1

Bu program ne yazar? (Ders 1)

ders8.js
let mana = 300const bedel = 80mana = mana - bedelmana - bedelconsole.log("Mana: " + mana)console.log("Toplam: " + mana + bedel)console.log(mana + bedel + " toplam")
Cevabı göster
ders8.js
let mana = 300const bedel = 80mana = mana - bedelmana - bedelconsole.log("Mana: " + mana)console.log("Toplam: " + mana + bedel)console.log(mana + bedel + " toplam")
Çıktı
Mana: 220Toplam: 22080300 toplam
  • 4. satır hesabı yapar ama sonucu hiçbir kutuya koymaz; mana 220 kalır.
  • 6. satır soldan sağa çalışır. Önce "Toplam: " + 220 hesaplanır ve "Toplam: 220" metni çıkar. Sonra bu metne 80 yapıştırılır: Toplam: 22080.
  • 7. satırda ilk iki parça sayı olduğu için önce toplanır (300); metin ancak ondan sonra gelir.

Toplamı metnin içinde görmek istiyorsan hesabı paranteze al: "Toplam: " + (mana + bedel).

Soru 2

Bu program ne yazar? (Ders 2)

ders8.js
const hp = 0if (hp > 0) {    console.log("Hayatta")} else {    console.log("Öldü")}console.log(hp === "0")console.log(hp >= 0)
Cevabı göster
ders8.js
const hp = 0if (hp > 0) {    console.log("Hayatta")} else {    console.log("Öldü")}console.log(hp === "0")console.log(hp >= 0)
Çıktı
Öldüfalsetrue
  • 0 > 0 yanlıştır (false), bu yüzden else bloğu çalışır.
  • === değerle birlikte türü de karşılaştırır. 0 bir sayı, "0" bir metin; ikisi eşit sayılmaz.
  • 0 >= 0 doğrudur. >= "büyük ya da eşit" demek; sınır değeri tam 0 olduğunda > ile >= arasındaki fark burada ortaya çıkar.

Soru 3

Bu program ne yazar? (Ders 3)

ders8.js
const seri = 6if (seri >= 3) {    console.log("Seri başladı")} else if (seri >= 5) {    console.log("Durdurulamaz")} else if (seri >= 8) {    console.log("Efsanevi")} else {    console.log("Seri yok")}
Cevabı göster
ders8.js
const seri = 6if (seri >= 3) {    console.log("Seri başladı")} else if (seri >= 5) {    console.log("Durdurulamaz")} else if (seri >= 8) {    console.log("Efsanevi")} else {    console.log("Seri yok")}
Çıktı
Seri başladı

else if zinciri yukarıdan aşağı denenir ve ilk doğru koşulun bloğu çalışır; geri kalanına hiç bakılmaz. seri 6 olduğu için seri >= 3 koşulu sağlanır ve iş orada biter. Bu sırayla yazılınca >= 5 ve >= 8 dalları hiçbir zaman çalışamaz, çünkü 5 ve üstündeki her sayı zaten 3'ten de büyüktür; ilk dal hepsini önden kapar. Doğrusu en büyük eşikten başlamak:

ders8.js
const seri = 6if (seri >= 8) {    console.log("Efsanevi")} else if (seri >= 5) {    console.log("Durdurulamaz")} else if (seri >= 3) {    console.log("Seri başladı")} else {    console.log("Seri yok")}
Çıktı
Durdurulamaz

Soru 4

Bu program ne yazar? (Ders 3)

ders8.js
const hp = 40const mana = 0const kalkanVar = trueconsole.log(hp > 50 || mana > 0)console.log(hp < 50 && mana === 0)console.log(!kalkanVar)if (hp < 50 && !kalkanVar) {    console.log("Geri çekil")} else {    console.log("Savaşa devam")}
Cevabı göster
ders8.js
const hp = 40const mana = 0const kalkanVar = trueconsole.log(hp > 50 || mana > 0)console.log(hp < 50 && mana === 0)console.log(!kalkanVar)if (hp < 50 && !kalkanVar) {    console.log("Geri çekil")} else {    console.log("Savaşa devam")}
Çıktı
falsetruefalseSavaşa devam
  • 4. satır: 40 > 50 de 0 > 0 da yanlış. || en az birinin doğru olmasını ister, ikisi de yanlış olunca sonuç false.
  • 5. satır: 40 < 50 doğru, 0 === 0 doğru. && ikisinin birden doğru olmasını ister; sonuç true.
  • 6. satır: ! tersine çevirir; true'nun tersi false.
  • 7. satır: hp < 50 doğru ama !kalkanVar yanlış. && için ikisi de gerekli, bu yüzden else çalışır.

Soru 5

Bu program ne yazar? (Ders 3 ve 6)

ders8.js
function ikiKati(sayi) {    console.log("ikiKati çalıştı")    return sayi * 2}function ucKati(sayi) {    console.log(sayi * 3)}console.log("Başla")const ilk = ikiKati(5)const ikinci = ucKati(5)console.log(ilk, ikinci)
Cevabı göster
ders8.js
function ikiKati(sayi) {    console.log("ikiKati çalıştı")    return sayi * 2}function ucKati(sayi) {    console.log(sayi * 3)}console.log("Başla")const ilk = ikiKati(5)const ikinci = ucKati(5)console.log(ilk, ikinci)
Çıktı
BaşlaikiKati çalıştı1510 undefined
  • 1–7. satırlar yalnızca fonksiyonları tanımlar; tanım kendi başına hiçbir şey yazmaz. İlk çıktı 8. satırdan gelir.
  • 9. satır ikiKati'yi çağırır: içerideki yazı ekrana çıkar, 10 geri döner ve ilk kutusuna konur.
  • 10. satır ucKati'yi çağırır: 15 ekrana yazılır, ama fonksiyonda return olmadığı için ikinci kutusuna undefined konur.
  • 11. satır ikisini virgülle, aralarına boşluk koyarak yazar.

console.log ekrana yazar, return değeri geri verir. Biri ötekinin yerini tutmaz.

Soru 6

Bu program ne yazar? (Ders 4)

ders8.js
const ahri = {    isim: "Ahri",    hp: 100,    esya: { ad: "Kılıç", hasar: 40 }}ahri.hp = ahri.hp - 25ahri.seviye = 2console.log(ahri.esya.ad)console.log(ahri.mana)console.log(ahri["seviye"])delete ahri.esyaconsole.log(ahri)
Cevabı göster
ders8.js
const ahri = {    isim: "Ahri",    hp: 100,    esya: { ad: "Kılıç", hasar: 40 }}ahri.hp = ahri.hp - 25ahri.seviye = 2console.log(ahri.esya.ad)console.log(ahri.mana)console.log(ahri["seviye"])delete ahri.esyaconsole.log(ahri)
Çıktı
Kılıçundefined2{ isim: 'Ahri', hp: 75, seviye: 2 }
  • ahri.esya.ad: önce esya objesine, sonra onun içindeki ad'a gidilir.
  • Objede mana diye bir alan yok. Olmayan alanı okumak hata vermez, undefined verir.
  • ahri["seviye"] ile ahri.seviye aynı alana bakar.
  • delete ahri.esya alanı siler. Sonradan eklenen seviye en sonda görünür, çünkü alanlar eklendikleri sırayla yazılır.
  • const ile açılan objenin içi değişebilir; mühürlü olan kutunun kendisidir. Node, objenin içindeki metinleri tek tırnakla gösterir.

Soru 7

Bu program ne yazar? (Ders 5)

ders8.js
const takim = ["Ahri", "Garen", "Jinx"]takim.push("Teemo")console.log(takim.length)console.log(takim[1])console.log(takim[takim.length - 1])takim.pop()console.log(takim)console.log(takim.includes("Teemo"))console.log(takim.indexOf("Lux"))
Cevabı göster
ders8.js
const takim = ["Ahri", "Garen", "Jinx"]takim.push("Teemo")console.log(takim.length)console.log(takim[1])console.log(takim[takim.length - 1])takim.pop()console.log(takim)console.log(takim.includes("Teemo"))console.log(takim.indexOf("Lux"))
Çıktı
4GarenTeemo[ 'Ahri', 'Garen', 'Jinx' ]false-1
  • push sona ekler; dizide artık 4 eleman var.
  • Sıra numarası 0'dan başlar: takim[1] ikinci eleman, yani Garen.
  • Son elemanın sıra numarası length - 1, yani 3: Teemo.
  • pop sondaki elemanı çıkarır; Teemo gider, includes bu yüzden false döner.
  • indexOf aradığını bulamayınca -1 verir.

Soru 8

Bu program ne yazar? (Ders 5)

ders8.js
const vuruslar = [30, 0, 45, 10]let toplam = 0for (let i = 0; i < vuruslar.length; i++) {    if (vuruslar[i] === 0) {        continue    }    toplam = toplam + vuruslar[i]    console.log(i + ". vuruş, toplam: " + toplam)}
Cevabı göster
ders8.js
const vuruslar = [30, 0, 45, 10]let toplam = 0for (let i = 0; i < vuruslar.length; i++) {    if (vuruslar[i] === 0) {        continue    }    toplam = toplam + vuruslar[i]    console.log(i + ". vuruş, toplam: " + toplam)}
Çıktı
0. vuruş, toplam: 302. vuruş, toplam: 753. vuruş, toplam: 85

Kâğıdındaki iz tablosu şöyle görünmeli:

İz tablosu
i   vuruslar[i]   ne oldu?                     toplam0   30            eklendi, yazıldı             301   0             continue: tur atlandı        302   45            eklendi, yazıldı             753   10            eklendi, yazıldı             854   yok           4 < 4 yanlış, döngü bitti    85

continue turun geri kalanını atlar; o turda hiçbir şey yazılmaz. Satır başındaki sayı kaçıncı vuruş olduğu değil, i'nin değeri: 1 numaralı tur atlandığı için 0, 2 ve 3 yazılır.

Soru 9

Bu program ne yazar? (Ders 5)

ders8.js
let can = 100let tur = 0while (can > 0) {    tur++    can = can - 30    if (tur === 3) {        break    }}console.log(tur, can)
Cevabı göster
ders8.js
let can = 100let tur = 0while (can > 0) {    tur++    can = can - 30    if (tur === 3) {        break    }}console.log(tur, can)
Çıktı
3 10
İz tablosu
turun başında   tur   can   tur === 3 ?100 > 0 doğru   1     70    yanlış70 > 0 doğru    2     40    yanlış40 > 0 doğru    3     10    doğru: break

break döngüyü koşula bakmadan bitirir. break olmasaydı döngü bir tur daha dönerdi ve program 4 -20 yazardı.

Soru 10

Bu program ne yazar? (Ders 6)

ders8.js
function durum(hp) {    if (hp <= 0) {        return "Öldü"    }    if (hp < 30) {        return "Kritik"    }    return "İyi"    console.log("Bu satır çalışır mı?")}console.log(durum(0))console.log(durum(30))console.log(durum(29))
Cevabı göster
ders8.js
function durum(hp) {    if (hp <= 0) {        return "Öldü"    }    if (hp < 30) {        return "Kritik"    }    return "İyi"    console.log("Bu satır çalışır mı?")}console.log(durum(0))console.log(durum(30))console.log(durum(29))
Çıktı
ÖldüİyiKritik
  • durum(0): 0 <= 0 doğru, "Öldü" döner. return fonksiyonu orada bitirir; aşağıdaki satırlara hiç inilmez.
  • durum(30): 30 <= 0 yanlış, 30 < 30 de yanlış. Sınır değeri 30 "Kritik" sayılmaz, "İyi" döner.
  • durum(29): 29 < 30 doğru, "Kritik" döner.
  • 9. satır hiçbir zaman çalışmaz: fonksiyon her yoldan daha önce return ile çıkıyor.

Soru 11

Bu program ne yazar? (Ders 6)

ders8.js
function hasar(guc, carpan) {    return guc * carpan}function kalanCan(hp, alinan) {    return hp - alinan}const vurus = hasar(20, 3)console.log(kalanCan(100, vurus))console.log(kalanCan(100, hasar(10, 2)) + 5)
Cevabı göster
ders8.js
function hasar(guc, carpan) {    return guc * carpan}function kalanCan(hp, alinan) {    return hp - alinan}const vurus = hasar(20, 3)console.log(kalanCan(100, vurus))console.log(kalanCan(100, hasar(10, 2)) + 5)
Çıktı
4085
  • hasar(20, 3) 60 döndürür ve vurus kutusuna konur. kalanCan(100, 60) 40 döndürür.
  • 9. satırda en içteki çağrı önce çalışır: hasar(10, 2) 20 döndürür. Sonra kalanCan(100, 20) 80 döndürür, en son + 5 ile 85 olur.

Dönen değer, bir değer yazabildiğin her yere yazılabilir: bir kutuya, başka bir fonksiyonun parantezine ya da bir hesabın içine.

Soru 12

Bu program ne yazar? (Ders 6)

ders8.js
function ilkOlen(takim) {    for (const sampiyon of takim) {        if (sampiyon.hp === 0) {            return sampiyon.isim        }    }    return "Herkes hayatta"}const mac = [    { isim: "Annie", hp: 10 },    { isim: "Teemo", hp: 0 },    { isim: "Lux", hp: 0 }]console.log(ilkOlen(mac))console.log(ilkOlen([]))
Cevabı göster
ders8.js
function ilkOlen(takim) {    for (const sampiyon of takim) {        if (sampiyon.hp === 0) {            return sampiyon.isim        }    }    return "Herkes hayatta"}const mac = [    { isim: "Annie", hp: 10 },    { isim: "Teemo", hp: 0 },    { isim: "Lux", hp: 0 }]console.log(ilkOlen(mac))console.log(ilkOlen([]))
Çıktı
TeemoHerkes hayatta
  • Döngü Annie'de koşulu yanlış, Teemo'da doğru bulur. Döngünün içindeki return hem döngüyü hem fonksiyonu bitirir; Lux'a hiç bakılmaz.
  • Boş dizide döngü bir kez bile dönmez, akış 7. satıra iner: "Herkes hayatta".

Boş liste, her döngülü fonksiyonda denenmesi gereken bir sınır değeridir.

Bölüm 2: Hatayı bul

Yedi bozuk program. Altısı hata mesajı veriyor; biri hiç mesaj vermeden yanlış çalışıyor, yani Ders 2'de tanıdığın türden bir mantık hatası. Her soruda üç şeyi yaz: hata gerçekte hangi satırda yapılmış, neden hata, düzeltilmiş satır nasıl olmalı. Dikkat: mesajın gösterdiği satır ile hatanın yapıldığı satır her zaman aynı değil.

Soru 13

Hatayı bul (Ders 1)

Üç dalgada kesilen minyonları toplamak istiyoruz.

ders8.js✗ Yanlış
const dalgalar = [6, 7, 4]const toplamMinyon = 0for (const dalga of dalgalar) {    toplamMinyon = toplamMinyon + dalga}console.log("Kesilen minyon: " + toplamMinyon)
Hata çıktısı
C:\kod\ogren\ders8.js:4    toplamMinyon = toplamMinyon + dalga                 ^ TypeError: Assignment to constant variable.    at Object.<anonymous> (C:\kod\ogren\ders8.js:4:18)    ... Node.js v24.20.0
Cevabı göster

Hata 2. satırda yapılmış: toplamMinyon const ile açılmış ama döngüde her turda büyümesi gerekiyor. Mesaj 4. satırı gösteriyor, çünkü kutu orada değiştirilmeye çalışılıyor; düzeltme ise kutunun açıldığı satırda yapılır.

ders8.js✓ Doğru
const dalgalar = [6, 7, 4]let toplamMinyon = 0for (const dalga of dalgalar) {    toplamMinyon = toplamMinyon + dalga}console.log("Kesilen minyon: " + toplamMinyon)
Çıktı
Kesilen minyon: 17

Peki 3. satırdaki const dalga neden hata vermiyor? Çünkü for...of her turda yeni bir dalga kutusu açar; hiçbir kutunun içi sonradan değiştirilmez.

Soru 14

Hatayı bul (Ders 2 ve 3)

Mana 50 ya da daha fazlaysa yetenek kullanılsın istiyoruz.

ders8.js✗ Yanlış
function yetenekKullan(mana) {    if (mana >= 50) {        console.log("Yetenek kullanıldı")    } else {        console.log("Mana yetmiyor")}yetenekKullan(80)
Hata çıktısı
C:\kod\ogren\ders8.js:7yetenekKullan(80)                  SyntaxError: Unexpected end of input    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0
Cevabı göster

Bir } eksik. 6. satırdaki } en solda durduğu için fonksiyonu kapatıyormuş gibi görünüyor, ama JavaScript girintiye bakmaz: o } else'in bloğunu kapatır. Fonksiyonu kapatacak } hiç kalmaz.

JavaScript eksik }'i ararken dosyanın sonuna kadar okur ve Unexpected end of input der, yani "kod beklenmedik bir yerde bitti". Mesajın gösterdiği 7. satır yalnızca dosyanın bittiği yer; ^ işaretinin bile çıkmadığına dikkat et. Dosyanın sonunda boş bir satır varsa mesaj o boş satırı gösterir.

ders8.js✓ Doğru
function yetenekKullan(mana) {    if (mana >= 50) {        console.log("Yetenek kullanıldı")    } else {        console.log("Mana yetmiyor")    }}yetenekKullan(80)yetenekKullan(30)
Çıktı
Yetenek kullanıldıMana yetmiyor

Süslü parantezleri girintiyle eşleştir: her } kendi bloğunu açan satırla aynı hizada olmalı. } else { satırı 4 boşluk içeride başlıyorsa, else'in bloğunu kapatan } de 4 boşluk içeride durur; fonksiyonu kapatan } ise en solda.

Soru 15

Hatayı bul (Ders 3)

Kritik vuruş hasarı iki katına çıkarıyor.

ders8.js✗ Yanlış
function kritikHasar(hasar) {    const sonuc = hasar * 2}kritikHasar(45)console.log(sonuc)
Hata çıktısı
C:\kod\ogren\ders8.js:5console.log(sonuc)            ^ ReferenceError: sonuc is not defined    at Object.<anonymous> (C:\kod\ogren\ders8.js:5:13)    ... Node.js v24.20.0
Cevabı göster

Mesaj 5. satırı gösteriyor ama asıl eksik fonksiyonun içinde. sonuc fonksiyonun içinde açılmış bir kutu; yalnızca fonksiyonun içinden görünür, dışarıdan görünmez. Fonksiyon sonucu dışarı da vermiyor, çünkü return yok. Düzeltme: sonucu return ile geri ver (3. satır) ve dönen değeri dışarıda bir kutuya koy (5. satır).

ders8.js✓ Doğru
function kritikHasar(hasar) {    const sonuc = hasar * 2    return sonuc}const kritik = kritikHasar(45)console.log(kritik)
Çıktı
90

Soru 16

Hatayı bul (Ders 4)

Garen'in bilgilerini bir objede topluyoruz.

ders8.js✗ Yanlış
const garen = {    isim: "Garen",    hp: 620    zirh: 36}console.log(garen.isim + " zırhı: " + garen.zirh)
Hata çıktısı
C:\kod\ogren\ders8.js:4    zirh: 36    ^^^^ SyntaxError: Unexpected identifier 'zirh'    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0
Cevabı göster

Hata 3. satırın sonunda: 620'den sonra virgül yok. JavaScript hp: 620'den sonra ya virgül ya da } bekliyordu, karşısına zirh adı çıktı. Mesaj "beklenmeyen ad (identifier): zirh" diyor ve 4. satırı gösteriyor, çünkü sorunu ancak orada fark etti. Alanlar alt alta yazılmışsa eksik virgülü, mesajın gösterdiği satırın bir üstünde, satırın sonunda ara.

ders8.js✓ Doğru
const garen = {    isim: "Garen",    hp: 620,    zirh: 36}console.log(garen.isim + " zırhı: " + garen.zirh)
Çıktı
Garen zırhı: 36

Soru 17

Hatayı bul (Ders 5)

Takımı numaralı bir liste olarak yazdırmak istiyoruz.

ders8.js✗ Yanlış
const takim = [{ isim: "Ahri" }, { isim: "Lux" }]for (let i = 0; i <= takim.length; i++) {    console.log((i + 1) + ". " + takim[i].isim)}
Hata çıktısı
1. Ahri2. LuxC:\kod\ogren\ders8.js:3    console.log((i + 1) + ". " + takim[i].isim)                                          ^ TypeError: Cannot read properties of undefined (reading 'isim')    at Object.<anonymous> (C:\kod\ogren\ders8.js:3:43)    ... Node.js v24.20.0
Cevabı göster

Hata 2. satırda: i <= takim.length. Dizide 2 eleman var, sıra numaraları 0 ve 1. <= yüzünden döngü i 2 iken de döner; takim[2] undefined'dır ve undefined'ın isim'ini okumaya çalışınca program çöker. İki isim yazıldıktan sonra çöktüğüne dikkat et: hata, son turdan bir fazlasında.

ders8.js✓ Doğru
const takim = [{ isim: "Ahri" }, { isim: "Lux" }]for (let i = 0; i < takim.length; i++) {    console.log((i + 1) + ". " + takim[i].isim)}
Çıktı
1. Ahri2. Lux

Soru 18

Hatayı bul (Ders 5)

Bu program önce üç eşyanın adını, sonra Liste bitti yazmalıydı. Hata mesajı vermiyor, ama kodun altındaki gerçek çıktısında eşyaların hiçbiri yok:

ders8.js✗ Yanlış
const esyalar = ["Kılıç", "Kalkan", "Bot"]for (let i = 0; i < esyalar.lenght; i++) {    console.log(esyalar[i])}console.log("Liste bitti")
Çıktı
Liste bitti
Cevabı göster

Hata 2. satırda: lenght yazılmış, doğrusu length. Dizide lenght diye bir alan olmadığı için esyalar.lenght undefined verir; undefined bir sayı olmadığından da 0 < undefined sorusunun cevabı false çıkar. Koşul daha ilk turda yanlış olunca döngü bir kez bile dönmez. Kendin gör:

ders8.js
const esyalar = ["Kılıç", "Kalkan", "Bot"]console.log(esyalar.lenght)console.log(0 < esyalar.lenght)
Çıktı
undefinedfalse

JavaScript bunu hata saymaz: program çalışır, ama yanlış çalışır. Tam bir mantık hatası. Düzeltilmiş hâli:

ders8.js✓ Doğru
const esyalar = ["Kılıç", "Kalkan", "Bot"]for (let i = 0; i < esyalar.length; i++) {    console.log(esyalar[i])}console.log("Liste bitti")
Çıktı
KılıçKalkanBotListe bitti

Döngün hiç çalışmıyorsa koşulunu console.log ile yazdır; çoğu zaman sebep bu kadar küçüktür.

Soru 19

Hatayı bul (Ders 6)

bul fonksiyonu aranan şampiyonu bulup geri versin istiyoruz.

ders8.js✗ Yanlış
function bul(takim, aranan) {    for (const sampiyon of takim) {        if (sampiyon.isim === aranan) {            console.log("Bulundu: " + sampiyon.isim)        }    }}const mac = [    { isim: "Garen", hp: 620 },    { isim: "Jinx", hp: 580 }]const hedef = bul(mac, "Jinx")console.log(hedef.hp)
Hata çıktısı
Bulundu: JinxC:\kod\ogren\ders8.js:13console.log(hedef.hp)                  ^ TypeError: Cannot read properties of undefined (reading 'hp')    at Object.<anonymous> (C:\kod\ogren\ders8.js:13:19)    ... Node.js v24.20.0
Cevabı göster

Mesaj 13. satırı gösteriyor ama hata 4. satırda. Fonksiyon Jinx'i buluyor ve ekrana yazıyor (çıktının ilk satırı bunun kanıtı), ama geri vermiyor: return yok. return'süz fonksiyon undefined döndürür, hedef undefined olur ve 13. satır undefined'ın hp'sini okumaya çalışırken çöker. Düzeltme: bulunca return sampiyon.

ders8.js✓ Doğru
function bul(takim, aranan) {    for (const sampiyon of takim) {        if (sampiyon.isim === aranan) {            return sampiyon        }    }}const mac = [    { isim: "Garen", hp: 620 },    { isim: "Jinx", hp: 580 }]const hedef = bul(mac, "Jinx")console.log(hedef.hp)
Çıktı
580

Sınır değeri: aranan isim takımda yoksa döngü biter ve fonksiyon yine undefined döndürür. O zaman hedef.hp aynı hatayı verir.

ders8.js
function bul(takim, aranan) {    for (const sampiyon of takim) {        if (sampiyon.isim === aranan) {            return sampiyon        }    }}const mac = [    { isim: "Garen", hp: 620 },    { isim: "Jinx", hp: 580 }]const hedef = bul(mac, "Lux")console.log(hedef)
Çıktı
undefined

Yardımsız çalışma kuralları

Bölüm 3'te boş bir dosyayla baş başa kalacaksın. Takılacaksın; bu plana dahil. Önemli olan takılınca ne yaptığın.

Neden bu kadar sıkı kurallar? Çünkü öğrenme, takıldığın o dakikalarda olur. Çözümü hemen açarsan "anladım" hissi gelir, ama aynı programı ertesi gün boş sayfaya yazamazsın. İşe girdiğinde de ilk aylarda en çok işine yarayacak beceri, takılınca ne yapacağını bilmek olacak.

1. Kendin dene en az 20 dakika Hata mesajını oku console.log ile ölç Küçült, parçalara böl 2. İpuçları 20 dakika sonra İpucu 1 İpucu 2 İpucu 3 3. Çözüm ya da yapay zekâ kodu değil, açıklamayı iste Kapat ve kendin yaz
Şekil 8.3 Takıldığında sıra: önce kendin, sonra ipucu, en son çözüm. Çözüme baktıysan iş bitmez, kapatıp kendin yazarsın.

Yapay zekâya soracaksan sorunu ona eksiksiz ver ve ne istediğini açıkça yaz. Ders 7'de yardım isterken verilecek üç şeyi görmüştün: en küçük örnek kod, beklediğin çıktı ve aldığın çıktı ya da hata mesajının tamamı. Şuna benzer bir mesaj işini görür:

Yapay zekâya örnek mesaj
JavaScript öğreniyorum. Aşağıdaki kod beklediğim gibi çalışmıyor.Sebebini açıkla ve nereye bakmam gerektiğini söyle,ama düzeltilmiş kodu yazma. (sorunu gösteren en küçük kod)(beklediğin çıktı)(aldığın çıktı ya da hata mesajının tamamı)

Cevabı okuyunca düzeltmeyi kendin yap ve programı kendin çalıştır. Yapay zekânın açıklaması da yanlış olabilir; son sözü her zaman programın gerçek çıktısı söyler.

Bölüm 3: Üç küçük program

Şimdi boş sayfa. Her program için C:\kod\ogren içinde yeni bir dosya aç (dukkan.js, seviye.js, skor.js) ve tarifteki fonksiyonları yaz. Çıktın, verilen beklenen çıktıyla satırı satırına aynı olmalı. Bitirince her görevde verilen sınır denemesini de çalıştır: program yalnızca verilen örnekte değil, sınır değerlerinde de doğru çalışmalı.

Zorluk işaretleri birbirine göre: üçü de Blok 1'in neredeyse bütün kavramlarını kullanıyor. Hepsinde aynı yolu izle: önce Türkçe plan, sonra en küçük parça, her parçadan sonra çalıştır.

Görev 1

Dükkân

Garen dükkâna 1300 altınla giriyor ve sepetindeki altı eşyayı sırayla almaya çalışıyor. dukkan.js adında yeni bir dosya aç ve önce şu iki kutuyu yaz:

dukkan.js
const oyuncu = { isim: "Garen", altin: 1300, envanter: [] }const sepet = [    { ad: "Kalkan", fiyat: 450 },    { ad: "Can İksiri", fiyat: 50 },    { ad: "Ejder Zırhı", fiyat: 2700 },    { ad: "Çelik Botlar", fiyat: 500 },    { ad: "Totem", fiyat: 300 },    { ad: "Can İksiri", fiyat: 50 }]

Sonra şunları ekle:

  1. satinAl(oyuncu, esya) fonksiyonu. Oyuncunun altını eşyanın fiyatına yetiyorsa (tam eşitse de yeter) altından fiyatı düşsün, eşyanın adını envanter dizisine eklesin, Kalkan alındı, kalan altın: 850 gibi bir satır yazsın ve true döndürsün. Yetmiyorsa Ejder Zırhı için 1900 altın eksik gibi bir satır yazsın ve false döndürsün. Eksik altını JavaScript hesaplasın.
  2. Sepetteki her eşya için satinAl'ı sırayla çağıran bir döngü. Fonksiyonun döndürdüğü değere bakarak kaç eşyanın alındığını, kaçının alınamadığını say.
  3. En sonda bu iki sayıyı ve envanteri yazdır. Envanteri metne + ile ekleme, console.log'a virgülle ver: dizi ancak öyle, beklenen çıktıdaki gibi köşeli parantezle görünür.

Beklenen çıktı:

Metin
Kalkan alındı, kalan altın: 850Can İksiri alındı, kalan altın: 800Ejder Zırhı için 1900 altın eksikÇelik Botlar alındı, kalan altın: 300Totem alındı, kalan altın: 0Can İksiri için 50 altın eksikAlınan: 4, alınamayan: 2Envanter: [ 'Kalkan', 'Can İksiri', 'Çelik Botlar', 'Totem' ]

Sınır denemesi: bitirince dosyanın sonuna şu satırları ekle. Altını tam yeten Teemo bir iksir alabilmeli, ikincisini alamamalı. Yeniden çalıştırınca yukarıdaki çıktının altına şu üç satır eklenmeli:

dukkan.js, dosyanın sonuna ekle
const teemo = { isim: "Teemo", altin: 50, envanter: [] }satinAl(teemo, { ad: "Can İksiri", fiyat: 50 })satinAl(teemo, { ad: "Can İksiri", fiyat: 50 })console.log("Envanter:", teemo.envanter)
Metin
Can İksiri alındı, kalan altın: 0Can İksiri için 50 altın eksikEnvanter: [ 'Can İksiri' ]

Son olarak sepeti boşalt (const sepet = []) ve yeniden çalıştır: ilk iki satır Alınan: 0, alınamayan: 0 ve Envanter: [] olmalı.

İpucu 1

Önce yalnızca fonksiyonu yaz ve tek bir eşyayla dene: satinAl(oyuncu, sepet[0]). Kalkan satırını görünce döngüye geç. "Altın yetiyor mu?" sorusu bir if; > mı yazmalısın, >= mi? Totem satırı cevabı söylüyor: o anda altın da fiyat da tam 300.

İpucu 2

Eksik altın, fiyattan eldeki altın çıkınca kalan miktar. Diziye eleman eklemek için push kullan. Fonksiyonun iki çıkışı var: alabildiyse return true, alamadıysa return false.

İpucu 3

Saymak için döngüden önce iki kutu aç: let alinan = 0 ve let alinamayan = 0. Döngüde dönen değeri bir kutuya koy: const alindi = satinAl(oyuncu, esya). alindi true ise birini, değilse ötekini bir artır. Sonuç satırlarını döngünün dışına, döngüyü kapatan } işaretinin altına yaz; içine yazarsan her turda bir kez basılırlar.

Çözümü göster
dukkan.js
const oyuncu = { isim: "Garen", altin: 1300, envanter: [] }const sepet = [    { ad: "Kalkan", fiyat: 450 },    { ad: "Can İksiri", fiyat: 50 },    { ad: "Ejder Zırhı", fiyat: 2700 },    { ad: "Çelik Botlar", fiyat: 500 },    { ad: "Totem", fiyat: 300 },    { ad: "Can İksiri", fiyat: 50 }] function satinAl(oyuncu, esya) {    if (oyuncu.altin >= esya.fiyat) {        oyuncu.altin = oyuncu.altin - esya.fiyat        oyuncu.envanter.push(esya.ad)        console.log(esya.ad + " alındı, kalan altın: " + oyuncu.altin)        return true    } else {        const eksik = esya.fiyat - oyuncu.altin        console.log(esya.ad + " için " + eksik + " altın eksik")        return false    }} let alinan = 0let alinamayan = 0for (const esya of sepet) {    const alindi = satinAl(oyuncu, esya)    if (alindi) {        alinan++    } else {        alinamayan++    }}console.log("Alınan: " + alinan + ", alınamayan: " + alinamayan)console.log("Envanter:", oyuncu.envanter)
Çıktı
Kalkan alındı, kalan altın: 850Can İksiri alındı, kalan altın: 800Ejder Zırhı için 1900 altın eksikÇelik Botlar alındı, kalan altın: 300Totem alındı, kalan altın: 0Can İksiri için 50 altın eksikAlınan: 4, alınamayan: 2Envanter: [ 'Kalkan', 'Can İksiri', 'Çelik Botlar', 'Totem' ]

Totem satırı hazır bir sınır denemesi. > yazsaydın 300 altınla 300'lük totemi alamazdın ve ekranda Totem için 0 altın eksik gibi anlamsız bir satır görürdün.

if (alindi) satırında karşılaştırma yok, çünkü alindi zaten true ya da false; if doğrudan ona bakar. if (alindi === true) yazsaydın da aynı sonucu alırdın.

Görevdeki sınır denemesi bu çözümle şunu verir; eski çıktının altına üç satır eklenir:

dukkan.js, dosyanın sonuna eklenenler
const teemo = { isim: "Teemo", altin: 50, envanter: [] }satinAl(teemo, { ad: "Can İksiri", fiyat: 50 })satinAl(teemo, { ad: "Can İksiri", fiyat: 50 })console.log("Envanter:", teemo.envanter)
Çıktı
Can İksiri alındı, kalan altın: 0Can İksiri için 50 altın eksikEnvanter: [ 'Can İksiri' ]

Boş sepette döngü bir kez bile dönmez. Sayaçlar 0'dan başladığı için program yine de Alınan: 0, alınamayan: 0 yazar, envanter de boş dizi olarak [] görünür.

Görev 2

Seviye atlama

Lux maç boyunca deneyim puanı (XP) topluyor ve yeterince XP biriktikçe seviye atlıyor. seviye.js adında yeni bir dosya aç. Kurallar:

  • Bir seviyeden sonrakine geçmek için bulunduğun seviyenin 100 katı XP gerekir: 1'den 2'ye 100, 2'den 3'e 200, 3'ten 4'e 300, 4'ten 5'e 400.
  • Seviye atlayınca o seviyenin XP'si harcanır, artan XP bir sonraki seviyeye taşınır. Tek seferde birden çok seviye atlanabilir.
  • En yüksek seviye 5. Oraya ulaşınca XP sıfırlanır ve artık birikmez.
Toplam XP 0 100 300 600 1000 1→2 100 2→3 200 3→4 300 4→5 400 150 XP: seviye 2, 50/200 600 XP: seviye 4, 0/400 999 XP: seviye 4, 399/400
Şekil 8.4 Lux'un toplam XP'si bir çizgi gibi ilerler. Renkli her parça bir seviye atlamak için gereken XP; oklar, programın denediği üç durumu gösteriyor.

Yazacağın üç fonksiyon:

  1. gerekenXp(seviye): o seviyeden bir sonrakine geçmek için gereken XP'yi döndürür.
  2. xpKazan(oyuncu, miktar): önce Lux 150 XP kazandı yazar, XP'yi ekler ve XP yettiği sürece seviye atlatır; her atlayışta Lux seviye 2 oldu! yazar. Kaç seviye atlandığını döndürür.
  3. durumYaz(oyuncu): Durum: seviye 2, 50/200 XP gibi bir satır yazar. Oyuncu en yüksek seviyedeyse Durum: seviye 5 (en yüksek) yazar.

Fonksiyonların altına şu satırları olduğu gibi ekle:

seviye.js, dosyanın sonu
const lux = { isim: "Lux", seviye: 1, xp: 0 }xpKazan(lux, 150)durumYaz(lux)const kacSeviye = xpKazan(lux, 450)console.log("Tek seferde " + kacSeviye + " seviye atladı")durumYaz(lux)xpKazan(lux, 399)durumYaz(lux)xpKazan(lux, 5000)durumYaz(lux)

Beklenen çıktı:

Metin
Lux 150 XP kazandıLux seviye 2 oldu!Durum: seviye 2, 50/200 XPLux 450 XP kazandıLux seviye 3 oldu!Lux seviye 4 oldu!Tek seferde 2 seviye atladıDurum: seviye 4, 0/400 XPLux 399 XP kazandıDurum: seviye 4, 399/400 XPLux 5000 XP kazandıLux seviye 5 oldu!Durum: seviye 5 (en yüksek)

Sınır denemesi: bitirince dosyanın sonuna şunları ekle. 99 XP seviye atlatmamalı, tam 100'e ulaşınca atlatmalı, 0 XP hiçbir şeyi değiştirmemeli. En yüksek seviyedeki Lux'un XP'si de birikmemeli. Yukarıdaki çıktının altına şunlar eklenmeli:

seviye.js, dosyanın sonuna ekle
const teemo = { isim: "Teemo", seviye: 1, xp: 0 }xpKazan(teemo, 99)durumYaz(teemo)xpKazan(teemo, 1)durumYaz(teemo)xpKazan(teemo, 0)durumYaz(teemo)xpKazan(lux, 100)console.log("Lux XP:", lux.xp)
Metin
Teemo 99 XP kazandıDurum: seviye 1, 99/100 XPTeemo 1 XP kazandıTeemo seviye 2 oldu!Durum: seviye 2, 0/200 XPTeemo 0 XP kazandıDurum: seviye 2, 0/200 XPLux 100 XP kazandıLux XP: 0
İpucu 1

Kolaydan zora git. Önce gerekenXp'yi yaz ve dene: console.log(gerekenXp(3)) 300 yazmalı. Sonra durumYaz. xpKazan'ı en sona bırak ve önce yalnızca bir seviye atlatan bir if ile yaz; 150 XP ile dene.

İpucu 2

450 XP iki seviye atlatıyor; tek if yetmez. if'i while'a çevir: koşul doğru kaldıkça seviye atlamaya devam etsin. Döngünün içinde sıra önemli: önce XP'den bu seviyenin gerektirdiğini düş, sonra seviyeyi artır. Tersini yaparsan bir sonraki seviyenin bedelini düşersin.

İpucu 3

En yüksek seviyeyi bir kutuda tut: const maxSeviye = 5. while koşulunu iki parçalı yaz: seviye 5'ten küçük olmalı ve XP yetmeli (&&). Döngüden sonra seviye 5 ise XP'yi 0 yap. Atlanan seviyeleri saymak için döngüden önce let atlanan = 0, döngüde atlanan++, fonksiyonun sonunda return atlanan.

Çözümü göster
seviye.js
const maxSeviye = 5 function gerekenXp(seviye) {    return seviye * 100} function xpKazan(oyuncu, miktar) {    console.log(oyuncu.isim + " " + miktar + " XP kazandı")    oyuncu.xp = oyuncu.xp + miktar    let atlanan = 0    while (oyuncu.seviye < maxSeviye && oyuncu.xp >= gerekenXp(oyuncu.seviye)) {        oyuncu.xp = oyuncu.xp - gerekenXp(oyuncu.seviye)        oyuncu.seviye++        atlanan++        console.log(oyuncu.isim + " seviye " + oyuncu.seviye + " oldu!")    }    if (oyuncu.seviye === maxSeviye) {        oyuncu.xp = 0    }    return atlanan} function durumYaz(oyuncu) {    if (oyuncu.seviye === maxSeviye) {        console.log("Durum: seviye " + oyuncu.seviye + " (en yüksek)")    } else {        const ilerleme = oyuncu.xp + "/" + gerekenXp(oyuncu.seviye) + " XP"        console.log("Durum: seviye " + oyuncu.seviye + ", " + ilerleme)    }} const lux = { isim: "Lux", seviye: 1, xp: 0 }xpKazan(lux, 150)durumYaz(lux)const kacSeviye = xpKazan(lux, 450)console.log("Tek seferde " + kacSeviye + " seviye atladı")durumYaz(lux)xpKazan(lux, 399)durumYaz(lux)xpKazan(lux, 5000)durumYaz(lux)
Çıktı
Lux 150 XP kazandıLux seviye 2 oldu!Durum: seviye 2, 50/200 XPLux 450 XP kazandıLux seviye 3 oldu!Lux seviye 4 oldu!Tek seferde 2 seviye atladıDurum: seviye 4, 0/400 XPLux 399 XP kazandıDurum: seviye 4, 399/400 XPLux 5000 XP kazandıLux seviye 5 oldu!Durum: seviye 5 (en yüksek)

xpKazan objeyi parametre olarak alıyor ve içini değiştiriyor; fonksiyon bittiğinde lux objesi gerçekten değişmiş oluyor. while koşulundaki oyuncu.seviye < maxSeviye parçası olmasaydı 5000 XP, Lux'u 11. seviyeye kadar taşırdı. durumYaz'daki ilerleme kutusu yalnızca uzun satırı bölmek için var: önce "50/200 XP" metni kuruluyor, sonra cümleye ekleniyor.

Görevdeki sınır denemesi bu çözümle şunu verir; eski çıktının altına dokuz satır eklenir:

seviye.js, dosyanın sonuna eklenenler
const teemo = { isim: "Teemo", seviye: 1, xp: 0 }xpKazan(teemo, 99)durumYaz(teemo)xpKazan(teemo, 1)durumYaz(teemo)xpKazan(teemo, 0)durumYaz(teemo)xpKazan(lux, 100)console.log("Lux XP:", lux.xp)
Çıktı
Teemo 99 XP kazandıDurum: seviye 1, 99/100 XPTeemo 1 XP kazandıTeemo seviye 2 oldu!Durum: seviye 2, 0/200 XPTeemo 0 XP kazandıDurum: seviye 2, 0/200 XPLux 100 XP kazandıLux XP: 0

Son satır, xpKazan'ın sonundaki if'in işini gösteriyor: Lux zaten 5. seviyede olduğu için döngü hiç dönmüyor, ama eklenen 100 XP yine sıfırlanıyor. durumYaz en yüksek seviyede XP yazmadığı için XP'nin birikip birikmediğini ancak lux.xp'yi doğrudan yazdırarak görebilirsin.

Görev 3

Skor tablosu

Maç bitti ve beş oyuncunun kill, ölüm ve asist sayıları elinde. Onlardan bir skor tablosu çıkaracaksın. skor.js adında yeni bir dosya aç ve veriyi yaz:

skor.js
const oyuncular = [    { isim: "Garen", kill: 4, olum: 6, asist: 5 },    { isim: "Lux", kill: 2, olum: 3, asist: 14 },    { isim: "Jinx", kill: 11, olum: 2, asist: 6 },    { isim: "Teemo", kill: 0, olum: 9, asist: 3 },    { isim: "Ahri", kill: 7, olum: 4, asist: 7 }]

Kurallar:

  • Puan: her kill 3 puan, her asist 1 puan kazandırır; her ölüm 2 puan götürür.
  • Unvan: 30 ve üstü Yıldız, 15 ile 29 arası İyi, 0 ile 14 arası Orta, 0'ın altı Zor maç.
  • MVP (maçın en değerli oyuncusu): puanı en yüksek oyuncu. Puanlar eşitse listede önce gelen.
  • Liste boşsa tablo yerine yalnızca Maç verisi yok yazılır.

Yazacağın üç fonksiyon:

  1. puanHesapla(oyuncu): oyuncunun puanını döndürür.
  2. unvan(puan): puana göre unvanı döndürür.
  3. skorTablosu(liste): tabloyu, takımın toplam puanını ve MVP'yi yazar. İçinde öteki iki fonksiyonu kullanır.

En sonda skorTablosu(oyuncular) ve skorTablosu([]) çağır. Beklenen çıktı:

Metin
--- Skor tablosu ---Garen 4/6/5: 5 puan (Orta)Lux 2/3/14: 14 puan (Orta)Jinx 11/2/6: 35 puan (Yıldız)Teemo 0/9/3: -15 puan (Zor maç)Ahri 7/4/7: 20 puan (İyi)Takım puanı: 59MVP: Jinx (35 puan)Maç verisi yok

Sınır denemesi: bitirince dosyanın sonuna şunları ekle. Unvan eşiklerinin iki yanını ve eşit puanlı iki oyuncuyu deniyor. Yukarıdaki çıktının altına şunlar eklenmeli:

skor.js, dosyanın sonuna ekle
console.log(unvan(30), unvan(29))console.log(unvan(15), unvan(14))console.log(unvan(0), unvan(-1))skorTablosu([    { isim: "Annie", kill: 5, olum: 0, asist: 0 },    { isim: "Yasuo", kill: 5, olum: 0, asist: 0 }])
Metin
Yıldız İyiİyi OrtaOrta Zor maç--- Skor tablosu ---Annie 5/0/0: 15 puan (İyi)Yasuo 5/0/0: 15 puan (İyi)Takım puanı: 30MVP: Annie (15 puan)
İpucu 1

Üç fonksiyonu ayrı ayrı yaz ve her birini tek başına dene: console.log(puanHesapla(oyuncular[2])) 35, console.log(unvan(35)) Yıldız yazmalı. Ancak ikisi de doğru çalışınca skorTablosu'na geç.

İpucu 2

unvan bir else if zinciri; her dalda bir return. Sıra önemli: en büyük eşikten başla (Soru 3'ü hatırla). Satırı birleştirirken eğik çizgiler metnin içinde durur: oyuncu.kill + "/" + oyuncu.olum. Satır çok uzarsa 4/6/5 kısmını önce ayrı bir kutuda kur, sonra cümleye ekle.

İpucu 3

skorTablosu için Türkçe plan:

  • Liste boşsa Maç verisi yok yaz ve fonksiyondan çık. Değer döndürmen gerekmiyorsa return tek başına yazılır; fonksiyon orada biter.
  • Başlığı yaz. Toplam için let toplam = 0, MVP için let mvp = liste[0] aç. Bu, Ders 5'teki en yüksek değeri bulma kalıbı: ilk oyuncuyu geçici MVP say, sonra herkesi onunla karşılaştır.
  • Her oyuncu için: puanını hesapla, satırını yaz, puanı toplama ekle. Puanı MVP'ninkinden büyükse MVP artık bu oyuncu.
  • Döngüden sonra toplamı ve MVP'yi yaz.
Çözümü göster
skor.js
const oyuncular = [    { isim: "Garen", kill: 4, olum: 6, asist: 5 },    { isim: "Lux", kill: 2, olum: 3, asist: 14 },    { isim: "Jinx", kill: 11, olum: 2, asist: 6 },    { isim: "Teemo", kill: 0, olum: 9, asist: 3 },    { isim: "Ahri", kill: 7, olum: 4, asist: 7 }] function puanHesapla(oyuncu) {    return oyuncu.kill * 3 + oyuncu.asist - oyuncu.olum * 2} function unvan(puan) {    if (puan >= 30) {        return "Yıldız"    } else if (puan >= 15) {        return "İyi"    } else if (puan >= 0) {        return "Orta"    } else {        return "Zor maç"    }} function skorTablosu(liste) {    if (liste.length === 0) {        console.log("Maç verisi yok")        return    }    console.log("--- Skor tablosu ---")    let toplam = 0    let mvp = liste[0]    for (const oyuncu of liste) {        const puan = puanHesapla(oyuncu)        const kda = oyuncu.kill + "/" + oyuncu.olum + "/" + oyuncu.asist        const satir = oyuncu.isim + " " + kda + ": " + puan + " puan"        console.log(satir + " (" + unvan(puan) + ")")        toplam = toplam + puan        if (puan > puanHesapla(mvp)) {            mvp = oyuncu        }    }    console.log("Takım puanı: " + toplam)    console.log("MVP: " + mvp.isim + " (" + puanHesapla(mvp) + " puan)")} skorTablosu(oyuncular)skorTablosu([])
Çıktı
--- Skor tablosu ---Garen 4/6/5: 5 puan (Orta)Lux 2/3/14: 14 puan (Orta)Jinx 11/2/6: 35 puan (Yıldız)Teemo 0/9/3: -15 puan (Zor maç)Ahri 7/4/7: 20 puan (İyi)Takım puanı: 59MVP: Jinx (35 puan)Maç verisi yok

puanHesapla'daki hesapta önce çarpmalar yapılır, sonra toplama ve çıkarma; parantez gerekmiyor. kda ve satir kutuları yalnızca uzun satırı bölmek için var. Boş liste kontrolü en başta, çünkü boş listede liste[0] undefined olur ve MVP satırı undefined'ın isim'ini okumaya çalışırken çöker.

Adlara da dikkat: fonksiyona ne yaptığını söyleyen bir ad (puanHesapla), sonuca ne olduğunu söyleyen bir ad (puan) verdik. Fonksiyonun adı da puan olsaydı döngüdeki const puan = puan(oyuncu) satırı ReferenceError: Cannot access 'puan' before initialization verirdi: süslü parantezin içinde puan artık fonksiyonu değil, içine henüz değer konmamış yeni kutuyu gösterir.

Görevdeki sınır denemesi bu çözümle şunu verir:

skor.js, dosyanın sonuna eklenenler
console.log(unvan(30), unvan(29))console.log(unvan(15), unvan(14))console.log(unvan(0), unvan(-1))skorTablosu([    { isim: "Annie", kill: 5, olum: 0, asist: 0 },    { isim: "Yasuo", kill: 5, olum: 0, asist: 0 }])
Çıktı
Yıldız İyiİyi OrtaOrta Zor maç--- Skor tablosu ---Annie 5/0/0: 15 puan (İyi)Yasuo 5/0/0: 15 puan (İyi)Takım puanı: 30MVP: Annie (15 puan)

Eşitlikte Annie MVP kalıyor, çünkü karşılaştırma >. >= yazsaydın eşit puanlı son oyuncu, yani Yasuo MVP olurdu. Tablonun sütunları şimdilik hizasız; Ders 9'da metinleri hizalamayı öğrenince düzelteceksin.

Sonucunu değerlendir

Puanını şöyle say:

BölümNasıl sayılır?En çok
Bölüm 1Tahminin satırı satırına tuttuysa 1 puan12
Bölüm 2Hatanın gerçek satırını ve sebebini bulduysan 1 puan7
Bölüm 3Her program için: ipucu açmadan beklenen çıktıyı ve sınır denemesini birebir verdiysen 2 puan, ipucuyla bitirdiysen 1, çözüme ya da yapay zekâya baktıysan 06
Toplam25
  • 21–25: Blok 2'ye hazırsın. Kaçırdığın soruların konusuna kısaca dön, sonra Ders 9'a geç.
  • 14–20: Temel yerinde, birkaç boşluk var. Aşağıdaki tabloda "tekrar etmeliyim" çıkan derslerin görevlerini yeniden çöz, sonra devam et.
  • 0–13: Blok 1'de çok şey öğrendin ve bazıları henüz oturmadı; bu beklenen bir durum. Tablodaki derslere dön, görevlerini yeniden yap ve iki üç gün sonra bu sınavı baştan çöz. İkinci denemede farkı kendin göreceksin.

Şimdi her konu için kendine iki cevaptan birini ver: rahatım ya da tekrar etmeliyim. O konuyu ölçen soruların hepsini doğru yaptıysan rahatsın. Birini bile kaçırdıysan ya da üçüncü sütundaki cümle sana uyuyorsa, tekrar et.

KonuÖlçen sorular"Tekrar etmeliyim" de, eğer…Dönülecek yer
Değişken, let/const, metin birleştirme1, 13"Toplam: " + 220 + 80 neden 22080 oluyor, açıklayamıyorsanDers 1
Karşılaştırma ve if/else2, 140 === "0" neden false, açıklayamıyorsan ya da süslü parantezleri eşleştiremediysenDers 2
else if, &&, ||, !3, 4zincirde ilk doğru dalın kazandığını unuttuysanDers 3
Fonksiyon, parametre, kapsam5, 15fonksiyonun içindeki bir kutuya dışarıdan ulaşmaya çalıştıysanDers 3
Obje6, 16undefined'ı ya da eksik virgülü gözden kaçırdıysanDers 4
Dizi7, 17son elemanın sıra numarasını (length - 1) karıştırdıysanDers 5
Döngü, break, continue8, 9, 18tur tur iz tablosu çıkaramadıysanDers 5
return5, 10, 11, 12, 19return ile console.log'u karıştırdıysanDers 6
Problemi parçalara bölmekGörev 1, 2, 3boş dosyada nereden başlayacağını bilemediysenDers 6
Hata mesajı okumak, hata ayıklamakBölüm 2mesajdaki satırla hatanın gerçek yerini ayıramadıysanDers 1, Ders 7
GitKayıt noktasıkayıt noktasındaki komutları bakmadan yazamıyorsanDers 7

Bir ders "tekrar" çıktıysa bütün dersi baştan okumak zorunda değilsin. O dersin görevlerini ve sorularını kapalı kitap yeniden çöz; takıldığın yerde ilgili bölüme dön.

Blok 1'in en sık beş hatası

Sınav bitti. Blok 1 boyunca en çok karşına çıkan beş hata mesajı aşağıda, kısaca. Bir hata aldığında buraya ya da bütün derslerin hatalarının toplandığı hata rehberine bak.

Bölüm 2'nin en önemli dersini unutma: mesaj, JavaScript'in sorunu nerede fark ettiğini söyler; hatanın nerede yapıldığını her zaman söylemez. Eksik } dosyanın sonunda, eksik virgül bir sonraki satırda, unutulmuş return değerin kullanıldığı satırda ortaya çıkıyordu. Mesajın gösterdiği satırdan başla, bulamazsan yukarı doğru ara.

Sık hataReferenceError: oyuncuadi is not defined

Ne zaman çıkar? Bir adı oluşturduğundan farklı yazınca (büyük-küçük harf dahil), metnin tırnaklarını unutunca ya da fonksiyonun içinde açılmış bir kutuyu dışarıda kullanınca.

ders8.js
const oyuncuAdi = "Yasuo"console.log(oyuncuadi)
Hata çıktısı
C:\kod\ogren\ders8.js:2console.log(oyuncuadi)            ^ ReferenceError: oyuncuadi is not defined    at Object.<anonymous> (C:\kod\ogren\ders8.js:2:13)    ... Node.js v24.20.0

Nasıl düzelir? Mesajdaki adı dosyada ara (Ctrl+F) ve oluşturduğun satırdakiyle harf harf karşılaştır. Fonksiyonun içindeki bir değere dışarıda ihtiyacın varsa return ile dışarı ver. Tekrar için: Ders 1, Ders 3.

Sık hataSyntaxError: Unexpected end of input

Ne zaman çıkar? Bir süslü parantez { açıp kapatmayınca. JavaScript kapanışı ararken dosyanın sonuna gelir.

ders8.js
const mana = 30if (mana < 50) {    console.log("Mana az")
Hata çıktısı
C:\kod\ogren\ders8.js:3    console.log("Mana az")                           SyntaxError: Unexpected end of input    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Nasıl düzelir? Mesajın gösterdiği satır sorunun yeri değil, dosyanın sonu. Yukarı doğru çık ve her { için bir } say. VS Code'da bir süslü parantezin yanına tıklayınca eşi de vurgulanır; eşi olmayanı böyle bulursun. Tekrar için: Ders 2, Ders 3.

Sık hataSyntaxError: missing ) after argument list

Ne zaman çıkar? Bir parantezi kapatmayınca. Daha sinsi olanı: parantez yerinde olduğu hâlde, metinle değişkenin arasına + koymayı unutunca.

ders8.js
const hp = 75console.log("Kalan can: " hp)
Hata çıktısı
C:\kod\ogren\ders8.js:2console.log("Kalan can: " hp)            ^^^^^^^^^^^^^ SyntaxError: missing ) after argument list    at wrapSafe (node:internal/modules/cjs/loader:1861:18)    ... Node.js v24.20.0

Nasıl düzelir? Mesaj "parantez eksik" diyor ama asıl eksik +. JavaScript "Kalan can: " metninden sonra +, virgül ya da ) bekliyordu; karşısına hp çıkınca parantezin unutulduğunu sandı. Doğrusu: console.log("Kalan can: " + hp). Tekrar için: Ders 1.

Sık hataTypeError: Cannot read properties of undefined (reading 'hp')

Ne zaman çıkar? undefined olan bir şeyin içine bakmaya çalışınca: dizide olmayan bir sıra numarası, return'ü unutulmuş bir fonksiyonun sonucu, yanlış yazılmış bir alan adı.

ders8.js
const takim = [{ isim: "Lux", hp: 490 }]console.log(takim[1].hp)
Hata çıktısı
C:\kod\ogren\ders8.js:2console.log(takim[1].hp)                     ^ TypeError: Cannot read properties of undefined (reading 'hp')    at Object.<anonymous> (C:\kod\ogren\ders8.js:2:22)    ... Node.js v24.20.0

Nasıl düzelir? Mesaj "undefined'ın hp alanını okuyamıyorum" diyor. Noktanın solundakini yazdır: console.log(takim[1]) ekrana undefined yazar. Sonra neden undefined olduğunu sor: sıra numarası mı taştı, fonksiyon bir şey döndürmüyor mu, alan adı mı yanlış? Tekrar için: Ders 4, Ders 5, Ders 6.

Sık hataTypeError: Assignment to constant variable.

Ne zaman çıkar? const ile açtığın kutuyu değiştirmeye çalışınca; en sık da döngüde toplam ya da sayaç tutarken.

ders8.js
const tur = 1tur = tur + 1
Hata çıktısı
C:\kod\ogren\ders8.js:2tur = tur + 1    ^ TypeError: Assignment to constant variable.    at Object.<anonymous> (C:\kod\ogren\ders8.js:2:5)    ... Node.js v24.20.0

Nasıl düzelir? Değeri değişecek kutuyu let ile aç: let tur = 1. Tekrar için: Ders 1.

Kayıt noktası

Dört yeni dosyan var: ders8.js ve üç program. Ders 7'de öğrendiğin gibi, kaydetmeden önce git status ile neyin değiştiğine bak; commit'ten sonra da kaydı git push ile GitHub'a gönder.

Ders 9'da Blok 2 başlıyor: metinler ve sayılarla çalışmak. Skor tablonu hizalamayı, sayıları yuvarlamayı ve metinleri daha rahat kurmayı öğreneceksin.

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