Ulasan: Sistem Catatan Siswa
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Python di Coddy. Pelajaran 32 dari 64.
Tantangan
SedangDalam tantangan ini, kamu akan menerapkan sistem pengelolaan catatan siswa yang lengkap.
Kamu perlu mengedit dua file untuk menyelesaikan tantangan ini:
student.py- Terapkan classStudentdengan enkapsulasi yang tepatstudentregistry.py- Terapkan classStudentRegistryuntuk 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
1Dasar-Dasar OOP
File EksternalPengantar OOPclass vs objectParameter selfmethodAtributMethod Konstruktor (__init__)Rangkuman: Kalkulator Sederhana4Pewarisan
Pewarisan DasarFungsi super()Penimpaan MethodPewarisan BergandaUrutan Resolusi MethodRingkasan: Hierarki Karyawan5Polimorfisme
Meninjau Ulang Method OverridingDuck Typingclass dan method AbstrakDesain InterfaceRingkasan: Kalkulator Bentuk8Konsep OOP Lanjutan
Komposisi vs PewarisanMixinsMetode Statis dan Metode ClassDecorator ClassPengelola Konteks11Pola Desain Bagian 2
Pola PerintahPola AdapterPola DecoratorPola Template MethodPola StatePola Composite3Property class
Variabel instance vs variabel classDekorator propertyAtribut privatRangkuman: Pengelola Rekening Bank6Enkapsulasi
Anggota Public, Protected, PrivateModifier AksesPenyembunyian InformasiDecorator Property Tingkat LanjutUlasan: Sistem Catatan Siswa12Proyek: Manajemen Perpustakaan
Ikhtisar Proyekclass Buku dan PenggunaSistem PeminjamanFitur PencarianAntarmuka AdminPengujian dan IntegrasiLatihan sendiri: Compiler Python online