Menu
CoddyTech

E-Learning-Plattform

Teil des Abschnitts Objektorientierte Programmierung der GDScript-Journey von Coddy. Lektion 62 von 65.

challenge icon

Aufgabe

Schwer

Erstelle die Klassen einer E-Learning-Plattform: Kurse, Studierende und Dozenten. Studierende und Dozenten sind beide Personen und haben daher eine gemeinsame übergeordnete Klasse.

Die Objekte dürfen nicht aufeinander verweisen: Ein Kurs speichert die E-Mail-Adressen seiner Studierenden und den Namen seines Dozenten, und Studierende sowie Dozenten speichern Kurstitel. Eine Methode, die einen Kurs benötigt, erhält ihn als Argument.

Person in person.gd: Der Konstruktor nimmt person_name und email entgegen und speichert sie. _to_string() gibt NAME (EMAIL) zurück.

Course in course.gd:

  • Eigenschaften: title, max_capacity, instructor_name (beginnt mit "") sowie die Array[String]-Arrays student_emails und completed_emails.
  • Der Konstruktor nimmt den Titel und die Kapazität entgegen, die standardmäßig 30 beträgt.
  • Ein Signal course_full(title: String), das von add_student() ausgelöst wird, wenn der letzte freie Platz belegt wird.
  • add_student(email) -> bool: Gibt false zurück, wenn der Kurs voll ist oder die E-Mail-Adresse bereits einem Studierenden zugeordnet ist; andernfalls wird die E-Mail-Adresse hinzugefügt und true zurückgegeben.
  • remove_student(email) -> bool: Entfernt einen aktuellen Studierenden; gibt false zurück, wenn die E-Mail-Adresse nicht zu einem Studierenden gehört.
  • mark_completed(email) -> bool: Verschiebt einen aktuellen Studierenden nach completed_emails; gibt false zurück, wenn die E-Mail-Adresse nicht zu einem aktuellen Studierenden gehört.
  • assign_instructor(instructor) -> bool: Speichert den Namen des Dozenten oder gibt false zurück, wenn der Kurs bereits einen Dozenten hat.
  • _to_string() gibt TITLE: N/CAPACITY students, M completed, instructor: NAME zurück; wenn es keinen Dozenten gibt, wird none verwendet.

Student in student.gd erweitert Person und behält seinen Konstruktor bei. Die Klasse hat zwei Array[String]-Arrays mit Titeln: enrolled und completed:

  • enroll(course: Course) -> bool: Gibt false zurück, wenn sich der Kurs bereits in enrolled oder completed befindet oder wenn course.add_student() die Aufnahme ablehnt; andernfalls wird der Titel hinzugefügt und true zurückgegeben.
  • unenroll(course: Course) -> bool: Nur für einen belegten Kurs; entfernt den Studierenden aus dem Kurs und den Titel aus enrolled.
  • complete_course(course: Course) -> bool: Nur für einen belegten Kurs; ruft course.mark_completed() auf und verschiebt den Titel von enrolled nach completed.
  • _to_string() gibt Student , den Text von Person und anschließend : N enrolled, M completed zurück.

Instructor in instructor.gd erweitert Person. Der Konstruktor nimmt person_name, email und expertise entgegen. Die Klasse enthält außerdem ein Array[String]-Array course_titles:

  • assign_to_course(course: Course) -> bool: Ruft course.assign_instructor() mit dem Namen des Dozenten auf; bei Erfolg wird der Titel hinzugefügt und true zurückgegeben.
  • _to_string() gibt Instructor , den Text von Person, , EXPERTISE: und die mit , verbundenen Titel oder no courses zurück.

Der bereitgestellte Code liest Befehle mit durch | getrennten Feldern ein und verbindet das Signal course_full, um Course full: TITLE auszugeben. Für diese Eingabe:

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

lautet die Ausgabe:

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

Dein Code gehört in person.gd, course.gd, student.gd und instructor.gd. main.gd enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

extends Node

func _ready():
	# Bereitgestellter Eingabe-/Ausgabecode: unverändert lassen

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

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-GDScript-Compiler