Files
ornekler/temeller/10-yapilar/yapilar.kbl
T

133 lines
4.9 KiB
Plaintext
Raw Normal View History

# Yapılar ve sınıflar: kendi türünü tanımlamak, metotlar ve nesne listeleri
#
# Bir kitabın adı, yazarı, sayfa sayısı ve yılı birbirine aittir. Bunları dört
# ayrı değişkende tutmak yerine tek bir "Kitap" türünde toplarız.
# yapi : ilgili verileri (alanları) ve onlarla çalışan fonksiyonları bir arada tutar
# sinif : yapıya ek olarak kurucu (kur) ve self ile çalışan metotlar sunar
# ── yapi: alanlar ve metotlar ─────────────────────────────────
# Her alana bir varsayılan değer verilir; alanın türü bu değerden anlaşılır.
# Yapının içindeki fonksiyonlara metot denir. Metotlar alanlara doğrudan adıyla ulaşır.
yapi Kitap:
ad = ""
yazar = ""
sayfa = 0
yil = 0
fonksiyon ozet() -> metin:
don f"{ad} ({yazar}, {yil})"
fonksiyon okuma_suresi(gunluk_sayfa: sayi) -> sayi:
# Kalan sayfaları da saymak için yukarı yuvarlıyoruz.
don (sayfa + gunluk_sayfa - 1) // gunluk_sayfa
# ── sayilabilir: sınırlı seçenekler ───────────────────────────
# Bir değişken yalnız belli değerleri alabiliyorsa sayilabilir kullanılır.
# Yanlış yazılan bir üye (Durum.KAYIP gibi) program çalışmadan yakalanır.
sayilabilir Durum:
RAFTA
ODUNCTE
# ── sinif: kurucu ve self ─────────────────────────────────────
# kur(self, ...) nesne oluşturulurken çalışır. self "bu nesnenin kendisi" demektir;
# self.ad, bu okuyucunun adı alanıdır.
sinif Okuyucu:
ad = ""
okunan_sayfa = 0
kitap_sayisi = 0
fonksiyon kur(self, ad_: metin):
self.ad = ad_
# Metot nesnenin kendi alanlarını değiştirir; değişiklik kalıcıdır.
fonksiyon bitirdi(self, k: Kitap):
self.okunan_sayfa = self.okunan_sayfa + k.sayfa
self.kitap_sayisi = self.kitap_sayisi + 1
fonksiyon rapor(self) -> metin:
don f"{self.ad}: {self.kitap_sayisi} kitap, toplam {self.okunan_sayfa} sayfa"
# ════════════════ Program buradan başlıyor ════════════════
# ── Nesne oluşturmak ──────────────────────────────────────────
# Yol 1: boş nesne oluşturup alanları tek tek doldurmak.
k1 = Kitap()
k1.ad = "Çalıkuşu"
k1.yazar = "Reşat Nuri Güntekin"
k1.sayfa = 544
k1.yil = 1922
# Yol 2: alanları tanım sırasıyla vermek (ad, yazar, sayfa, yil).
k2 = Kitap("Kuyucaklı Yusuf", "Sabahattin Ali", 232, 1937)
yazdir(k1.ozet())
yazdir(k2.ozet())
yazdir(f"{k2.ad} günde 20 sayfayla {k2.okuma_suresi(20)} günde biter.")
# Yapıyı doğrudan yazdırınca bütün alanları görünür.
yazdir(k2)
yazdir()
# ── Nesne listesi ─────────────────────────────────────────────
raf = [k1, k2]
raf.ekle(Kitap("İnce Memed", "Yaşar Kemal", 436, 1955))
raf.ekle(Kitap("Tutunamayanlar", "Oğuz Atay", 724, 1972))
raf.ekle(Kitap("Saatleri Ayarlama Enstitüsü", "Ahmet Hamdi Tanpınar", 382, 1961))
yazdir(f"{'Kitap':<30}{'Yazar':<22}{'Yıl':>5}{'Sayfa':>7}")
yazdir("─".tekrarla(64))
dongu k icinde raf:
yazdir(f"{k.ad:<30}{k.yazar:<22}{k.yil:>5}{k.sayfa:>7}")
yazdir()
# Listedeki nesnelerin alanlarıyla hesap: en kalın kitap ve toplam sayfa.
en_kalin = raf[0]
toplam_sayfa = 0
dongu k icinde raf:
toplam_sayfa += k.sayfa
eger k.sayfa > en_kalin.sayfa:
en_kalin = k
yazdir(f"Raftaki {raf.uzunluk()} kitap toplam {toplam_sayfa:,} sayfa.")
yazdir(f"En kalını: {en_kalin.ozet()}, {en_kalin.sayfa} sayfa")
# Yıla göre sıralama: her adımda kalan kitapların en eskisini öne alıyoruz (seçmeli sıralama).
i = 0
iken i < raf.uzunluk():
en_eski = i
j = i + 1
iken j < raf.uzunluk():
eger raf[j].yil < raf[en_eski].yil:
en_eski = j
j += 1
gecici = raf[i]
raf[i] = raf[en_eski]
raf[en_eski] = gecici
i += 1
yazdir("Yayın yılına göre:")
dongu k icinde raf:
yazdir(f" {k.yil} {k.ad}")
yazdir()
# ── sayilabilir değerlerle çalışmak ───────────────────────────
durum = Durum.RAFTA
yazdir(f"{k2.ad}: {durum}")
durum = Durum.ODUNCTE
eger durum == Durum.ODUNCTE:
yazdir(f"{k2.ad} şu an ödünç verildi.")
yazdir()
# ── Sınıf nesnesiyle çalışmak ─────────────────────────────────
# Okuyucu("Elif") yazınca kur(self, "Elif") çağrılır.
elif = Okuyucu("Elif")
emre = Okuyucu("Emre")
elif.bitirdi(raf[0])
elif.bitirdi(raf[2])
emre.bitirdi(raf[4])
# Her nesnenin kendi alanları vardır; Elif'in okuduğu Emre'yi etkilemez.
yazdir(elif.rapor())
yazdir(emre.rapor())