Ek: Üç aşamalı not takip uygulaması

Üç aşamalı not takip uygulaması

Bu çalışmada tek bir programı dönem boyunca üç aşamada büyüteceksiniz. Her aşamada, bir önceki aşamada çalışır hâle getirdiğiniz programın üzerine yazarsınız. Her aşamanın bir kabul kriterleri listesi var: programın o aşamada neleri doğru yapması gerektiğini madde madde sayar. Aşama, bu maddelerin hepsi sağlandığında biter.

Bu büyük bir dönem projesi değil. Her aşamada programa yalnız o sırada öğrendiğiniz konuyu eklersiniz: önce fonksiyonları, sonra kayıtları, en son dosya okumayı ve hata yakalamayı.

Problem

Bir ders için öğrenci adlarını ve 0–100 arası puanları tutan küçük bir program yazacaksınız. Program geçerli puanları kabul edecek, ortalamayı hesaplayacak ve başarılı öğrencileri gösterecek.


Aşama 1: Fonksiyonlarla düzenle

Zaman: 7. bölümden sonra.

Başlangıç verisi:

puanlar = [70, 85, 40, 100]

Aşağıdaki fonksiyonları yazın:

def puan_gecerli_mi(puan):
    ...


def ortalama_hesapla(puanlar):
    ...


def basarili_mi(puan, sinir=50):
    ...

Kabul kriterleri

  1. puan_gecerli_mi(0) ve puan_gecerli_mi(100) True döndürür.
  2. puan_gecerli_mi(-1) ve puan_gecerli_mi(101) False döndürür.
  3. Puan listesi boşsa ortalama_hesapla([]) hata vermez, None döndürür.
  4. [60, 80] ortalaması 70 olur.
  5. Başarı sınırı varsayılan olarak 50’dir ve anahtar kelime argümanıyla (sinir=60 gibi) değiştirilebilir.

En az şu kontrolleri çalıştırın

assert puan_gecerli_mi(0)
assert puan_gecerli_mi(100)
assert not puan_gecerli_mi(101)
assert ortalama_hesapla([60, 80]) == 70
assert ortalama_hesapla([]) is None
assert basarili_mi(50)
assert basarili_mi(60, sinir=60)

Teslim

  • asama1.py
  • 3–5 cümle: Hangi fonksiyon hangi işi yapıyor?

Aşama 2: Kayıtlara dönüştür

Zaman: 11. bölümden sonra.

Bu aşamada puan listesi yerine öğrenci kayıtlarıyla çalışın:

ogrenciler = [
    {"no": 101, "ad": "Ada", "puanlar": [70, 85, 90]},
    {"no": 102, "ad": "Ece", "puanlar": [45, 55, 50]},
    {"no": 103, "ad": "Can", "puanlar": []},
]

Aşama 1 fonksiyonlarını mümkün olduğunca yeniden kullanın. Şunları ekleyin:

def ogrenci_bul(ogrenciler, no):
    ...


def ogrenci_ortalamasi(ogrenci):
    ...


def basarili_ogrenciler(ogrenciler, sinir=50):
    ...

Kabul kriterleri

  1. ogrenci_bul(..., 102) Ece’nin kaydını döndürür.
  2. Olmayan bir öğrenci numarası için None döner.
  3. Puanı olmayan öğrencinin ortalaması None olur, 0 sayılmaz.
  4. Başarılı öğrenci listesi öğrencilerin adlarını ya da kayıtlarını tutabilir. Hangisini seçtiyseniz programın her yerinde onu kullanın.
  5. Yalnız rapor hazırlamak için özgün ogrenciler listesi değiştirilmez.
  6. Aynı öğrenci numarası iki kayıtta geçerse neden sorun çıkacağını açıklayın.

Önerilen kontroller

assert ogrenci_bul(ogrenciler, 102)["ad"] == "Ece"
assert ogrenci_bul(ogrenciler, 999) is None
assert ogrenci_ortalamasi(ogrenciler[2]) is None
assert ogrenci_ortalamasi(ogrenciler[0]) == 81.66666666666667

Ondalıklı sayıyı daha okunaklı karşılaştırmak isterseniz round(..., 2) kullanabilirsiniz.

Teslim

  • asama2.py
  • Bir tablo: normal bir durum, bir sınır değeri ve bir geçersiz durum için en az birer test.

Aşama 3: Dosyadan oku, hataları yakala

Zaman: 13. bölümden sonra.

Programı iki modüle ayırın:

not_takip/
├── main.py
├── islemler.py
└── ogrenciler.csv

Örnek ogrenciler.csv:

101,Ada,70,85,90
102,Ece,45,55,50
103,Can
104,Deniz,80,abc,100

İstenen davranış

  • Dosyayı UTF-8 kodlamasıyla okuyun.
  • Her satırın ilk iki alanı no ve ad, kalan alanlar puandır.
  • Sayıya çevrilemeyen bir puan programı durdurmamalı.
  • Hatalı puanı olan bir kayıtla ne yapacağınıza karar verin ve tek bir kural seçin:
    • Hatalı puanı atla, kaydın geri kalanını koru; ya da
    • Kaydın tamamını reddet ve anlaşılır bir hata mesajı yazdır.
  • Seçtiğiniz kuralı kısa açıklamanıza yazın ve kodda da aynen uygulayın.
  • Hataları türüyle yakalayın: dosya bulunamazsa FileNotFoundError, sayıya çevrilemeyen alan için ValueError. Her except yalnız beklediğiniz hatayı yakalasın.
  • Çıktı olarak her öğrencinin adını ve ortalamasını yazdırın; ortalama yoksa Puan yok yazdırın.

Kabul kriterleri

  1. Geçerli bir CSV satırı, doğru alanları olan bir sözlüğe dönüşür.
  2. Puanı olmayan 103,Can satırı geçerli bir kayıt sayılır ve ortalaması None olur.
  3. abc alanı seçtiğiniz kurala göre işlenir.
  4. Dosya bulunmadığında kullanıcı uzun bir traceback yerine kısa ve anlaşılır bir mesaj görür. Başka programlama hataları her hatayı yakalayan bir except Exception ile gizlenmez.
  5. Aşama 1 ve 2’deki hesaplama fonksiyonları olabildiğince değiştirilmeden kullanılır.
  6. main.py dosyayı okur ve raporu yazdırır. islemler.py ise başka programlarda da kullanılabilecek hesaplama fonksiyonlarını tutar.

Zorunlu doğrulama

En az şu dört durumu ayrı ayrı deneyin:

  • Normal dosya,
  • Puanı olmayan öğrenci,
  • Sayısal olmayan puan,
  • Olmayan dosya yolu.

Son kısa açıklama

En fazla 150 kelimeyle şunları yanıtlayın:

  1. Program üç aşamada nasıl değişti?
  2. Hangi fonksiyonu/modülü değiştirmeden yeniden kullanabildiniz?
  3. En önemli sınır veya hata durumu neydi?
  4. Programa tek bir iyileştirme daha yapacak olsanız hangisini seçerdiniz?
ImportantAI kullanıyorsanız

AI’dan bir hata mesajını açıklamasını ya da küçük bir düzeltme önermesini isteyebilirsiniz, ama kabul kriterlerini kendiniz deneyin. AI’ın önerdiği kodun hangi satırı neden değiştirdiğini açıklayamıyorsanız o değişikliği bitmiş saymayın.

Back to top