Menu
CoddyTech

Plataforma de aprendizaje en línea

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 62 de 65.

challenge icon

Desafío

Difícil

Crea las clases de una plataforma de aprendizaje electrónico: cursos, estudiantes e instructores. Los estudiantes y los instructores son personas, así que comparten una clase padre.

Los objetos no deben apuntarse entre sí: un curso almacena los correos electrónicos de sus estudiantes y el nombre de su instructor, y los estudiantes y los instructores almacenan los títulos de los cursos. Un método que necesita un curso lo recibe como argumento.

Person en person.gd: el constructor recibe person_name y email y los almacena. _to_string() devuelve NAME (EMAIL).

Course en course.gd:

  • Propiedades: title, max_capacity, instructor_name (empieza como "") y los Array[String] student_emails y completed_emails.
  • El constructor recibe el título y la capacidad, cuyo valor predeterminado es 30.
  • Una señal course_full(title: String), emitida por add_student() cuando se ocupa el último puesto libre.
  • add_student(email) -> bool: devuelve false cuando el curso está lleno o el correo electrónico ya pertenece a un estudiante; de lo contrario, añade el correo electrónico y devuelve true.
  • remove_student(email) -> bool: elimina a un estudiante actual; devuelve false si el correo electrónico no pertenece a uno.
  • mark_completed(email) -> bool: traslada a un estudiante actual a completed_emails; devuelve false si el correo electrónico no pertenece a un estudiante actual.
  • assign_instructor(instructor) -> bool: almacena el nombre del instructor o devuelve false cuando el curso ya tiene uno.
  • _to_string() devuelve TITLE: N/CAPACITY students, M completed, instructor: NAME, con none cuando no hay instructor.

Student en student.gd extiende Person y conserva su constructor. Tiene dos Array[String] de títulos, enrolled y completed:

  • enroll(course: Course) -> bool: devuelve false cuando el curso ya está en enrolled o completed, o cuando course.add_student() lo rechaza; de lo contrario, añade el título y devuelve true.
  • unenroll(course: Course) -> bool: solo para un curso en el que está matriculado; elimina al estudiante del curso y el título de enrolled.
  • complete_course(course: Course) -> bool: solo para un curso en el que está matriculado; llama a course.mark_completed() y traslada el título de enrolled a completed.
  • _to_string() devuelve Student , el texto de Person y luego : N enrolled, M completed.

Instructor en instructor.gd extiende Person. Su constructor recibe person_name, email y expertise, y conserva un Array[String] course_titles:

  • assign_to_course(course: Course) -> bool: llama a course.assign_instructor() con su nombre; si tiene éxito, añade el título y devuelve true.
  • _to_string() devuelve Instructor , el texto de Person, , EXPERTISE: y los títulos unidos con , , o no courses.

El código proporcionado lee comandos con campos separados por | y se conecta a course_full para imprimir Course full: TITLE. Para esta entrada:

course Python 101|2
course Data Science
student Ana|ana@mail.com
student Ben|ben@mail.com
instructor Grace Hopper|grace@mail.com|Compilers
enroll ana@mail.com|Python 101
enroll ben@mail.com|Python 101
enroll ben@mail.com|Data Science
assign grace@mail.com|Python 101
report

la salida es:

Enroll Ana in Python 101: true
Course full: Python 101
Enroll Ben in Python 101: true
Enroll Ben in Data Science: true
Assign Grace Hopper to Python 101: true
Python 101: 2/2 students, 0 completed, instructor: Grace Hopper
Data Science: 1/30 students, 0 completed, instructor: none
Student Ana (ana@mail.com): 1 enrolled, 0 completed
Student Ben (ben@mail.com): 2 enrolled, 0 completed
Instructor Grace Hopper (grace@mail.com), Compilers: Python 101

Tu código va en person.gd, course.gd, student.gd e instructor.gd. main.gd contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

extends Node

func _ready():
	# Código de entrada/salida proporcionado: déjalo tal como está

	var courses := {}
	var people := {}

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"course":
				var course: Course
				if f.size() > 1:
					course = Course.new(f[0], int(f[1]))
				else:
					course = Course.new(f[0])
				course.course_full.connect(func(title): print("Course full: ", title))
				courses[f[0]] = course
			"student":
				people[f[1]] = Student.new(f[0], f[1])
			"instructor":
				people[f[1]] = Instructor.new(f[0], f[1], f[2])
			"enroll":
				var ok: bool = people[f[0]].enroll(courses[f[1]])
				print("Enroll ", people[f[0]].person_name, " in ", f[1], ": ", ok)
			"unenroll":
				var ok: bool = people[f[0]].unenroll(courses[f[1]])
				print("Unenroll ", people[f[0]].person_name, " from ", f[1], ": ", ok)
			"complete":
				var ok: bool = people[f[0]].complete_course(courses[f[1]])
				print(people[f[0]].person_name, " completes ", f[1], ": ", ok)
			"assign":
				var ok: bool = people[f[0]].assign_to_course(courses[f[1]])
				print("Assign ", people[f[0]].person_name, " to ", f[1], ": ", ok)
			"report":
				for title in courses:
					print(courses[title])
				for email in people:
					print(people[email])

		line = OS.read_string_from_stdin()

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de GDScript online