Files

211 lines
4.7 KiB
Markdown
Raw Permalink Normal View History

---
baslik: Yapılar
bolum: Kendi türlerin
ozet: yapi ile ilgili verileri tek bir türde toplamak
---
Bir kitabın adı, yazarı, sayfa sayısı ve yılı birbirine aittir. Bunları dört ayrı değişkende ya da dört ayrı listede tutmak çabuk karışır. `yapi` ile kendi türünü tanımlar, bu bilgileri tek bir değerde toplarsın.
## Yapı tanımlamak
Yapının her alanına bir varsayılan değer verirsin; alanın türü bu değerden anlaşılır.
```kbl
yapi Kitap:
ad = ""
yazar = ""
sayfa = 0
yil = 0
k = Kitap("Kuyucaklı Yusuf", "Sabahattin Ali", 232, 1937)
yazdir(k.ad)
yazdir(k.sayfa)
yazdir(k)
```
```cikti
Kuyucaklı Yusuf
232
Kitap(ad: Kuyucaklı Yusuf, yazar: Sabahattin Ali, sayfa: 232, yil: 1937)
```
`Kitap(...)` yeni bir nesne oluşturur; değerler alanların tanım sırasıyla verilir. Alanlara `nesne.alan` diye ulaşırsın.
## Nesne oluşturmanın yolları
Boş bir nesne oluşturup alanları sonra da doldurabilir, ya da yalnız bazı alanları adıyla verebilirsin. Verilmeyen alanlar varsayılan değerinde kalır.
```kbl
yapi Kitap:
ad = ""
yazar = ""
sayfa = 0
k1 = Kitap()
k1.ad = "Çalıkuşu"
k1.sayfa = 544
yazdir(k1)
k2 = Kitap(ad="İnce Memed", yazar="Yaşar Kemal")
yazdir(k2)
```
```cikti
Kitap(ad: Çalıkuşu, yazar: , sayfa: 544)
Kitap(ad: İnce Memed, yazar: Yaşar Kemal, sayfa: 0)
```
## Metotlar
Yapının içine fonksiyon yazabilirsin; bunlara **metot** denir. Yapı metotları alanlara doğrudan adıyla ulaşır.
```kbl
yapi Urun:
ad = ""
fiyat = 0.0
adet = 0
fonksiyon tutar() -> ondalik:
don fiyat * adet
fonksiyon etiket() -> metin:
don f"{ad} x{adet}: {tutar():.2f} TL"
u = Urun("Defter", 24.5, 3)
yazdir(u.tutar())
yazdir(u.etiket())
u.adet = 5
yazdir(u.etiket())
```
```cikti
73.5
Defter x3: 73.50 TL
Defter x5: 122.50 TL
```
## Nesne listesi
Yapılar listelerde tutulabilir. Böylece bir tabloyu çok rahat işlersin.
```kbl
yapi Ogrenci:
ad = ""
puan = 0
sinif_listesi = [Ogrenci("Ayşe", 88), Ogrenci("Mehmet", 64), Ogrenci("Elif", 92)]
sinif_listesi.ekle(Ogrenci("Can", 47))
en_iyi = sinif_listesi[0]
dongu o icinde sinif_listesi:
durum = "geçti" eger o.puan >= 50 degilse "kaldı"
yazdir(f"{o.ad:<8}{o.puan:>4} {durum}")
eger o.puan > en_iyi.puan:
en_iyi = o
yazdir(f"En yüksek puan: {en_iyi.ad} ({en_iyi.puan})")
```
```cikti
Ayşe 88 geçti
Mehmet 64 geçti
Elif 92 geçti
Can 47 kaldı
En yüksek puan: Elif (92)
```
## Karşılaştırmak
İki yapı nesnesi, bütün alanları eşitse eşittir.
```kbl
yapi Nokta:
x = 0
y = 0
a = Nokta(3, 4)
b = Nokta(3, 4)
c = Nokta(0, 4)
yazdir(a == b)
yazdir(a == c)
```
```cikti
doğru
yanlış
```
## Atama bir kopya oluşturur
Bir yapı nesnesini başka bir değişkene atamak **kopyasını** oluşturur. Kopyayı değiştirmek aslını etkilemez.
```kbl
yapi Nokta:
x = 0
y = 0
a = Nokta(1, 2)
b = a
b.x = 99
yazdir(a.x)
yazdir(b.x)
```
```cikti
1
99
```
> **Dikkat:** Aynı kural fonksiyonlar için de geçerli: bir fonksiyona yapı verirsen fonksiyon kopyasını değiştirir. Nesnenin kendisini değiştirmek istiyorsan işi yapının **metodu** olarak yaz (bir sonraki ders), ya da değiştirilmiş nesneyi döndürüp yeniden ata.
> **İpucu:** Tür adlarını büyük harfle başlat (`Kitap`, `Ogrenci`); değişken adlarını küçük harfle. `Hata`, `Liste`, `Metin` gibi bazı adlar dilin kendi türlerine ayrılmıştır, onları seçme.
## Alıştırma
```alistirma
`Dikdortgen` adında, `en` ve `boy` alanları (varsayılan 0) ile `alan()` ve `cevre()` metotları olan bir yapı tanımla. `Dikdortgen(6, 4)` için alanı ve çevreyi aynı satırda yazdır.
%%%
# buraya yaz
d = Dikdortgen(6, 4)
yazdir(d.alan(), d.cevre())
%%%
yapi Dikdortgen:
en = 0
boy = 0
fonksiyon alan() -> sayi:
don en * boy
fonksiyon cevre() -> sayi:
don 2 * (en + boy)
d = Dikdortgen(6, 4)
yazdir(d.alan(), d.cevre())
%%%
24 20
```
```alistirma
Verilen `Film` yapısıyla bir liste oluşturulmuş. 1990'dan sonra çıkan filmlerin adlarını ve hepsinin toplam süresini yazdır.
%%%
yapi Film:
ad = ""
yil = 0
sure = 0
filmler = [Film("Eşkıya", 1996, 128), Film("Selvi Boylum Al Yazmalım", 1977, 90), Film("Kış Uykusu", 2014, 196)]
toplam_sure = 0
# buraya yaz
%%%
yapi Film:
ad = ""
yil = 0
sure = 0
filmler = [Film("Eşkıya", 1996, 128), Film("Selvi Boylum Al Yazmalım", 1977, 90), Film("Kış Uykusu", 2014, 196)]
toplam_sure = 0
dongu f icinde filmler:
eger f.yil > 1990:
yazdir(f.ad)
toplam_sure += f.sure
yazdir(f"Toplam süre: {toplam_sure} dakika")
%%%
Eşkıya
Kış Uykusu
Toplam süre: 414 dakika
```