Menu
CoddyTech

Platform E-learning

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 62 dari 65.

challenge icon

Tantangan

Sulit

Buat class untuk platform e-learning: kursus, siswa, dan instruktur. Siswa dan instruktur sama-sama merupakan orang, jadi keduanya berbagi class induk.

object tidak boleh saling menunjuk: kursus menyimpan email siswanya dan nama instrukturnya, sementara siswa dan instruktur menyimpan judul kursus. Method yang memerlukan kursus menerima kursus tersebut sebagai argumen.

Person di person.gd: konstruktornya menerima person_name dan email, lalu menyimpannya. _to_string() mengembalikan NAME (EMAIL).

Course di course.gd:

  • Property: title, max_capacity, instructor_name (dimulai dengan ""), serta Array[String] student_emails dan completed_emails.
  • Konstruktor menerima judul dan kapasitas, dengan nilai default 30.
  • Sebuah signal course_full(title: String), yang dipancarkan oleh add_student() saat kursus menerima siswa terakhir yang mengisi kursi kosong.
  • add_student(email) -> bool: mengembalikan false jika kursus penuh atau email tersebut sudah menjadi siswa; jika tidak, menambahkan email dan mengembalikan true.
  • remove_student(email) -> bool: menghapus siswa yang terdaftar saat ini, mengembalikan false jika email tersebut bukan milik siswa yang terdaftar.
  • mark_completed(email) -> bool: memindahkan siswa yang terdaftar saat ini ke completed_emails, mengembalikan false jika email tersebut bukan milik siswa yang terdaftar.
  • assign_instructor(instructor) -> bool: menyimpan nama instruktur, atau mengembalikan false jika kursus sudah memiliki instruktur.
  • _to_string() mengembalikan TITLE: N/CAPACITY students, M completed, instructor: NAME, dengan none jika tidak ada instruktur.

Student di student.gd mewarisi Person dan mempertahankan konstruktornya. Class ini memiliki dua Array[String] berisi judul, yaitu enrolled dan completed:

  • enroll(course: Course) -> bool: mengembalikan false jika kursus sudah ada di enrolled atau completed, atau jika course.add_student() menolak; jika tidak, menambahkan judul dan mengembalikan true.
  • unenroll(course: Course) -> bool: hanya untuk kursus yang sudah diikuti; menghapus siswa dari kursus dan judul dari enrolled.
  • complete_course(course: Course) -> bool: hanya untuk kursus yang sudah diikuti; memanggil course.mark_completed() dan memindahkan judul dari enrolled ke completed.
  • _to_string() mengembalikan Student , teks dari Person, lalu : N enrolled, M completed.

Instructor di instructor.gd mewarisi Person. Konstruktor class ini menerima person_name, email, dan expertise, serta class ini menyimpan Array[String] course_titles:

  • assign_to_course(course: Course) -> bool: memanggil course.assign_instructor() dengan namanya; jika berhasil, menambahkan judul dan mengembalikan true.
  • _to_string() mengembalikan Instructor , teks dari Person, , EXPERTISE: , lalu judul-judul yang digabungkan dengan , , atau no courses.

Kode yang disediakan membaca perintah dengan field yang dipisahkan oleh | dan menghubungkan signal ke course_full untuk mencetak Course full: TITLE. Untuk input ini:

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

output-nya adalah:

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

Tulis kodemu di person.gd, course.gd, student.gd, dan instructor.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan tetap seperti semula

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

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online