Menu
Coddy logo textTech

Resumen - Sistema de registros de estudiantes

Parte de la sección Object Oriented Programming del Journey de Python de Coddy. Lección 32 de 64.

challenge icon

Desafío

Intermedio

En este desafío, implementarás un sistema completo de gestión de expedientes de estudiantes.

Necesitas editar dos archivos para completar este desafío:

  • student.py - Implementa la clase Student con la encapsulación adecuada
  • studentregistry.py - Implementa la clase StudentRegistry para gestionar a los estudiantes

Sigue los comentarios TODO detallados en cada archivo para obtener una guía paso a paso. Tu implementación será probada con casos de prueba exhaustivos que verifican:

  • Validación adecuada de atributos y manejo de errores
  • Cálculo correcto de los promedios de calificaciones
  • Funcionalidad del registro con varios escenarios de estudiantes
  • Condiciones de límite y casos de borde

Pruébalo tú mismo

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

# Manejador de casos de prueba para pruebas exhaustivas
test_case = input()

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

    # Agregar calificaciones
    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)

    # Mostrar registros de estudiantes
    print("Student Records:")
    student1.display_record()
    print()
    student2.display_record()
    print()
    student3.display_record()
    print()

    # Probar validación de nombre
    try:
        student1.name = "J"  # Demasiado corto
    except ValueError as e:
        print(f"Name validation error: {e}")
    print()

    # Crear registro y agregar estudiantes
    registry = StudentRegistry()
    registry.add_student(student1)
    registry.add_student(student2)
    registry.add_student(student3)

    # Mostrar todos los estudiantes
    print("All Students in Registry:")
    registry.display_all()
    print()

    # Obtener al mejor estudiante
    top_student = registry.get_top_student()
    print(f"Top Student: {top_student.name} (Average: {top_student.grade_average})")

    # Eliminar un estudiante
    registry.remove_student(1002)  # Eliminar a Bob
    print("\
After removing student 1002:")
    registry.display_all()

elif test_case == "empty_registry":
    # Probar un registro vacío
    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()  # No debería mostrar nada

elif test_case == "validation_tests":
    # Probar todas las reglas de validación
    student = Student(1001, "Valid Name")
    print(f"Created student with name: {student.name}")
    
    # Probar nombre vacío
    try:
        student.name = ""
    except ValueError as e:
        print(f"Empty name test: {e}")
    
    # Probar nombre de un solo carácter
    try:
        student.name = "A"
    except ValueError as e:
        print(f"Single character name test: {e}")
    
    # Probar valor de inscripción no booleano
    try:
        student.enrolled = "yes"
    except ValueError as e:
        print(f"Non-boolean enrolled test: {e}")
    
    # Probar cambios válidos
    student.name = "New Valid Name"
    student.enrolled = False
    print(f"After valid changes - Name: {student.name}, Enrolled: {student.enrolled}")

elif test_case == "grade_calculation":
    # Probar el cálculo del promedio de calificaciones
    student = Student(1001, "Test Student")
    print(f"Student with no grades - Average: {student.grade_average}")
    
    # Agregar una calificación
    student.add_grade("Math", 85)
    print(f"Student with one grade - Average: {student.grade_average}")
    
    # Agregar más calificaciones
    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":
    # Probar todas las operaciones del registro
    registry = StudentRegistry()
    
    # Crear estudiantes
    student1 = Student(101, "Student One")
    student2 = Student(102, "Student Two")
    
    # Agregar estudiantes
    registry.add_student(student1)
    registry.add_student(student2)
    print("After adding students:")
    registry.display_all()
    
    # Obtener estudiante
    retrieved_student = registry.get_student(101)
    print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
    
    # Obtener estudiante inexistente
    non_existent = registry.get_student(999)
    print(f"Retrieved student 999: {non_existent}")
    
    # Eliminar estudiante
    registry.remove_student(101)
    print("\
After removing student 101:")
    registry.display_all()
    
    # Eliminar estudiante inexistente (no debería generar error)
    registry.remove_student(999)
    print("\
After attempting to remove non-existent student 999:")
    registry.display_all()

elif test_case == "large_registry":
    # Probar el rendimiento con muchos estudiantes
    start_time = time.time()
    registry = StudentRegistry()
    
    # Crear 100 estudiantes con calificaciones aleatorias
    for i in range(1, 101):
        student = Student(1000 + i, f"Student {i}")
        # Agregar 5 calificaciones aleatorias
        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")
    
    # Encontrar al mejor estudiante
    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}")
    
    # Encontrar los 5 mejores estudiantes manualmente
    print("\
Top 5 students:")
    students_list = []
    for i in range(1, 101):
        student = registry.get_student(1000 + i)
        students_list.append(student)
    
    # Ordenar por promedio de calificaciones en orden descendente
    students_list.sort(key=lambda s: s.grade_average, reverse=True)
    
    # Mostrar los 5 mejores
    for i in range(5):
        student = students_list[i]
        print(f"{i+1}. {student.name}: {student.grade_average:.2f}")

Todas las lecciones de Object Oriented Programming

Practica por tu cuenta: Compilador de Python online