Menu
CoddyTech

Platforma e-learningowa

Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 62 z 65.

challenge icon

Wyzwanie

Trudny

Zbuduj klasy platformy e-learningowej: kursy, uczniów i instruktorów. Uczniowie i instruktorzy to osoby, dlatego mają wspólną klasę nadrzędną.

Obiekty nie mogą wskazywać na siebie nawzajem: kurs przechowuje adresy e-mail swoich uczniów i imię i nazwisko instruktora, a uczniowie i instruktorzy przechowują tytuły kursów. Metoda, która potrzebuje kursu, otrzymuje go jako argument.

Person w person.gd: konstruktor przyjmuje person_name i email oraz je przechowuje. _to_string() zwraca NAME (EMAIL).

Course w course.gd:

  • Właściwości: title, max_capacity, instructor_name (początkowo "") oraz tablice Array[String] student_emails i completed_emails.
  • Konstruktor przyjmuje tytuł i pojemność, która domyślnie wynosi 30.
  • Sygnał course_full(title: String), emitowany przez add_student(), gdy zajęte zostaje ostatnie wolne miejsce.
  • add_student(email) -> bool: zwraca false, gdy kurs jest pełny lub dany adres e-mail należy już do ucznia; w przeciwnym razie dodaje adres e-mail i zwraca true.
  • remove_student(email) -> bool: usuwa obecnego ucznia; zwraca false, jeśli dany adres e-mail do niego nie należy.
  • mark_completed(email) -> bool: przenosi obecnego ucznia do completed_emails; zwraca false, jeśli dany adres e-mail nie należy do obecnego ucznia.
  • assign_instructor(instructor) -> bool: zapisuje imię i nazwisko instruktora lub zwraca false, jeśli kurs ma już instruktora.
  • _to_string() zwraca TITLE: N/CAPACITY students, M completed, instructor: NAME, a gdy nie ma instruktora, używa none.

Student w student.gd dziedziczy po Person i zachowuje swój konstruktor. Ma dwie tablice tytułów typu Array[String]: enrolled i completed:

  • enroll(course: Course) -> bool: zwraca false, gdy kurs znajduje się już w enrolled lub completed albo gdy course.add_student() odmówi; w przeciwnym razie dodaje tytuł i zwraca true.
  • unenroll(course: Course) -> bool: działa tylko dla zapisanego kursu; usuwa ucznia z kursu i tytuł z enrolled.
  • complete_course(course: Course) -> bool: działa tylko dla zapisanego kursu; wywołuje course.mark_completed() i przenosi tytuł z enrolled do completed.
  • _to_string() zwraca Student , tekst z Person, a następnie : N enrolled, M completed.

Instructor w instructor.gd dziedziczy po Person. Jego konstruktor przyjmuje person_name, email i expertise, a klasa przechowuje tablicę typu Array[String] course_titles:

  • assign_to_course(course: Course) -> bool: wywołuje course.assign_instructor(), przekazując swoje imię i nazwisko; w przypadku powodzenia dodaje tytuł i zwraca true.
  • _to_string() zwraca Instructor , tekst z Person, , EXPERTISE: oraz połączone tytuły z użyciem , albo no courses.

Dostarczony kod odczytuje polecenia, których pola są rozdzielone znakiem |, i łączy się z sygnałem course_full, aby wypisać Course full: TITLE. Dla tych danych wejściowych:

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

wynik to:

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

Twój kod umieść w plikach person.gd, course.gd, student.gd i instructor.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

extends Node

func _ready():
	# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian

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

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator GDScript online