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
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.
| Kavram | Ne işe yarar? | En kısa hâli | Ders |
|---|---|---|---|
| Değişken | Bir değeri adıyla saklar. let ile açılanın içi değişebilir, const mühürlüdür. | let hp = 100 | Ders 1 |
| Karar | Koş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 |
| Fonksiyon | Bir işi paketler. Bir kez yazılır, parametrelere farklı değerler verilerek çok kez çağrılır. | vur(hedef, 40) | Ders 3 |
| Obje | Bir şeyin bütün bilgilerini anahtar ve değer çiftleriyle tek kutuda toplar. | { isim: "Ahri", hp: 100 } | Ders 4 |
| Dizi | Sı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 |
return | Fonksiyonun sonucunu çağrıldığı yere geri verir ve fonksiyonu orada bitirir. | return hasar * 2 | Ders 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.
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)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:
| Kavram | Bu programdaki yeri |
|---|---|
| Dizi ve obje | takim, üç objeden oluşan bir dizi (1–5. satırlar). Her objenin isim, hp ve maxHp alanı var. |
| Fonksiyon | iyilestir(sampiyon, miktar) iki parametre alıyor (7. satır) ve döngüde her şampiyon için çağrılıyor (22. satır). |
| Karar | 8. satır ölüyü ayırıyor; 13. satır canın en yüksek değeri aşmasını engelliyor. |
| Değişken | eksik 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. |
return | 17. 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.
const canlar = [80, 0, 35]let canli = 0for (const can of canlar) { if (can > 0) { canli++ }}console.log(canli + " canlı")PS C:\kod\ogren> node ders8.js2 canlı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.
canli arttığında yeşil ve kalın, değişmediğinde soluk.- Sütunları aç. Programdaki her değişkene ve her koşula bir sütun ver.
- Satır satır ilerle. Bir değer değişince yeni satıra yaz; eskisini silme, üstünde dursun.
- Koşulu hesapla. Her
ifve döngü koşulunun sonucunutrueya dafalsediye yaz. - Çı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)
let mana = 300const bedel = 80mana = mana - bedelmana - bedelconsole.log("Mana: " + mana)console.log("Toplam: " + mana + bedel)console.log(mana + bedel + " toplam")Cevabı göster
let mana = 300const bedel = 80mana = mana - bedelmana - bedelconsole.log("Mana: " + mana)console.log("Toplam: " + mana + bedel)console.log(mana + bedel + " toplam")Mana: 220Toplam: 22080300 toplam- 4. satır hesabı yapar ama sonucu hiçbir kutuya koymaz;
mana220 kalır. - 6. satır soldan sağa çalışır. Önce
"Toplam: " + 220hesaplanır ve"Toplam: 220"metni çıkar. Sonra bu metne80yapış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)
const hp = 0if (hp > 0) { console.log("Hayatta")} else { console.log("Öldü")}console.log(hp === "0")console.log(hp >= 0)Cevabı göster
const hp = 0if (hp > 0) { console.log("Hayatta")} else { console.log("Öldü")}console.log(hp === "0")console.log(hp >= 0)Öldüfalsetrue0 > 0yanlıştır (false), bu yüzdenelsebloğu çalışır.===değerle birlikte türü de karşılaştırır.0bir sayı,"0"bir metin; ikisi eşit sayılmaz.0 >= 0doğ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)
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
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")}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:
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")}DurdurulamazSoru 4
Bu program ne yazar? (Ders 3)
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
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")}falsetruefalseSavaşa devam- 4. satır:
40 > 50de0 > 0da yanlış.||en az birinin doğru olmasını ister, ikisi de yanlış olunca sonuçfalse. - 5. satır:
40 < 50doğru,0 === 0doğru.&&ikisinin birden doğru olmasını ister; sonuçtrue. - 6. satır:
!tersine çevirir;true'nun tersifalse. - 7. satır:
hp < 50doğru ama!kalkanVaryanlış.&&için ikisi de gerekli, bu yüzdenelseçalışır.
Soru 5
Bu program ne yazar? (Ders 3 ve 6)
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
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)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,10geri döner veilkkutusuna konur. - 10. satır
ucKati'yi çağırır:15ekrana yazılır, ama fonksiyondareturnolmadığı içinikincikutusunaundefinedkonur. - 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)
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
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)Kılıçundefined2{ isim: 'Ahri', hp: 75, seviye: 2 }ahri.esya.ad: önceesyaobjesine, sonra onun içindekiad'a gidilir.- Objede
manadiye bir alan yok. Olmayan alanı okumak hata vermez,undefinedverir. ahri["seviye"]ileahri.seviyeaynı alana bakar.delete ahri.esyaalanı siler. Sonradan eklenenseviyeen sonda görünür, çünkü alanlar eklendikleri sırayla yazılır.constile 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)
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
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"))4GarenTeemo[ 'Ahri', 'Garen', 'Jinx' ]false-1pushsona 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. popsondaki elemanı çıkarır; Teemo gider,includesbu yüzdenfalsedöner.indexOfaradığını bulamayınca-1verir.
Soru 8
Bu program ne yazar? (Ders 5)
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
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)}0. vuruş, toplam: 302. vuruş, toplam: 753. vuruş, toplam: 85Kâğıdındaki iz tablosu şöyle görünmeli:
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 85continue 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)
let can = 100let tur = 0while (can > 0) { tur++ can = can - 30 if (tur === 3) { break }}console.log(tur, can)Cevabı göster
let can = 100let tur = 0while (can > 0) { tur++ can = can - 30 if (tur === 3) { break }}console.log(tur, can)3 10turun 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: breakbreak 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)
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
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))ÖldüİyiKritikdurum(0):0 <= 0doğru,"Öldü"döner.returnfonksiyonu orada bitirir; aşağıdaki satırlara hiç inilmez.durum(30):30 <= 0yanlış,30 < 30de yanlış. Sınır değeri 30 "Kritik" sayılmaz,"İyi"döner.durum(29):29 < 30doğru,"Kritik"döner.- 9. satır hiçbir zaman çalışmaz: fonksiyon her yoldan daha önce
returnile çıkıyor.
Soru 11
Bu program ne yazar? (Ders 6)
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
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)4085hasar(20, 3)60 döndürür vevuruskutusuna 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. SonrakalanCan(100, 20)80 döndürür, en son+ 5ile 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)
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
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([]))TeemoHerkes hayatta- Döngü Annie'de koşulu yanlış, Teemo'da doğru bulur. Döngünün içindeki
returnhem 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.
const dalgalar = [6, 7, 4]const toplamMinyon = 0for (const dalga of dalgalar) { toplamMinyon = toplamMinyon + dalga}console.log("Kesilen minyon: " + toplamMinyon)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.0Cevabı 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.
const dalgalar = [6, 7, 4]let toplamMinyon = 0for (const dalga of dalgalar) { toplamMinyon = toplamMinyon + dalga}console.log("Kesilen minyon: " + toplamMinyon)Kesilen minyon: 17Peki 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.
function yetenekKullan(mana) { if (mana >= 50) { console.log("Yetenek kullanıldı") } else { console.log("Mana yetmiyor")}yetenekKullan(80)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.0Cevabı 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.
function yetenekKullan(mana) { if (mana >= 50) { console.log("Yetenek kullanıldı") } else { console.log("Mana yetmiyor") }}yetenekKullan(80)yetenekKullan(30)Yetenek kullanıldıMana yetmiyorSü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.
function kritikHasar(hasar) { const sonuc = hasar * 2}kritikHasar(45)console.log(sonuc)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.0Cevabı 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).
function kritikHasar(hasar) { const sonuc = hasar * 2 return sonuc}const kritik = kritikHasar(45)console.log(kritik)90Soru 16
Hatayı bul (Ders 4)
Garen'in bilgilerini bir objede topluyoruz.
const garen = { isim: "Garen", hp: 620 zirh: 36}console.log(garen.isim + " zırhı: " + garen.zirh)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.0Cevabı 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.
const garen = { isim: "Garen", hp: 620, zirh: 36}console.log(garen.isim + " zırhı: " + garen.zirh)Garen zırhı: 36Soru 17
Hatayı bul (Ders 5)
Takımı numaralı bir liste olarak yazdırmak istiyoruz.
const takim = [{ isim: "Ahri" }, { isim: "Lux" }]for (let i = 0; i <= takim.length; i++) { console.log((i + 1) + ". " + takim[i].isim)}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.0Cevabı 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.
const takim = [{ isim: "Ahri" }, { isim: "Lux" }]for (let i = 0; i < takim.length; i++) { console.log((i + 1) + ". " + takim[i].isim)}1. Ahri2. LuxSoru 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:
const esyalar = ["Kılıç", "Kalkan", "Bot"]for (let i = 0; i < esyalar.lenght; i++) { console.log(esyalar[i])}console.log("Liste bitti")Liste bittiCevabı 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:
const esyalar = ["Kılıç", "Kalkan", "Bot"]console.log(esyalar.lenght)console.log(0 < esyalar.lenght)undefinedfalseJavaScript bunu hata saymaz: program çalışır, ama yanlış çalışır. Tam bir mantık hatası. Düzeltilmiş hâli:
const esyalar = ["Kılıç", "Kalkan", "Bot"]for (let i = 0; i < esyalar.length; i++) { console.log(esyalar[i])}console.log("Liste bitti")KılıçKalkanBotListe bittiDö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.
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)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.0Cevabı 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.
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)580Sı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.
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)undefinedYardı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.
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:
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.
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:
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:
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ıenvanterdizisine eklesin,Kalkan alındı, kalan altın: 850gibi bir satır yazsın vetruedöndürsün. YetmiyorsaEjder Zırhı için 1900 altın eksikgibi bir satır yazsın vefalsedöndürsün. Eksik altını JavaScript hesaplasın.- 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. - 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ı:
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:
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)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
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)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:
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)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.
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.
Yazacağın üç fonksiyon:
gerekenXp(seviye): o seviyeden bir sonrakine geçmek için gereken XP'yi döndürür.xpKazan(oyuncu, miktar): önceLux 150 XP kazandıyazar, XP'yi ekler ve XP yettiği sürece seviye atlatır; her atlayıştaLux seviye 2 oldu!yazar. Kaç seviye atlandığını döndürür.durumYaz(oyuncu):Durum: seviye 2, 50/200 XPgibi bir satır yazar. Oyuncu en yüksek seviyedeyseDurum: seviye 5 (en yüksek)yazar.
Fonksiyonların altına şu satırları olduğu gibi ekle:
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ı:
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:
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)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
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)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:
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)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: 0Son 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.
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:
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 yokyazılır.
Yazacağın üç fonksiyon:
puanHesapla(oyuncu): oyuncunun puanını döndürür.unvan(puan): puana göre unvanı döndürür.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ı:
--- 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 yokSı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:
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 }])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 yokyaz ve fonksiyondan çık. Değer döndürmen gerekmiyorsareturntek başına yazılır; fonksiyon orada biter. - Başlığı yaz. Toplam için
let toplam = 0, MVP içinlet 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
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([])--- 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 yokpuanHesapla'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:
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 }])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üm | Nasıl sayılır? | En çok |
|---|---|---|
| Bölüm 1 | Tahminin satırı satırına tuttuysa 1 puan | 12 |
| Bölüm 2 | Hatanın gerçek satırını ve sebebini bulduysan 1 puan | 7 |
| Bölüm 3 | Her 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 0 | 6 |
| Toplam | 25 |
- 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ştirme | 1, 13 | "Toplam: " + 220 + 80 neden 22080 oluyor, açıklayamıyorsan | Ders 1 |
Karşılaştırma ve if/else | 2, 14 | 0 === "0" neden false, açıklayamıyorsan ya da süslü parantezleri eşleştiremediysen | Ders 2 |
else if, &&, ||, ! | 3, 4 | zincirde ilk doğru dalın kazandığını unuttuysan | Ders 3 |
| Fonksiyon, parametre, kapsam | 5, 15 | fonksiyonun içindeki bir kutuya dışarıdan ulaşmaya çalıştıysan | Ders 3 |
| Obje | 6, 16 | undefined'ı ya da eksik virgülü gözden kaçırdıysan | Ders 4 |
| Dizi | 7, 17 | son elemanın sıra numarasını (length - 1) karıştırdıysan | Ders 5 |
Döngü, break, continue | 8, 9, 18 | tur tur iz tablosu çıkaramadıysan | Ders 5 |
return | 5, 10, 11, 12, 19 | return ile console.log'u karıştırdıysan | Ders 6 |
| Problemi parçalara bölmek | Görev 1, 2, 3 | boş dosyada nereden başlayacağını bilemediysen | Ders 6 |
| Hata mesajı okumak, hata ayıklamak | Bölüm 2 | mesajdaki satırla hatanın gerçek yerini ayıramadıysan | Ders 1, Ders 7 |
| Git | Kayıt noktası | kayıt noktasındaki komutları bakmadan yazamıyorsan | Ders 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.
ReferenceError: oyuncuadi is not definedNe 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.
const oyuncuAdi = "Yasuo"console.log(oyuncuadi)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.0Nası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.
SyntaxError: Unexpected end of inputNe zaman çıkar? Bir süslü parantez { açıp kapatmayınca. JavaScript kapanışı ararken dosyanın sonuna gelir.
const mana = 30if (mana < 50) { console.log("Mana az")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.0Nası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.
SyntaxError: missing ) after argument listNe zaman çıkar? Bir parantezi kapatmayınca. Daha sinsi olanı: parantez yerinde olduğu hâlde, metinle değişkenin arasına + koymayı unutunca.
const hp = 75console.log("Kalan can: " hp)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.0Nası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.
TypeError: 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ı.
const takim = [{ isim: "Lux", hp: 490 }]console.log(takim[1].hp)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.0Nası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.
TypeError: 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.
const tur = 1tur = tur + 1C:\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.0Nası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.