- dersler/: 29 kısa ders (açıklama, çalıştırılabilir örnek, alıştırma). Her örneğin ve alıştırma çözümünün çıktısı Online IDE'nin hazırlık adımında gerçekten koşulup dosyadakiyle karşılaştırılır; biçim dersler/BICIM.md. - temeller/: tek konulu 12 başlangıç programı. - web/anket, web/kisalt, web/pano: port PORT ortam değişkeninden okunur (Online IDE önizlemesi 8080 verir), yoksa eski sabit port. - README: öğrenme bölümü, Online IDE bağlantısı.
211 lines
4.7 KiB
Markdown
211 lines
4.7 KiB
Markdown
---
|
|
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
|
|
```
|