Menu
CoddyTech

Repaso: sistema de registros de estudiantes

Parte de la sección Programación orientada a objetos 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.

Debes 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 estudiantes

Sigue los comentarios detallados TODO de cada archivo para obtener instrucciones paso a paso. Tu implementación se probará con casos de prueba exhaustivos que verifican:

  • La validación adecuada de atributos y el manejo de errores
  • El cálculo correcto de los promedios de calificaciones
  • La funcionalidad del registro con distintos casos de estudiantes
  • Las condiciones límite y los casos extremos

Pruébalo tú mismo

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

# Gestor de casos de prueba para realizar 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")

    # Añadir 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 los registros de los estudiantes
    print("Student Records:")
    student1.display_record()
    print()
    student2.display_record()
    print()
    student3.display_record()
    print()

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

    # Crear un registro y añadir 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 el estudiante con mejor promedio
    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":
    # Prueba todas las reglas de validación
    student = Student(1001, "Valid Name")
    print(f"Created student with name: {student.name}")
    
    # Prueba un nombre vacío
    try:
        student.name = ""
    except ValueError as e:
        print(f"Empty name test: {e}")
    
    # Prueba un nombre de un solo carácter
    try:
        student.name = "A"
    except ValueError as e:
        print(f"Single character name test: {e}")
    
    # Prueba un valor no booleano para enrolled
    try:
        student.enrolled = "yes"
    except ValueError as e:
        print(f"Non-boolean enrolled test: {e}")
    
    # Prueba los 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":
    # Prueba el cálculo del promedio de calificaciones
    student = Student(1001, "Test Student")
    print(f"Student with no grades - Average: {student.grade_average}")
    
    # Añade una calificación
    student.add_grade("Math", 85)
    print(f"Student with one grade - Average: {student.grade_average}")
    
    # Añade 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":
    # Prueba todas las operaciones del registro
    registry = StudentRegistry()
    
    # Crear estudiantes
    student1 = Student(101, "Student One")
    student2 = Student(102, "Student Two")
    
    # Añade estudiantes
    registry.add_student(student1)
    registry.add_student(student2)
    print("After adding students:")
    registry.display_all()
    
    # Obtén un estudiante
    retrieved_student = registry.get_student(101)
    print(f"\
Retrieved student 101: {retrieved_student.name if retrieved_student else None}")
    
    # Obtener un estudiante que no existe
    non_existent = registry.get_student(999)
    print(f"Retrieved student 999: {non_existent}")
    
    # Eliminar un estudiante
    registry.remove_student(101)
    print("\
After removing student 101:")
    registry.display_all()
    
    # Eliminar un estudiante que no existe (no debería generar un 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 estudiante con el mejor promedio
    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 manualmente a los 5 estudiantes con los mejores promedios
    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 a los 5 estudiantes con los mejores promedios
    for i in range(5):
        student = students_list[i]
        print(f"{i+1}. {student.name}: {student.grade_average:.2f}")

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de Python online