Menu
Coddy logo textTech

Özet - Öğrenci Kayıt Sistemi

Coddy'nin Python Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 32 / 64.

challenge icon

Görev

Orta

Bu 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) ile Student sınıfını uygulayın
  • studentregistry.py - Öğrencileri yönetmek için StudentRegistry sı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