Menu
CoddyTech

Plataforma de Ensino Online

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 62 de 65.

challenge icon

Desafio

Difícil

Crie as classes de uma plataforma de e-learning: cursos, estudantes e instrutores. Estudantes e instrutores são pessoas, portanto compartilham uma classe pai.

Os objetos não devem apontar uns para os outros: um curso armazena os e-mails de seus estudantes e o nome de seu instrutor, e estudantes e instrutores armazenam os títulos dos cursos. Um método que precisa de um curso o recebe como argumento.

Person em person.gd: o construtor recebe person_name e email e os armazena. _to_string() retorna NAME (EMAIL).

Course em course.gd:

  • Propriedades: title, max_capacity, instructor_name (começa como "") e os Array[String] student_emails e completed_emails.
  • O construtor recebe o título e a capacidade, que tem como padrão 30.
  • Um sinal course_full(title: String), emitido por add_student() quando ocupa a última vaga disponível.
  • add_student(email) -> bool: retorna false quando o curso está cheio ou o e-mail já pertence a um estudante; caso contrário, adiciona o e-mail e retorna true.
  • remove_student(email) -> bool: remove um estudante atual; retorna false se o e-mail não pertencer a um.
  • mark_completed(email) -> bool: move um estudante atual para completed_emails; retorna false se o e-mail não pertencer a um estudante atual.
  • assign_instructor(instructor) -> bool: armazena o nome do instrutor ou retorna false quando o curso já tem um.
  • _to_string() retorna TITLE: N/CAPACITY students, M completed, instructor: NAME, usando none quando não há instrutor.

Student em student.gd estende Person e mantém seu construtor. Tem dois Array[String] de títulos, enrolled e completed:

  • enroll(course: Course) -> bool: retorna false quando o curso já está em enrolled ou completed, ou quando course.add_student() recusa; caso contrário, adiciona o título e retorna true.
  • unenroll(course: Course) -> bool: apenas para um curso em que esteja matriculado; remove o estudante do curso e o título de enrolled.
  • complete_course(course: Course) -> bool: apenas para um curso em que esteja matriculado; chama course.mark_completed() e move o título de enrolled para completed.
  • _to_string() retorna Student , o texto de Person e, em seguida, : N enrolled, M completed.

Instructor em instructor.gd estende Person. Seu construtor recebe person_name, email e expertise, e ele mantém um Array[String] course_titles:

  • assign_to_course(course: Course) -> bool: chama course.assign_instructor() com seu nome; em caso de sucesso, adiciona o título e retorna true.
  • _to_string() retorna Instructor , o texto de Person, , EXPERTISE: e os títulos unidos com , , ou no courses.

O código fornecido lê comandos com campos separados por | e 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

a saída é:

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

Seu código deve ficar em person.gd, course.gd, student.gd e instructor.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online