Menu
Coddy logo textTech

Plataforma de e-learning

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

challenge icon

Desafío

Difícil

En este desafío, implementarás un sistema de plataforma de e-learning orientado a objetos.

  • course.py - Implementa la clase Course
  • student.py - Implementa la clase Student
  • instructor.py - Implementa la clase Instructor

Pruébalo tú mismo

from course import Course
from student import Student
from instructor import Instructor

# Manejador de casos de prueba
test_case = input()

if test_case == "course_creation":
    # Probar la creación de cursos con diferentes capacidades
    course1 = Course("Python 101", "Introduction to Python", 20)
    course2 = Course("Data Science", "Advanced data analysis techniques")
    
    print(f"Course 1: {course1.title}, Max Capacity: {course1.max_capacity}")
    print(f"Course 2: {course2.title}, Max Capacity: {course2.max_capacity}")
    print(f"Initial student count: {len(course1.students)}")

elif test_case == "student_enrollment":
    # Probar el proceso de inscripción de estudiantes
    course = Course("Python 101", "Introduction to Python", 2)
    student1 = Student("Alice", "alice@example.com")
    student2 = Student("Bob", "bob@example.com")
    student3 = Student("Charlie", "charlie@example.com")
    
    # Inscribir estudiantes
    result1 = student1.enroll(course)
    result2 = student2.enroll(course)
    result3 = student3.enroll(course)  # Debería fallar (capacidad)
    
    print(f"Enrollment 1 result: {result1}")
    print(f"Enrollment 2 result: {result2}")
    print(f"Enrollment 3 result: {result3}")
    
    # Intentar inscribir al mismo estudiante dos veces
    result4 = student1.enroll(course)
    print(f"Re-enrollment result: {result4}")
    
    # Verificar los estados del curso y del estudiante
    print(f"Course has {len(course.students)} students")
    print(f"Student 1 has {len(student1.enrolled_courses)} enrolled courses")

elif test_case == "student_unenrollment":
    # Probar el proceso de desinscripción de estudiantes
    course = Course("Python 101", "Introduction to Python")
    student = Student("Alice", "alice@example.com")
    
    # Inscribir y luego desinscribir
    student.enroll(course)
    print(f"Before unenroll: Course has {len(course.students)} students")
    print(f"Before unenroll: Student has {len(student.enrolled_courses)} courses")
    
    result = student.unenroll(course)
    print(f"Unenrollment result: {result}")
    
    print(f"After unenroll: Course has {len(course.students)} students")
    print(f"After unenroll: Student has {len(student.enrolled_courses)} courses")
    
    # Intentar desinscribir de nuevo
    result = student.unenroll(course)
    print(f"Second unenrollment result: {result}")

elif test_case == "course_completion":
    # Probar el proceso de finalización de un curso
    course = Course("Python 101", "Introduction to Python")
    student = Student("Alice", "alice@example.com")
    
    # Inscribir y completar
    student.enroll(course)
    print(f"Before completion: Enrolled in {len(student.enrolled_courses)} courses")
    print(f"Before completion: Completed {len(student.completed_courses)} courses")
    
    result = student.complete_course(course)
    print(f"Completion result: {result}")
    
    print(f"After completion: Enrolled in {len(student.enrolled_courses)} courses")
    print(f"After completion: Completed {len(student.completed_courses)} courses")
    
    # Verificar el estado del curso
    print(f"Course has {len(course.students)} active students")
    print(f"Course has {len(course.completed_students)} completed students")

elif test_case == "instructor_assignment":
    # Probar la asignación de instructores
    course = Course("Python 101", "Introduction to Python")
    instructor = Instructor("Dr. Smith", "smith@example.edu", "Computer Science")
    
    print(f"Before assignment: Instructor has {len(instructor.courses)} courses")
    print(f"Before assignment: Course instructor is {course.instructor}")
    
    result = instructor.assign_to_course(course)
    print(f"Assignment result: {result}")
    
    print(f"After assignment: Instructor has {len(instructor.courses)} courses")
    print(f"After assignment: Course instructor is {course.instructor.name}")

elif test_case == "course_management":
    # Probar la gestión de capacidad del curso
    course = Course("Limited Course", "Test capacity", 2)
    student1 = Student("Alice", "alice@example.com")
    student2 = Student("Bob", "bob@example.com")
    student3 = Student("Charlie", "charlie@example.com")
    
    # Llenar el curso
    student1.enroll(course)
    student2.enroll(course)
    result = student3.enroll(course)  # Debería fallar
    print(f"Enrolling to full course: {result}")
    
    # Hacer espacio desinscribiendo
    student1.unenroll(course)
    result = student3.enroll(course)  # Debería tener éxito ahora
    print(f"Enrolling after unenrollment: {result}")
    
    # Verificar el estado final
    print(f"Final students in course: {len(course.students)}")
    print(f"Students are: {[s.name for s in course.students]}")

elif test_case == "integrated_test":
    # Probar todo el sistema funcionando en conjunto
    # Crear cursos
    python_course = Course("Python 101", "Introduction to Python", 3)
    data_course = Course("Data Science", "Advanced data analysis", 2)
    
    # Crear estudiantes
    alice = Student("Alice", "alice@example.com")
    bob = Student("Bob", "bob@example.com")
    charlie = Student("Charlie", "charlie@example.com")
    
    # Crear instructor
    dr_smith = Instructor("Dr. Smith", "smith@example.edu", "Computer Science")
    
    # Asignar instructor
    dr_smith.assign_to_course(python_course)
    dr_smith.assign_to_course(data_course)
    
    # Inscribir estudiantes
    alice.enroll(python_course)
    bob.enroll(python_course)
    charlie.enroll(python_course)
    
    alice.enroll(data_course)
    bob.enroll(data_course)  # Esto llena data_course
    
    # Completar un curso
    alice.complete_course(python_course)
    
    # Imprimir el estado del sistema
    print("System State:")
    print(f"Python course has {len(python_course.students)} active students and {len(python_course.completed_students)} completed")
    print(f"Data course has {len(data_course.students)} active students")
    print(f"Dr. Smith teaches {len(dr_smith.courses)} courses")
    print(f"Alice is enrolled in {len(alice.enrolled_courses)} courses and completed {len(alice.completed_courses)}")
    print(f"Charlie is enrolled in {len(charlie.enrolled_courses)} courses")

elif test_case == "edge_cases":
    # Probar casos borde
    course = Course("Small Course", "Test edge cases", 1)
    student1 = Student("Alice", "alice@example.com")
    student2 = Student("Bob", "bob@example.com")
    
    # Probar inscripción exactamente en el límite de capacidad
    result1 = student1.enroll(course)
    result2 = student2.enroll(course)  # Debería fallar
    print(f"Enrollment at capacity: {result1}")
    print(f"Enrollment beyond capacity: {result2}")
    
    # Probar completar un curso en el que el estudiante no está inscrito
    other_course = Course("Other Course", "Not enrolled")
    result3 = student1.complete_course(other_course)
    print(f"Complete non-enrolled course: {result3}")
    
    # Probar desinscribirse de un curso en el que el estudiante no está inscrito
    result4 = student2.unenroll(course)
    print(f"Unenroll from non-enrolled course: {result4}")
    
    # Probar la reasignación de un instructor
    instructor1 = Instructor("Dr. Smith", "smith@example.edu", "Python")
    instructor2 = Instructor("Dr. Jones", "jones@example.edu", "Java")
    
    instructor1.assign_to_course(course)
    print(f"First instructor: {course.instructor.name}")
    
    instructor2.assign_to_course(course)
    print(f"After reassignment: {course.instructor.name}")

elif test_case == "capacity_limits":
    # Probar límites de capacidad
    zero_capacity = Course("Empty Course", "No students allowed", 0)
    student = Student("Alice", "alice@example.com")
    
    result1 = student.enroll(zero_capacity)
    print(f"Enroll in zero-capacity course: {result1}")
    
    large_capacity = Course("Huge Course", "Many students", 1000)
    result2 = student.enroll(large_capacity)
    print(f"Enroll in large-capacity course: {result2}")
    print(f"Large course has capacity for {large_capacity.max_capacity} students")

elif test_case == "multiple_courses":
    # Probar estudiante con múltiples cursos
    student = Student("Alice", "alice@example.com")
    course1 = Course("Python 101", "Intro to Python")
    course2 = Course("Java 101", "Intro to Java")
    course3 = Course("C++ 101", "Intro to C++")
    
    # Inscribirse en todos los cursos
    student.enroll(course1)
    student.enroll(course2)
    student.enroll(course3)
    print(f"Enrolled in {len(student.enrolled_courses)} courses")
    
    # Completar algunos cursos
    student.complete_course(course1)
    student.complete_course(course2)
    print(f"After completion: Enrolled in {len(student.enrolled_courses)} courses")
    print(f"After completion: Completed {len(student.completed_courses)} courses")
    
    # Verificar cursos específicos
    enrolled_titles = [c.title for c in student.enrolled_courses]
    completed_titles = [c.title for c in student.completed_courses]
    print(f"Still enrolled in: {enrolled_titles}")
    print(f"Completed: {completed_titles}")

elif test_case == "instructor_workload":
    # Probar instructor con múltiples cursos
    instructor = Instructor("Dr. Smith", "smith@example.edu", ["Python", "Java", "C++"])
    course1 = Course("Python 101", "Intro to Python")
    course2 = Course("Java 101", "Intro to Java")
    course3 = Course("C++ 101", "Intro to C++")
    
    # Asignar a todos los cursos
    instructor.assign_to_course(course1)
    instructor.assign_to_course(course2)
    instructor.assign_to_course(course3)
    
    print(f"Instructor teaches {len(instructor.courses)} courses")
    course_titles = [c.title for c in instructor.courses]
    print(f"Courses taught: {course_titles}")
    
    # Verificar que el instructor esté correctamente asignado a cada curso
    for i, course in enumerate([course1, course2, course3]):
        print(f"Course {i+1} instructor: {course.instructor.name}")

Todas las lecciones de Object Oriented Programming

Practica por tu cuenta: Compilador de Python online