Menu
CoddyTech
flag Ar iconالعربيةdown icon

منصة للتعلّم الإلكتروني

جزء من قسم البرمجة كائنية التوجّه في رحلة 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 عبر الإنترنت