פלטפורמת למידה מקוונת
חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 62 מתוך 65.
אתגר
קשהבנו את המחלקות של פלטפורמת למידה מקוונת: קורסים, תלמידים ומדריכים. תלמידים ומדריכים הם אנשים, ולכן יש להם מחלקת אב משותפת.
האובייקטים לא אמורים להצביע זה על זה: קורס שומר את כתובות האימייל של תלמידיו ואת השם של המדריך שלו, ותלמידים ומדריכים שומרים את שמות הקורסים. מתודה שזקוקה לקורס מקבלת אותו כארגומנט.
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()
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות התכנות מונחה העצמים
קבצים חיצונייםמבוא ל-OOPמחלקות לעומת אובייקטיםמילת המפתח selfמתודותמאפייניםבנאי (_init)חזרה – מחשבון פשוט2מאפייני מחלקה
משתני מופע לעומת משתנים סטטייםפונקציות סטטיותקובעי מאפייניםמאחזרי מאפייניםפרטיים לפי מוסכמהסיכום – מנהל חשבון בנק5כימוס
איברים ציבוריים ופרטייםאימות באמצעות Settersהסתרת מידעמאפיינים לקריאה בלבדסיכום – מערכת לניהול רשומות תלמידיםתרגלו בעצמכם: קומפיילר GDScript אונליין