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 عبر الإنترنت