Özet - Öğrenci Kayıt Sistemi
Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 32 / 64.
Görev
OrtaBu meydan okumada, eksiksiz bir öğrenci kayıt yönetim sistemi uygulayacaksınız.
Bu meydan okumayı tamamlamak için iki dosyayı düzenlemeniz gerekiyor:
student.py- Uygun kapsülleme (encapsulation) ileStudentsınıfını uygulayınstudentregistry.py- Öğrencileri yönetmek içinStudentRegistrysınıfını uygulayın
Adım adım rehberlik için her dosyadaki ayrıntılı TODO yorumlarını takip edin. Uygulamanız, şunları doğrulayan kapsamlı test durumlarına karşı test edilecektir:
- Uygun öznitelik doğrulaması ve hata yönetimi
- Not ortalamalarının doğru hesaplanması
- Çeşitli öğrenci senaryoları ile kayıt defteri işlevselliği
- Sınır koşulları ve uç durumlar
Kopya kağıdı
Bu meydan okuma, uygun kapsülleme ve doğrulama ile nesne yönelimli programlama prensiplerini kullanarak eksiksiz bir öğrenci kayıt yönetim sistemi uygulamaya odaklanmaktadır.
Sistem iki ana bileşenden oluşmaktadır:
- Student sınıfı - Uygun kapsülleme ile bireysel öğrenci verilerini yönetir
- StudentRegistry sınıfı - Öğrenci koleksiyonlarını yönetir
Temel uygulama gereksinimleri şunları içerir:
- Uygun öznitelik doğrulaması ve hata yönetimi
- Not ortalamalarının doğru hesaplanması
- Birden fazla öğrenciyi yönetmek için kayıt defteri işlevselliği
- Sınır koşullarının ve uç durumların ele alınması
Kendin dene
from student import Student
from studentregistry import StudentRegistry
import time
import random
# Kapsamlı testler için test senaryosu işleyicisi
test_case = input()
if test_case == "default_test":
# Öğrencileri oluştur
student1 = Student(1001, "Alice Smith")
student2 = Student(1002, "Bob Johnson")
student3 = Student(1003, "Charlie Brown")
# Notları ekle
student1.add_grade("Math", 90)
student1.add_grade("Science", 85)
student1.add_grade("English", 92)
student2.add_grade("Math", 78)
student2.add_grade("Science", 80)
student2.add_grade("English", 85)
student3.add_grade("Math", 95)
student3.add_grade("Science", 91)
student3.add_grade("English", 89)
# Öğrenci kayıtlarını görüntüle
print("Student Records:")
student1.display_record()
print()
student2.display_record()
print()
student3.display_record()
print()
# İsim doğrulamasını test et
try:
student1.name = "J" # Çok kısa
except ValueError as e:
print(f"Name validation error: {e}")
print()
# Kayıt defterini oluştur ve öğrencileri ekle
registry = StudentRegistry()
registry.add_student(student1)
registry.add_student(student2)
registry.add_student(student3)
# Tüm öğrencileri görüntüle
print("All Students in Registry:")
registry.display_all()
print()
# En başarılı öğrenciyi getir
top_student = registry.get_top_student()
print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")
# Bir öğrenciyi sil
registry.remove_student(1002) # Bob'u sil
print("\
After removing student 1002:")
registry.display_all()
elif test_case == "empty_registry":
# Boş bir kayıt defterini test et
registry = StudentRegistry()
top_student = registry.get_top_student()
if top_student is None:
print("Top student in empty registry: None")
print("Displaying all students in empty registry:")
registry.display_all() # Hiçbir şey görüntülememeli
elif test_case == "validation_tests":
# Tüm doğrulama kurallarını test et
student = Student(1001, "Valid Name")
print(f"Created student with name: {student.name}")
# Boş isim test et
try:
student.name = ""
except ValueError as e:
print(f"Empty name test: {e}")
# Tek karakterli isim test et
try:
student.name = "A"
except ValueError as e:
print(f"Single character name test: {e}")
# Boolean olmayan kayıtlı (enrolled) değerini test et
try:
student.enrolled = "yes"
except ValueError as e:
print(f"Non-boolean enrolled test: {e}")
# Geçerli değişiklikleri test et
student.name = "New Valid Name"
student.enrolled = False
print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")
elif test_case == "grade_calculation":
# Not ortalaması hesaplamasını test et
student = Student(1001, "Test Student")
print(f"Student with no grades - Average: {student.grade_average}")
# Bir not ekle
student.add_grade("Math", 85)
print(f"Student with one grade - Average: {student.grade_average}")
# Daha fazla not ekle
student.add_grade("Science", 90)
student.add_grade("English", 95)
print(f"Student with multiple grades - Average: {student.grade_average}")
elif test_case == "registry_operations":
# Tüm kayıt defteri işlemlerini test et
registry = StudentRegistry()
# Öğrencileri oluştur
student1 = Student(101, "Student One")
student2 = Student(102, "Student Two")
# Öğrencileri ekle
registry.add_student(student1)
registry.add_student(student2)
print("After adding students:")
registry.display_all()
# Öğrenciyi getir
retrieved_student = registry.get_student(101)
print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
# Mevcut olmayan öğrenciyi getir
non_existent = registry.get_student(999)
print(f"Retrieved student 999: {non_existent}")
# Öğrenciyi sil
registry.remove_student(101)
print("\
After removing student 101:")
registry.display_all()
# Mevcut olmayan öğrenciyi sil (hata vermemeli)
registry.remove_student(999)
print("\
After attempting to remove non-existent student 999:")
registry.display_all()
elif test_case == "large_registry":
# Çok sayıda öğrenci ile performans testi yap
start_time = time.time()
registry = StudentRegistry()
# Rastgele notlarla 100 öğrenci oluştur
for i in range(1, 101):
student = Student(1000 + i, f"Student {i}")
# 5 rastgele not ekle
for j in range(5):
student.add_grade(f"Course {j+1}", random.randint(60, 100))
registry.add_student(student)
creation_time = time.time() - start_time
print(f"Time to create 100 students: {creation_time:.4f} seconds")
# En başarılı öğrenciyi bul
start_time = time.time()
top_student = registry.get_top_student()
top_time = time.time() - start_time
print(f"Time to find top student: {top_time:.4f} seconds")
print(f"Top student: {top_student.name} with average {top_student.grade_average:.2f}")
# En başarılı 5 öğrenciyi manuel olarak bul
print("\
Top 5 students:")
students_list = []
for i in range(1, 101):
student = registry.get_student(1000 + i)
students_list.append(student)
# Not ortalamasına göre azalan düzende sırala
students_list.sort(key=lambda s: s.grade_average, reverse=True)
# İlk 5'i görüntüle
for i in range(5):
student = students_list[i]
print(f"{i+1}. {student.name}: {student.grade_average:.2f}")Object Oriented Programming bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerself ParametresiMetotlarÖzniteliklerYapıcı Metot (__init__)Özet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtımsuper() FonksiyonuMetot Geçersiz KılmaÇoklu KalıtımMetot Çözümleme SırasıÖzet - Çalışan Hiyerarşisi7Özel Metotlar
Sihirli Metotlara GirişOperatör Aşırı YüklemeKapsayıcı Sihirli MetotlarıÖzet - Özel Liste10Tasarım Kalıpları Bölüm 1
Tasarım kalıplarına girişSingleton KalıbıFactory KalıbıObserver KalıbıStrategy Kalıbı13Final Meydan Okumaları
E-öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi5Çok Biçimlilik (Polymorphism)
Metot Geçersiz Kılmaya Yeniden BakışDuck TypingSoyut Sınıflar ve MetotlarArayüz TasarımıÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon ve KalıtımMixinsStatik ve Sınıf MetotlarıSınıf DekoratörleriBağlam Yöneticileri11Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit Kalıbı3Sınıf Özellikleri
Örnek ve Sınıf DeğişkenleriProperty DekoratörleriGizli ÖzniteliklerÖzet - Banka Hesabı Yöneticisi6Kapsülleme
Public, Protected, Private ÜyelerErişim BelirleyicilerBilgi Gizlemeİleri Seviye Property DekoratörleriÖzet - Öğrenci Kayıt Sistemi