--- 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 ```