Menu
CoddyTech

Piattaforma di e-learning

Fa parte della sezione Programmazione orientata agli oggetti del percorso GDScript di Coddy. Lezione 62 di 65.

challenge icon

Sfida

Difficile

Crea le classi di una piattaforma di e-learning: corsi, studenti e docenti. Studenti e docenti sono entrambi persone, quindi condividono una classe genitore.

Gli oggetti non devono puntarsi a vicenda: un corso memorizza le email dei suoi studenti e il nome del suo docente, mentre studenti e docenti memorizzano i titoli dei corsi. Un metodo che ha bisogno di un corso lo riceve come argomento.

Person in person.gd: il costruttore accetta person_name e email e li memorizza. _to_string() restituisce NAME (EMAIL).

Course in course.gd:

  • Proprietà: title, max_capacity, instructor_name (inizia come "") e gli Array[String] student_emails e completed_emails.
  • Il costruttore accetta il titolo e la capienza, che per impostazione predefinita è 30.
  • Un segnale course_full(title: String), emesso da add_student() quando viene occupato l'ultimo posto libero.
  • add_student(email) -> bool: restituisce false quando il corso è al completo o l'email è già quella di uno studente; altrimenti aggiunge l'email e restituisce true.
  • remove_student(email) -> bool: rimuove uno studente attuale; restituisce false se l'email non corrisponde a uno studente.
  • mark_completed(email) -> bool: sposta uno studente attuale in completed_emails; restituisce false se l'email non corrisponde a uno studente attuale.
  • assign_instructor(instructor) -> bool: memorizza il nome del docente oppure restituisce false se il corso ne ha già uno.
  • _to_string() restituisce TITLE: N/CAPACITY students, M completed, instructor: NAME, con none quando non c'è alcun docente.

Student in student.gd estende Person e mantiene il suo costruttore. Ha due Array[String] di titoli, enrolled e completed:

  • enroll(course: Course) -> bool: restituisce false quando il corso è già in enrolled o completed, oppure quando course.add_student() rifiuta; altrimenti aggiunge il titolo e restituisce true.
  • unenroll(course: Course) -> bool: solo per un corso a cui è iscritto; rimuove lo studente dal corso e il titolo da enrolled.
  • complete_course(course: Course) -> bool: solo per un corso a cui è iscritto; chiama course.mark_completed() e sposta il titolo da enrolled a completed.
  • _to_string() restituisce Student , il testo di Person, poi : N enrolled, M completed.

Instructor in instructor.gd estende Person. Il suo costruttore accetta person_name, email e expertise, e mantiene un Array[String] course_titles:

  • assign_to_course(course: Course) -> bool: chiama course.assign_instructor() con il proprio nome; se l'operazione riesce, aggiunge il titolo e restituisce true.
  • _to_string() restituisce Instructor , il testo di Person, , EXPERTISE: e i titoli uniti con , , oppure no courses.

Il codice fornito legge i comandi con i campi separati da | e si collega a course_full per stampare Course full: TITLE. Per questo input:

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

l'output è:

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

Il tuo codice va inserito in person.gd, course.gd, student.gd e instructor.gd. main.gd contiene il codice di input/output fornito e non può essere modificato.

Provalo tu

extends Node

func _ready():
	# Codice di input/output fornito: lascialo così com'è

	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()

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore GDScript online