Menu
CoddyTech

Ulasan: Sistem Catatan Siswa

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 32 dari 64.

challenge icon

Tantangan

Sedang

Dalam tantangan ini, kamu akan menerapkan sistem pengelolaan catatan siswa yang lengkap.

Kamu perlu mengedit dua file untuk menyelesaikan tantangan ini:

  • student.py - Terapkan class Student dengan enkapsulasi yang tepat
  • studentregistry.py - Terapkan class StudentRegistry untuk mengelola siswa

Ikuti komentar TODO yang terperinci di setiap file untuk mendapatkan panduan langkah demi langkah. Implementasimu akan diuji dengan berbagai kasus uji menyeluruh yang memverifikasi:

  • Validasi atribut dan penanganan error yang tepat
  • Perhitungan rata-rata nilai yang benar
  • Fungsi registry dengan berbagai skenario siswa
  • Kondisi batas dan kasus khusus

Coba sendiri

from student import Student
from studentregistry import StudentRegistry
import time
import random

# Penangan kasus uji untuk pengujian menyeluruh
test_case = input()

if test_case == "default_test":
    # Buat data siswa
    student1 = Student(1001, "Alice Smith")
    student2 = Student(1002, "Bob Johnson")
    student3 = Student(1003, "Charlie Brown")

    # Tambahkan nilai
    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)

    # Tampilkan catatan siswa
    print("Student Records:")
    student1.display_record()
    print()
    student2.display_record()
    print()
    student3.display_record()
    print()

    # Uji validasi nama
    try:
        student1.name = "J"  # Terlalu pendek
    except ValueError as e:
        print(f"Name validation error: {e}")
    print()

    # Buat registry dan tambahkan siswa
    registry = StudentRegistry()
    registry.add_student(student1)
    registry.add_student(student2)
    registry.add_student(student3)

    # Tampilkan semua siswa
    print("All Students in Registry:")
    registry.display_all()
    print()

    # Dapatkan siswa dengan nilai tertinggi
    top_student = registry.get_top_student()
    print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")

    # Hapus seorang siswa
    registry.remove_student(1002)  # Hapus Bob
    print("\
After removing student 1002:")
    registry.display_all()

elif test_case == "empty_registry":
    # Uji registry kosong
    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()  # Seharusnya tidak menampilkan apa pun

elif test_case == "validation_tests":
    # Uji semua aturan validasi
    student = Student(1001, "Valid Name")
    print(f"Created student with name: {student.name}")
    
    # Uji nama kosong
    try:
        student.name = ""
    except ValueError as e:
        print(f"Empty name test: {e}")
    
    # Uji nama dengan satu karakter
    try:
        student.name = "A"
    except ValueError as e:
        print(f"Single character name test: {e}")
    
    # Uji nilai enrolled yang bukan boolean
    try:
        student.enrolled = "yes"
    except ValueError as e:
        print(f"Non-boolean enrolled test: {e}")
    
    # Uji perubahan yang valid
    student.name = "New Valid Name"
    student.enrolled = False
    print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")

elif test_case == "grade_calculation":
    # Uji perhitungan rata-rata nilai
    student = Student(1001, "Test Student")
    print(f"Student with no grades - Average: {student.grade_average}")
    
    # Tambahkan satu nilai
    student.add_grade("Math", 85)
    print(f"Student with one grade - Average: {student.grade_average}")
    
    # Tambahkan lebih banyak nilai
    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":
    # Uji semua operasi registry
    registry = StudentRegistry()
    
    # Buat data siswa
    student1 = Student(101, "Student One")
    student2 = Student(102, "Student Two")
    
    # Tambahkan siswa
    registry.add_student(student1)
    registry.add_student(student2)
    print("After adding students:")
    registry.display_all()
    
    # Ambil siswa
    retrieved_student = registry.get_student(101)
    print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
    
    # Ambil siswa yang tidak ada
    non_existent = registry.get_student(999)
    print(f"Retrieved student 999: {non_existent}")
    
    # Hapus siswa
    registry.remove_student(101)
    print("\
After removing student 101:")
    registry.display_all()
    
    # Hapus siswa yang tidak ada (seharusnya tidak menghasilkan error)
    registry.remove_student(999)
    print("\
After attempting to remove non-existent student 999:")
    registry.display_all()

elif test_case == "large_registry":
    # Uji performa dengan banyak siswa
    start_time = time.time()
    registry = StudentRegistry()
    
    # Buat 100 siswa dengan nilai acak
    for i in range(1, 101):
        student = Student(1000 + i, f"Student {i}")
        # Tambahkan 5 nilai acak
        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")
    
    # Cari siswa terbaik
    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}")
    
    # Cari 5 siswa terbaik secara manual
    print("\
Top 5 students:")
    students_list = []
    for i in range(1, 101):
        student = registry.get_student(1000 + i)
        students_list.append(student)
    
    # Urutkan berdasarkan rata-rata nilai dari tertinggi ke terendah
    students_list.sort(key=lambda s: s.grade_average, reverse=True)
    
    # Tampilkan 5 siswa terbaik
    for i in range(5):
        student = students_list[i]
        print(f"{i+1}. {student.name}: {student.grade_average:.2f}")

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Python online