Menu
Coddy logo textTech

פלטפורמת למידה מקוונת

חלק מהיחידה תכנות מונחה עצמים במסלול ה-Java של Coddy. שיעור 84 מתוך 87.

ברוכים הבאים לפרק האתגרים הסופיים! האתגרים האלה נועדו לבחון את השליטה שלכם בכל מושגי ה-OOP שלמדתם לאורך הקורס הזה.

באתגר הזה תבנה מערכת פלטפורמת למידה מקוונת שמשלבת הורשה, ממשקים, פולימורפיזם, כימוס ותבניות עיצוב לכדי יישום אחיד.

הפלטפורמה שלך צריכה למדל את הקשרים בין קורסים, תלמידים ומדריכים. חשוב על האופן שבו מחלקת הבסיס User יכולה להיות מורחבת באמצעות המחלקות Student ו-Instructor, איך קורסים מכילים שיעורים ואיך מעקב אחר הרשמה פועל בין תלמידים לקורסים.

שקלו אילו עקרונות OOP מתאימים: השתמשו בכימוס כדי להגן על נתוני המשתמשים, בהורשה כדי לשתף התנהגות משותפת, בממשקים כדי להגדיר חוזים כמו Enrollable או Completable, ובפולימורפיזם כדי לטפל בסוגי משתמשים שונים באופן אחיד.

בהצלחה ביישום כל מה שלמדת!

challenge icon

אתגר

קל

בואו נבנה פלטפורמת למידה מקוונת שמאגדת את כל מושגי ה-OOP שלמדת במהלך הקורס הזה! תיצור מערכת שמדגמת את הקשרים בין קורסים, תלמידים ומדריכים באמצעות ירושה, ממשקים, פולימורפיזם ואנקפסולציה.

תארגן את הקוד שלך בשישה קבצים:

  • Enrollable.java: צור ממשק שמגדיר את החוזה לפעולות הרשמה. יש להצהיר בו על המתודות enroll(Student student) שמחזירה ערך בוליאני, ועל getEnrolledCount() שמחזירה int.
  • User.java: צור מחלקת בסיס מופשטת שמייצגת כל משתמש בפלטפורמה. כלול שדות פרטיים עבור id (String) ו-name (String), בנאי שמאתחל את שניהם, getters מתאימים, ומתודה מופשטת getRole() שמחזירה String המתאר את תפקיד המשתמש.
  • Student.java: צור מחלקה שיורשת מ-User. הוסף ArrayList פרטי למעקב אחר מזהי הקורסים שאליהם התלמיד רשום. כלול בנאי שקורא לבנאי של מחלקת האב, ממש את getRole() כך שתחזיר "Student", והוסף את המתודות addCourse(String courseId) ו-getEnrolledCourseCount(). דרוס את toString() כך שתחזיר "Student: [name] ([enrolledCount] courses)".
  • Instructor.java: צור מחלקה שיורשת מ-User. הוסף שדה פרטי עבור specialty (String). כלול בנאי שמקבל id, name ו-specialty, ממש את getRole() כך שתחזיר "Instructor", הוסף getter עבור specialty, ודרוס את toString() כך שתחזיר "Instructor: [name] - [specialty]".
  • Course.java: צור מחלקה שמממשת את Enrollable. כלול שדות פרטיים עבור courseId (String), title (String), instructor (Instructor), ו-ArrayList של תלמידים רשומים. הבנאי מקבל courseId, title ו-instructor. ממש את enroll(Student student) כך שתוסיף את התלמיד לרשימה, תקרא למתודה addCourse() של התלמיד עם המזהה של הקורס הזה, ותחזיר true. ממש את getEnrolledCount(). הוסף מתודה getDetails() שמחזירה את מזהה הקורס בתוך סוגריים מרובעים מילוליים, ואחריו את הכותרת ושם המדריך, במבנה "[" + courseId + "] " + title + " by " + instructorName.
  • Main.java: בנה את הפלטפורמה שלך! תקבל מחרוזת פקודות מופרדת בפסיקים:
    • ADD_INSTRUCTOR:id:name:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO:userId

    נהל אוספים של מדריכים, תלמידים וקורסים. עבד כל פקודה והדפס:

    • ADD_INSTRUCTOR: Instructor added: [name]
    • ADD_STUDENT: Student added: [name]
    • ADD_COURSE: Course added: [title]
    • ENROLL: [studentName] enrolled in [courseTitle]
    • INFO: הדפס את הפלט של toString() של המשתמש

    לאחר עיבוד כל הפקודות, הדפס --- Platform Summary --- ואחריו את הפרטים של כל קורס ואת מספר הנרשמים, במבנה [courseDetails] - [count] student(s).

תקבל קלט אחד: מחרוזת הפקודות המופרדת בפסיקים.

לדוגמה, עבור הקלט ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001, הפלט שלך יהיה:

Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)

האתגר הזה משלב ירושה (היררכיית User), ממשקים (Enrollable), פולימורפיזם (סוגי משתמשים שונים עם מימושי toString משלהם) ואנקפסולציה (שדות פרטיים עם גישה מבוקרת) למערכת אחידה!

נסו בעצמכם

import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: צרו אוספים לאחסון מדריכים, סטודנטים וקורסים
        // רמז: השתמשו ב-HashMap עם id כמפתח לחיפוש קל
        
        // TODO: פצלו את input לפי פסיקים כדי לקבל פקודות נפרדות
        
        // TODO: עבדו כל פקודה:
        // - ADD_INSTRUCTOR:id:name:specialty -> צרו מדריך, הוסיפו אותו לאוסף והדפיסו "Instructor added: [name]"
        // - ADD_STUDENT:id:name -> צרו סטודנט, הוסיפו אותו לאוסף והדפיסו "Student added: [name]"
        // - ADD_COURSE:courseId:title:instructorId -> צרו קורס עם מדריך, הוסיפו אותו לאוסף והדפיסו "Course added: [title]"
        // - ENROLL:studentId:courseId -> רשמו סטודנט לקורס והדפיסו "[studentName] enrolled in [courseTitle]"
        // - INFO:userId -> מצאו משתמש (סטודנט או מדריך) והדפיסו את ה-toString() שלו
        
        // TODO: לאחר עיבוד כל הפקודות, הדפיסו "--- Platform Summary ---"
        
        // TODO: עבור כל קורס, הדפיסו "[courseDetails] - [count] student(s)"
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Java אונליין