Menu
CoddyTech

E-öğrenme Platformu

Coddy'nin GDScript Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 62 / 65.

challenge icon

Görev

Zor

Bir e-öğrenme platformunun sınıflarını oluştur: kurslar, öğrenciler ve eğitmenler. Öğrenciler ve eğitmenler insan olduğundan bir üst sınıfı paylaşırlar.

Nesneler birbirlerini işaret etmemelidir: bir kurs, öğrencilerinin e-postalarını ve eğitmeninin adını saklar; öğrenciler ve eğitmenler ise kurs başlıklarını saklar. Bir kursa ihtiyaç duyan yöntem, kursu bağımsız değişken olarak alır.

person.gd içindeki Person: yapıcı person_name ve email değerlerini alıp saklar. _to_string(), NAME (EMAIL) döndürür.

course.gd içindeki Course:

  • Özellikler: title, max_capacity, instructor_name (başlangıç değeri "") ve Array[String] türündeki student_emails ile completed_emails.
  • Yapıcı, başlığı ve varsayılan değeri 30 olan kapasiteyi alır.
  • add_student() son boş yeri aldığında yayımlanan course_full(title: String) sinyali.
  • add_student(email) -> bool: kurs doluysa veya e-posta zaten bir öğrenciye aitse false döndürür; aksi hâlde e-postayı ekler ve true döndürür.
  • remove_student(email) -> bool: mevcut bir öğrenciyi kaldırır; e-posta mevcut bir öğrenciye ait değilse false döndürür.
  • mark_completed(email) -> bool: mevcut bir öğrenciyi completed_emails listesine taşır; e-posta mevcut bir öğrenciye ait değilse false döndürür.
  • assign_instructor(instructor) -> bool: eğitmenin adını saklar veya kursta zaten bir eğitmen varsa false döndürür.
  • _to_string(), eğitmen yoksa none kullanarak TITLE: N/CAPACITY students, M completed, instructor: NAME döndürür.

student.gd içindeki Student, Person sınıfını genişletir ve yapıcısını korur. Başlıklardan oluşan iki Array[String] listesi vardır: enrolled ve completed:

  • enroll(course: Course) -> bool: kurs zaten enrolled veya completed listesindeyse ya da course.add_student() işlemi reddederse false döndürür; aksi hâlde başlığı ekler ve true döndürür.
  • unenroll(course: Course) -> bool: yalnızca kayıtlı olunan bir kurs için geçerlidir; öğrenciyi kurstan, başlığı da enrolled listesinden kaldırır.
  • complete_course(course: Course) -> bool: yalnızca kayıtlı olunan bir kurs için geçerlidir; course.mark_completed() çağrısını yapar ve başlığı enrolled listesinden completed listesine taşır.
  • _to_string(), Student metnini, ardından Person metnini ve sonra : N enrolled, M completed metnini döndürür.

instructor.gd içindeki Instructor, Person sınıfını genişletir. Yapıcısı person_name, email ve expertise değerlerini alır ve Array[String] türündeki course_titles listesini tutar:

  • assign_to_course(course: Course) -> bool: adıyla course.assign_instructor() çağrısını yapar; başarılı olursa başlığı ekler ve true döndürür.
  • _to_string(), Instructor metnini, Person metnini, , EXPERTISE: ifadesini ve , ile birleştirilmiş başlıkları ya da no courses metnini döndürür.

Sağlanan kod, alanları | ile ayrılmış komutları okur ve course_full sinyalini bağlayarak Course full: TITLE yazdırır. Bu girdi için:

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

çıktı şöyledir:

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

Kodunuzu person.gd, course.gd, student.gd ve instructor.gd dosyalarına yazın. main.gd, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

extends Node

func _ready():
	# Sağlanan giriş/çıkış kodu: olduğu gibi bırakın

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

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online GDScript derleyicisi