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 אונליין