Menu
Coddy logo textTech

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

חלק מהיחידה תכנות מונחה עצמים במסלול ה-PHP של Coddy. שיעור 88 מתוך 91.

challenge icon

אתגר

קל

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

תארגנו את הקוד בשישה קבצים:

  • User.php: צרו מחלקה מופשטת User שתשמש מחלקת בסיס הן לתלמידים והן למדריכים. השתמשו בקידום מאפיינים בבנאי עבור id (int) ו-name (string), שניהם public readonly. כללו מתודה מופשטת getRole(): string שמחלקות הבת חייבות לממש.
  • Student.php: כללו את הקובץ User. צרו מחלקה Student שיורשת מ-User. התלמידים עוקבים אחר הקורסים שאליהם נרשמו במערך פרטי, ואחר ההתקדמות שלהם (אחוז ההשלמה) בכל קורס. ממשו:
    • getRole(): string: מחזירה "Student"
    • enrollInCourse(Course $course): string: רושמת את התלמיד לקורס אם יש בו מקום; מחזירה הודעת הצלחה או כישלון
    • getEnrolledCourses(): array: מחזירה את מערך הקורסים שאליהם התלמיד נרשם
    • updateProgress(string $courseTitle, int $percent): void: מגדירה את ההתקדמות בקורס (0-100)
    • getProgress(string $courseTitle): int: מחזירה את אחוז ההתקדמות, או 0 אם התלמיד לא נרשם לקורס
  • Instructor.php: כללו את הקובץ User. צרו מחלקה Instructor שיורשת מ-User. מדריכים יכולים ליצור ולנהל קורסים. ממשו:
    • getRole(): string: מחזירה "Instructor"
    • createCourse(string $title, int $capacity): Course: יוצרת ומחזירה Course חדש עם המדריך הזה כמדריך הקורס
  • Course.php: כללו את הקובץ Instructor. צרו מחלקה Course עם קידום מאפיינים בבנאי עבור title (string, public readonly), instructor (Instructor, public readonly) ו-capacity (int, private). עקבו אחר התלמידים שנרשמו במערך פרטי. ממשו:
    • getCapacity(): int: מחזירה את הקיבולת המרבית
    • getEnrolledCount(): int: מחזירה את מספר הנרשמים הנוכחי
    • hasCapacity(): bool: מחזירה true אם תלמידים נוספים יכולים להירשם
    • addStudent(Student $student): bool: מוסיפה תלמיד אם הקיבולת מאפשרת זאת ומחזירה את מצב ההצלחה
    • getStudents(): array: מחזירה את מערך התלמידים שנרשמו
  • Platform.php: כללו את הקבצים Course ו-Student. צרו מחלקה Platform שמנהלת את המערכת כולה. שמרו את הקורסים והמשתמשים במערכים פרטיים. ממשו:
    • addCourse(Course $course): void: מוסיפה קורס לפלטפורמה
    • findCourse(string $title): ?Course: מוצאת קורס לפי הכותרת
    • enrollStudent(Student $student, string $courseTitle): string: רושמת תלמיד לקורס. החזירו "Course not found", "Course is full" או "[name] enrolled in [title]"
    • getCourseStats(string $title): string: מחזירה "[title]: [enrolled]/[capacity] students" או "Course not found"
  • main.php: כללו את הקובץ Platform. תקבלו שלוש קלטים: נתוני המדריך (JSON), הקורסים שיש ליצור (JSON) והפעולות שיש לבצע (JSON).

    מבנה ה-JSON של המדריך:

    {"id": 1, "name": "Dr. Smith"}

    מבנה ה-JSON של הקורסים:

    [{"title": "PHP Basics", "capacity": 2}, {"title": "OOP Mastery", "capacity": 3}]

    מבנה ה-JSON של הפעולות:

    [{"type": "enroll", "student_id": 1, "student_name": "Alice", "course": "PHP Basics"}, {"type": "progress", "student_id": 1, "course": "PHP Basics", "percent": 50}, {"type": "stats", "course": "PHP Basics"}]

    צרו את הפלטפורמה, את המדריך ואת כל הקורסים (באמצעות המתודה createCourse של המדריך). הוסיפו את הקורסים לפלטפורמה. לאחר מכן עבדו על כל פעולה:

    • "enroll": צרו Student חדש ורשמו אותו לקורס; הדפיסו את התוצאה מ-enrollStudent()
    • "progress": עדכנו את התקדמות התלמיד; הדפיסו "[name] progress in [course]: [percent]%"
    • "stats": הדפיסו את התוצאה מ-getCourseStats()

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

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

נסו בעצמכם

<?php

require_once 'Platform.php';

// קראו את הקלטים
$instructorData = (array)json_decode(trim(fgets(STDIN)), true);
$coursesData = (array)json_decode(trim(fgets(STDIN)), true);
$operations = (array)json_decode(trim(fgets(STDIN)), true);

// TODO: צרו את הפלטפורמה

// TODO: צרו את המדריך מתוך instructorData

// TODO: צרו את כל הקורסים באמצעות המתודה createCourse של המדריך
// והוסיפו אותם לפלטפורמה

// TODO: עקבו אחר הסטודנטים שנוצרו לפי המזהה שלהם
$students = [];

// TODO: עבדו כל פעולה
foreach ($operations as $op) {
    $operation = (array)$op;
    
    // TODO: טפלו בפעולה "enroll"
    // צרו Student חדש ורשמו אותו לקורס
    // הדפיסו את התוצאה של enrollStudent()
    
    // TODO: טפלו בפעולה "progress"
    // עדכנו את התקדמות הסטודנט
    // הדפס "[name] progress in [course]: [percent]%"
    
    // TODO: טפל בפעולה "stats"
    // הדפס את התוצאה של getCourseStats()
}

?>

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

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