Menu
CoddyTech

Платформа электронного обучения

Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 62 из 65.

challenge icon

Задание

Сложно

Создай классы для платформы электронного обучения: курсов, студентов и преподавателей. Студенты и преподаватели — люди, поэтому у них есть общий родительский класс.

Объекты не должны ссылаться друг на друга: курс хранит адреса электронной почты своих студентов и имя своего преподавателя, а студенты и преподаватели хранят названия курсов. Метод, которому нужен курс, получает его в качестве аргумента.

Person в person.gd: конструктор принимает person_name и email и сохраняет их. _to_string() возвращает NAME (EMAIL).

Course в course.gd:

  • Свойства: title, max_capacity, instructor_name (изначально равно ""), а также массивы Array[String] student_emails и completed_emails.
  • Конструктор принимает название курса и вместимость, значение по умолчанию — 30.
  • Сигнал course_full(title: String), который испускается методом add_student(), когда занято последнее свободное место.
  • add_student(email) -> bool: возвращает false, если курс заполнен или этот адрес электронной почты уже принадлежит студенту курса; иначе добавляет адрес электронной почты и возвращает true.
  • remove_student(email) -> bool: удаляет текущего студента; возвращает false, если такого адреса электронной почты нет.
  • mark_completed(email) -> bool: перемещает текущего студента в completed_emails; возвращает false, если адрес электронной почты не принадлежит текущему студенту.
  • assign_instructor(instructor) -> bool: сохраняет имя преподавателя или возвращает false, если у курса уже есть преподаватель.
  • _to_string() возвращает TITLE: N/CAPACITY students, M completed, instructor: NAME, а если преподавателя нет — none.

Student в student.gd наследуется от Person и сохраняет его конструктор. У него есть два массива названий типа Array[String]: enrolled и completed:

  • enroll(course: Course) -> bool: возвращает false, если курс уже есть в enrolled или completed, либо если course.add_student() отказывает; иначе добавляет название курса и возвращает true.
  • unenroll(course: Course) -> bool: действует только для записанного курса; удаляет студента из курса и название из enrolled.
  • complete_course(course: Course) -> bool: действует только для записанного курса; вызывает course.mark_completed() и перемещает название из enrolled в completed.
  • _to_string() возвращает Student , текст Person, затем : N enrolled, M completed.

Instructor в instructor.gd наследуется от Person. Его конструктор принимает person_name, email и expertise; он хранит массив Array[String] course_titles:

  • assign_to_course(course: Course) -> bool: вызывает course.assign_instructor(), передавая своё имя; в случае успеха добавляет название курса и возвращает true.
  • _to_string() возвращает Instructor , текст Person, , EXPERTISE: и названия курсов, соединённые с помощью , , либо no courses.

Предоставленный код считывает команды с полями, разделёнными символом |, и подключается к сигналу course_full, чтобы вывести Course full: TITLE. Для следующих входных данных:

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

вывод будет таким:

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

Твой код размести в файлах person.gd, course.gd, student.gd и instructor.gd. В main.gd находится предоставленный код ввода/вывода, который нельзя редактировать.

Попробуйте сами

extends Node

func _ready():
	# Предоставленный код ввода-вывода: оставьте его без изменений

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

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор GDScript