133 lines
4.9 KiB
Plaintext
133 lines
4.9 KiB
Plaintext
# 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())
|