Ana Başlık 3. Sabit Kapasite ve Paralel Dizilerle Mini Sahne

Amaç: push/pop olmadan sabit kapasiteli dizi kullanımını ve paralel dizilerle çoklu nesne sahnesini öğretmek.

Öğrenme Çıktıları:

Anahtar Sözcükler: sabit kapasite, tepe, paralel dizi, mini sahne, çoklu nesne

Giriş

Dizi temelleri ve push/pop bilindikten sonra iki pratik yol ayrımı belirir. Birincisi dinamik liste: eleman gelince uzar, gidince kısalır. İkincisi sabit kapasite: dizi boyutu baştan ayrılır, “kaç eleman canlı?” bilgisi ayrı bir tepe/sayaçta tutulur. Bazı oyun iskeletlerinde ikinci model, bellek ve döngü sınırını öngörülebilir kılar.

Paralel diziler aynı indekste konum, hız veya renk gibi özellikleri birlikte taşır. Bu ana başlık sabit kapasite fikrini somutlaştırır ve paralel dizilerle küçük bir sahne kurar. Sayı tahmin veya balon örneği, dizinin yalnızca veri deposu değil oyun kuralının taşıyıcısı olduğunu gösterir. Sonraki bölümlerdeki klavye ve çarpışma, bu çoklu nesne alışkanlığının üzerine binecektir. Bundan sonra gelen alt başlıklarda önce veri modeli, sonra hamle kuralı, en sonda çizim ve etkileşim kurulur. Her yeni fonksiyon mümkün olduğunca küçük bir örnekte çalıştırılır; böylece hatanın kaynağı daha kolay bulunur. Anlatımda önce ilgili yapının ne işe yaradığı açıklanır, ardından kod satır satır okunur. Terimler ilk geçtikleri yerde kısa bir tanımla verilir; gerekirse tablo veya görsel ile desteklenir. Örnek sketch’ler tek bir mekaniğe odaklanır; böylece yan konular okumayı dağıtmaz.

3.1. Sabit kapasite: diziyi push / pop olmadan yığın gibi kullanmak

Motivasyon: push ve pop hazır metotlardır; onları bilmek işi kısaltır. Ama yığın mantığı metotlara bağlı değildir: «sona ekle / sondan çıkar» davranışını indeks ve atama ile de kurabilirsiniz. Bu, hem «metotları henüz bilmiyorum» durumunda bir çıkış yolu sunar hem de dizinin nasıl çalıştığını (slot, indeks, doluluk) daha görünür kılar. Birçok dilde ve özellikle makineye yakın ortamlarda hazır push/pop yoktur; sabit boyutta dizi + tepe indeksi klasik çözümdür.

push / pop dizinin gerçek uzunluğunu değiştirir. Alternatif yaklaşım: ihtiyaç duyulacak en fazla eleman sayısını (MAKS) baştan belirlemek; diziyi o uzunlukta oluşturup boş slotları özel bir değerle (BOS, -1, "" …) kodlamak; ekleme ve çıkarmayı push() / pop() çağırmadan slotlara yazarak yapmak. Böylece dizi yığın (stack) gibi kullanılır: length sabit kalır, doluluk bir tepe indeksiyle (veya BOS tarayarak) izlenir.

Fikir:

  1. Üst sınırı sabitle (MAKS).
  2. Diziyi MAKS uzunluğunda BOS ile doldur (geçerli veriden ayırt edilebilir olmalı).
  3. «Ekle» (push benzeri) = yigin[tepe] = deger; tepe++ — push() yok.
  4. «Çıkar» (pop benzeri) = tepe--; değeri oku; slota BOS yaz — pop() yok.

Kod 1.

javascript
const MAKS = 5;const BOS = -1; // geçerli tahmin 1–10 olduğu için -1 «boş» demektir let yigin = [BOS, BOS, BOS, BOS, BOS]; // length her zaman 5let tepe = 0; function yiginEkle(deger) {  if (tepe >= MAKS) {    return false; // yer yok  }  yigin[tepe] = deger;  tepe = tepe + 1;  return true;} function yiginCikar() {  if (tepe === 0) {    return BOS; // boş  }  tepe = tepe - 1;  let eski = yigin[tepe];  yigin[tepe] = BOS;  return eski;}

Tablo 1.

Adım İşlem yigin tepe
Başlangıç — [-1, -1, -1, -1, -1] 0
1 yiginEkle(7) [7, -1, -1, -1, -1] 1
2 yiginEkle(3) [7, 3, -1, -1, -1] 2
3 yiginCikar() → 3 [7, -1, -1, -1, -1] 1

Bu modelde yigin.length her zaman MAKS kalır; dolu eleman sayısı tepe ile aynıdır. Ekrana yazarken yalnızca dolu slotlar çizilir:

Kod 2.

javascript
for (let i = 0; i < tepe; i = i + 1) {  text(yigin[i], 20, 40 + i * 20);}

tepe tutmak istemezseniz «ilk BOS slota yaz / sondan ilk dolu slotu boşalt» diye de tarayabilirsiniz; sonuç aynı fikirdir, yalnızca doluluk hesabı döngüyle yapılır.

Tablo 2.

Yaklaşım Boyut Boş yer Ne zaman uygun?
push / pop length değişir Eleman yoksa slot yoktur Uzunluk baştan bilinmiyor; geçmiş listesi
Sabit kapasite + BOS (+ tepe) length === MAKS sabit Slot var, değer BOS Envanter, can, sabit düşman havuzu, yığın/geri al

Bilgi — JavaScript’te dinamik dizi: Bu kitapta kullandığımız JavaScript / p5.js dizileri dinamiktir: push ile büyür, pop ile küçülür; length çalışma sırasında değişebilir. Bu yüzden «doğru boyutu baştan seçmek» JS’te çoğu zaman zorunluluk değil, tasarım tercihidir (örneğin envanterde tam 5 slot istiyorsanız).

Dikkat — bazı dillerde boyut sabit kalır: C, C++ sabit dizileri, Pascal dizileri veya gömülü / makineye yakın ortamlarda dizi boyutu çoğu zaman tanım anında belirlenir ve sonradan büyütülemez. Boyutu çok küçük seçmek taşmaya (overflow) ve hatalı bellek yazımına yol açabilir; çok büyük seçmek ise kullanılmayan slotlar yüzünden bellek israfına yol açar. Bu yüzden o dünyada «ihtiyacı doğru tahmin etmek» kritik bir mühendislik kararıdır. Sabit kapasite + tepe modeli, hem o kısıtı yansıtır hem de JS’te bile «maksimum N» kuralını açıkça kodlar.

Bilgi: 2.3’teki yığın fikri burada da aynıdır — fark yalnızca sözdizimidir: push/pop yerine tepe ve BOS ile LIFO davranışı elle kurulur. Gerçek oyun motorlarında da «maksimum N kayıtlı geri al» veya «en fazla N açık menü» gibi üst sınırlar sıkça sabittir; taşmayı engellemek için kapasite baştan kesilir.

Dikkat: Boş işaretçisi geçerli bir oyun değeriyle çakışmamalıdır. Tahmin aralığı 1–10 iken BOS = -1 uygundur; skor 0 da anlamlıysa 0 boş anlamına gelemez. String listelerinde sıkça "" veya "BOS" kullanılır.

Kule kurma ve skor geçmişi gibi örnekler push / pop ile yazılır (kısa ve okunaklıdır). Sabit slot / yığın modeli, metot bilmeden yığın kurmak, «maksimum N yer» kuralını gömmek veya sabit boyutlu dizi zorunluluğu olan dilleri anlamak için bilinmelidir.

Ne isteniyor? (kısa): push / pop kullanmadan «aynı işi başka sözdizimiyle yaz» demek değil. Yukarıdaki sabit slot + tepe modeli zaten yiginEkle / yiginCikar ile duruyor. Sıra Sizde’de bu modeli çalışan bir mini sketch’te göreceksiniz; sizin göreviniz listenin görselini Görsel 1’deki gibi slot kutularına çevirmek.

Görsel 1. Sabit envanter — slotlar ve tepe
Görsel 1. Sabit envanter — slotlar ve tepe

Kod bloğu: Mini envanter — tıkla ekle / sol üstten çıkar (push/pop yok).

Kod 3.

javascript
const MAKS = 5;const BOS = ""; let envanter = [BOS, BOS, BOS, BOS, BOS]; // length her zaman 5let tepe = 0;let esyalar = ["kilic", "iksir", "anahtar", "kalkan", "harita"]; function setup() {  createCanvas(520, 200);  textAlign(CENTER, CENTER);} function draw() {  background(245);  fill(40);  textSize(14);  textAlign(LEFT, TOP);  text("Sol tık: eşya ekle | Sol üst kutu: çıkar | length = " + envanter.length, 12, 10);  text("tepe = " + tepe, 12, 32);   // Sol üst: çıkar  fill(120, 80, 80);  rect(0, 160, 40, 40);  fill(255);  textAlign(CENTER, CENTER);  textSize(11);  text("ÇIKAR", 20, 180);   // Şimdilik yalnızca metin listesi — Sıra Sizde'de bunu Görsel 1 gibi slotlara çevireceksiniz  textAlign(LEFT, TOP);  textSize(14);  fill(30);  for (let i = 0; i < MAKS; i = i + 1) {    let yazi = envanter[i];    if (yazi === BOS) {      yazi = "(boş)";    }    text("[" + i + "] " + yazi, 60, 70 + i * 20);  }} function mousePressed() {  if (mouseX < 40 && mouseY > 160) {    yiginCikar();    return;  }  // Sıradaki eşyayı ekle (döngüsel)  let ad = esyalar[tepe % esyalar.length];  yiginEkle(ad);} function yiginEkle(deger) {  if (tepe >= MAKS) {    return false;  }  envanter[tepe] = deger;  tepe = tepe + 1;  return true;} function yiginCikar() {  if (tepe === 0) {    return BOS;  }  tepe = tepe - 1;  let eski = envanter[tepe];  envanter[tepe] = BOS;  return eski;}

Sketch’i çalıştırın: birkaç kez tıklayın, ÇIKAR ile geri alın. Konsolda veya ekranda envanter.length’in hep 5 kaldığını görün — push/pop olmadığı için dizi büyüyüp küçülmez; doluluk tepe ile izlenir.

Sıra Sizde: Yukarıdaki mini envanter kodunu temel alın. draw içindeki metin listesini kaldırıp Görsel 1’e benzer 5 yan yana dikdörtgen slot çizin.

İstenenler:

  1. Dolu slot (envanter[i] !== BOS): dolu kutu + eşya adı.
  2. Boş slot: soluk / kesik çizgili çerçeve + «BOS» (veya boş bırakın).
  3. tepe indeksinin altına küçük bir üçgen veya ok koyun (sonraki boş slotu göstersin; tepe === MAKS iken en sağda veya «dolu» yazın).
  4. yiginEkle / yiginCikar ve mousePressed mantığına dokunmayın — yalnızca çizimi değiştirin. envanter.length hâlâ 5 olmalı.

3.2. Paralel dizilerle mini sahne — balonlar

2.2’de paralel diziler ve ellipse hatırlatması yapıldı; 2.3’te push / pop ile liste büyüyüp küçüldü. Bu alt başlıkta ikisini birleştirip oval balon sahnesi kurulur: konum için balonX / balonY, boyut için ayrı balonRX / balonRY (yatay ve dikey yarıçap) — hepsi aynı indekste.

Hatırlatma: ellipse(x, y, genislik, yukseklik) — genişlik = 2 * rx, yükseklik = 2 * ry. Daire istiyorsanız rx === ry (veya circle); Görsel 2’deki gibi oval balonlar için rx ile ry farklıdır.

Sık karşılaşılan dizi hataları:

Tablo 3.

Belirti Olası neden Çözüm
undefined ekranda Geçersiz indeks (d[3] üç elemanlı dizide) i < dizi.length koşulunu kontrol et
Döngü hiç çalışmıyor i <= length sınır aşımı i < length kullan
push sonrası liste görünmüyor draw() içinde dolaşma yok for ile ekrana yazdır
Tüm balonlar üst üste / garip boyut Paralel dizide indeks kayması Aynı i ile X, Y, RX, RY oku
Bir balon «kaybolmuş» gibi Yalnızca bir diziye push / pop Ekleme-çıkarma tüm paralel dizilerde birlikte

Dikkat: Paralel dizilerde push yalnızca bir listeye uygulanırsa listeler farklı uzunlukta kalır. balonX.push(mouseX) yapıp balonY / balonRX / balonRY unutulursa döngü undefined okur. Ekleme ve çıkarma her listede birlikte yapılmalıdır.

Sıra Sizde: Paralel dizilerle bir balon sahnesi çizin. Hedef görünüm:

Görsel 2. Hedef — paralel dizilerle oval balonlar (rx, ry)
Görsel 2. Hedef — paralel dizilerle oval balonlar (rx, ry)

İstenenler:

  1. balonX, balonY, balonRX, balonRY (isteğe bağlı renk dizisi) — aynı indekste bir balon.
  2. for içinde ellipse(balonX[i], balonY[i], balonRX[i] * 2, balonRY[i] * 2) (ip için kısa bir line bonus).
  3. Kâğıtta: yalnızca balonX.push(...) yapıp diğer üç diziyi unutan bir arkadaşın ekranında ne bozulur? Bir cümleyle yazın.

Örnek Olay: Kule yığını Tahmini etkinliği tamamlama süresi: 20–25 dakika.

Senaryo: Mini kule sketch’inde üç kule kurulmuş, sonra bir kez GERİ AL’a basılmıştır. Dizilerde ne kalır, ekranda kaç kule görünür?

Tartışma Soruları:

Yapay Zekâ Etkileşimi: Balon Patlat — sen yaz, YZ yardımcı fonksiyon yazsın Tahmini etkinliği tamamlama süresi: 45–60 dakika.

Amaç: Oyun mekaniğini (siz yazın); nokta–elips testi, çakışmasız yeni balon ve uyumlu renk gibi yardımcı fonksiyonları YZ’den isteyin; en sonda çalışan oyunu YZ ile makyajlayın (patlama / belirme efektleri). Boş slot / -1 yok — ekleme push, silme splice (veya sondaysa pop).

splice (kısa): dizi.splice(i, 1) indeksi i olan elemanı çıkarır (length bir azalır). pop() yalnızca sondan çıkarır; ortadaki balonu patlatmak için splice gerekir. Paralel dizilerde aynı i için her listede splice(i, 1) çağrılır.

Oyun fikri (kısa): Oval balonlar (balonX, balonY, balonRX, balonRY; isteğe bağlı balonR, balonG, balonB). Tıklama bir balonun içindeyse o indeks tüm dizilerden splice ile çıkar, skor artar. Değilse YZ’nin ürettiği yardımcılarla yeni, diğerlerine değmeyen bir balon push edilir.

Adım 1 — Sizin kodunuz (oyun mekaniği): Web Editor’de şunları kendiniz yazın:

Adım 2 — YZ’den üç yardımcı fonksiyon: Aşağıdaki istemleri ayrı ayrı (veya tek seferde üç fonksiyon diye) verin. Dönüş için dizi kullanın — bu ana başlıkta nesne literal ({ x: … }) henüz yok; [x, y, rx, ry] yeter ([0]→x, [1]→y, [2]→rx, [3]→ry).

Örnek istem A — nokta elips içinde mi? "p5.js için fonksiyon yaz: noktaElipsIcindeMi(px, py, cx, cy, rx, ry) → boolean. (px,py) noktası, merkezi (cx,cy), yatay yarıçap rx, dikey yarıçap ry olan elipsin içinde mi? Elips denklemi kullan. Kısa yorum ekle. Class / nesne literal yok."

Örnek istem B — çakışmasız yeni balon: "Fonksiyon: yeniBalonOlustur(balonX, balonY, balonRX, balonRY, tuvalW, tuvalH). Rastgele konum ve rx/ry üret; balon tamamen tuval içinde kalsın; mevcut balonlardan hiçbirine değmesin (elips–elips veya güvenli daire yaklaşımı). Birkaç deneme yapsın; yer bulamazsa null dönsün. Dönüş: dizi [x, y, rx, ry] — nesne literal kullanma. Parametre olarak mevcut paralel dizileri ve tuval boyutlarını alsın."

Örnek istem C — uyumlu renk (isteğe bağlı): "Fonksiyon: uyumluBalonRengi() → [r, g, b] (0–255). Pastel / birbirine uyumlu canlı renkler üretsin (ör. sabit doygunluk, rastgele ton). color() nesnesi yerine sayı dizisi dön."

Adım 3 — Birleştirme (siz): YZ fonksiyonlarını sketch’e yapıştırın. mousePressed içinde örneğin:

Kod 4.

javascript
// iskelet — indeksi siz bulun, splice / push siz yazınlet vurus = -1;for (let i = 0; i < balonX.length; i = i + 1) {  if (noktaElipsIcindeMi(mouseX, mouseY, balonX[i], balonY[i], balonRX[i], balonRY[i])) {    vurus = i;    break;  }}if (vurus >= 0) {  // tüm paralel dizilerde splice(vurus, 1); skor++} else {  let b = yeniBalonOlustur(balonX, balonY, balonRX, balonRY, width, height);  if (b !== null) {    // b[0]..b[3] → push; renk için uyumluBalonRengi()  }}

Adım 4 — Kontrol / eleştirel bakış:

Oyun mekanik olarak çalışıyorsa (patlat / ekle / skor) Adım 5’e geçin. İsterseniz süzülme (balonY[i] = balonY[i] - 0.5) gibi ufak bir mekaniği de kendiniz ekleyebilirsiniz.

Adım 5 — Makyaj (YZ): Mantık bittikten sonra çalışan sketch’in tamamını yapıştırıp görsel + ses cilasını YZ’ye bırakın. Amaç oyunu yeniden yazmak değil; patlama / belirme hissi ve kısa geri bildirim sesleri katmak.

Örnek istem — efektli makyaj (+ ses + açıklama): "Aşağıdaki p5.js Balon Patlat sketch’im çalışıyor (paralel diziler, splice/push, skor). Mekaniği bozma; class kullanma; paralel dizi modelini koru.

Yapılacaklar:

  1. Balon patlayınca hemen splice etme — kısa kaybolma animasyonu (küçülme ve/veya alfa; parçacık/halka bonus olabilir).
  2. Yeni balon eklenince büyüme veya fade-in ile belirsin.
  3. Patlamada ve yeni balon eklenince kısa ses efekti (p5.sound veya basit sentez / Oscillator; Web Editor’de çalışacak şekilde; dosya yoksa sentez tercih et).

Ayrıca yanıtında şunları iste:

A) Önce sözel olarak: balon patlatma için kaç farklı efekt türü düşünülebilir? (ör. küçülerek kaybolma, alfa solma, parçacık saçılma, genişleyen halka, titreme…) Her türü 1–2 cümleyle anlat.

B) Her tür için bu sketch’e uygun, kısa örnek kod parçası yaz (hepsini birden uygulamana gerek yok; birini seçip tam koda entegre et, diğerlerini örnek olarak göster).

C) En sonda: benim orijinal koda göre neleri değiştirdin / ekledin listesini yaz. Her maddeyi bu ders düzeyinde açıkla (dizi, for, push/splice, fonksiyon — henüz bilmediğimiz class/nesne jargonundan kaçın).

Kod:"

(Ardından kendi sketch’inizi yapıştırın.)

YZ’nin önerdiği animasyon için çoğu zaman ekstra diziler gerekir (ör. balonOlcek, balonAlfa veya «patlıyor» durumu). Bunları eklerken indekslerin hâlâ birlikte push / splice edildiğini kontrol edin. Ses için ek kütüphane / userStartAudio() gibi satırlar gelebilir — Play’e bastıktan sonra ilk tıklamada sesin açılması normaldir. Efekt abartılıysa sadeleştirin; skor ve tıklama mantığı bozulmamalı.

Adım 6 — Önce fikir, sonra (isterseniz) kod: YZ’nin Adım 5’teki «neleri değiştirdim» listesini okuyun. Anlamadığınız bir satır varsa devam sorusu sorun (ör. «Şu eklediğin balonAlfa dizisini, bu dersteki paralel dizi diliyle tekrar açıkla.»).

Ardından oyunu daha ileri taşımak için önce yalnızca fikir isteyin — henüz kod istemeyin:

Örnek istem — başka nasıl makyajlarız? (yalnızca fikir) "Bu Balon Patlat oyununu (paralel diziler, patlat/ekle, skor) daha eğlenceli yapmak için 6–8 makyaj / cilâ fikri öner. Görsel, ses, arayüz ve hafif oyun hissi karışık olsun. Her fikir için kısa sözel açıklama ve zorluk (kolay/orta) yaz. Kod yazma; yalnızca fikir kataloğu."

Beğendiğiniz bir (veya birkaç) fikri uygulamaya dökmek isterseniz, mevcut sketch’inizi yapıştırıp uygun bir prompt yazın; yapılan makyajın kodunu sizin şu anki bilgi düzeyinizde açıklamasını isteyin. Anlamadığınız noktalarda devam soruları sorun.

Örnek istem — seçilen fikri uygula + açıkla: "Şu makyaj fikrini mevcut koda ekle: [fikri buraya yaz]. Mekaniği bozma. Bitince: (1) eklediğin/değiştirdiğin yerleri madde madde listele, (2) her maddeyi dizi, for, push/splice, fonksiyon dilinde, yeni başlayan düzeyinde açıkla. Kod:"

Hatırlatma: YZ bazen bu derste henüz görmediğiniz yapılara (ör. daha ileri animasyon, ses API’si, alışık olmadığınız sözdizimi) kayabilir. Bir parçayı «şu anki düzeyimde anlamıyorum, daha basit anlat veya o kısmı sadeleştir» diyerek geri itmek doğaldır; her satırı hemen kavramak zorunda değilsiniz. Anladığınız katmanı tutup, kalanını sonraki konulara bırakabilirsiniz.

Yapay Zekâ Etkileşimi: Paralel Diziden Nesneye Tahmini süre: 15–20 dakika.

Amaç: Paralel dizilerin nesne literaline eşlenmesini görmek.

Adım 1: x[i], y[i], r[i] için bir nesne şekli ({x,y,r}) tasarlayın. Adım 2: Yapay zekâdan paralel dizi ↔ nesne dizisi dönüşüm iskeleti isteyin; henüz sınıf kullanmayın. Adım 3: Hangi modelin bu aşamada daha okunur olduğunu bir cümleyle not edin.

Özet

Sabit kapasitede dizi, baştan istenen sayıda eleman içerecek biçimde (ör. [BOS, BOS, BOS, BOS]) tanımlanır; canlı eleman sayısı tepe benzeri bir değişkenle izlenir. Ekleme tepeye yazar ve tepeyi artırır; silme tepeyi azaltır — push/pop yerine indeks aritmetiği vardır. Bu model, nesne havuzu düşüncesine de köprüdür.

Paralel x[], y[], r[] dizileri aynı i ile bir balonu veya hedefi tanımlar. draw içinde i < tepe (veya length) kadar dolaşıp güncelleme ve çizim yapılır. Mini sahne, diziyi görünür oyun davranışına bağlar: çoklu konum, basit kural, okunabilir döngü. Bu alışkanlık olmadan sonraki çarpışma ve klavye kontrollü çoklu varlıklar zorlaşır.

İki modelin maliyeti farklıdır. Dinamik listede silme işlemi kalan elemanları kaydırdığı için indeksler değişir; döngü içinde eleman çıkarmak, atlanan eleman gibi ince hatalara yol açar. Sabit kapasitede ise dizi hiç küçülmez, yalnızca tepe değeri oynar; bu yüzden indeksler kararlıdır ve döngü sınırı her frame'de aynı biçimde okunur. Kapasitenin dolması ayrı bir karardır: yeni eleman ya reddedilir ya da en eskisinin üzerine yazılır. Bu seçim, oyunun kuralına göre baştan belirlenir.

Neler Öğrendik?

Soru 1 Sabit kapasite modelinde tepe tipik olarak neyi tutar?

A) Tuval rengini

B) Canlı / geçerli eleman sayısına giden sınırı

C) DNS adresini

D) CSS sınıfını

E) EPUB kapak adını

Soru 2 Paralel x ve y dizilerinde aynı indeks ne anlama gelir?

A) İki farklı oyunun skoru

B) Aynı varlığın ilişkili özellikleri

C) Rastgele iki tarayıcı

D) Zorunlu ses kanalı

E) Git commit

Soru 3 Mini sahnede diziyi draw içinde dolaşmanın amacı nedir?

A) Her varlık için güncelleme ve çizimi tekrarlamak

B) setup’ı silmek

C) HTML’i kapatmak

D) Renk körlüğü testi

E) Yazıcıya göndermek

Soru 4 push/pop yerine sabit kapasite seçmek ne sağlar?

A) Üst sınırın ve döngünün öngörülebilir kalması

B) Matematiğin kalkması

C) Farein kapanması

D) Zorunlu 3B

E) Sunucu kurulumu

Neler Öğrendik Yanıt Anahtarı

Soru 1: Doğru Cevap: B

Soru 2: Doğru Cevap: B

Soru 3: Doğru Cevap: A

Soru 4: Doğru Cevap: A

Yararlanılan Kaynaklar

Bu içerik aşağıdaki kaynaklardan derlenerek hazırlanmıştır: