Menu
Coddy logo textTech

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

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 103 מתוך 104.

challenge icon

אתגר

קל

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

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

  • User.h: צור היררכיית משתמשים עם מחלקת בסיס User ושתי מחלקות יורשות: Student ו-Instructor.

    למחלקת הבסיס User צריכים להיות שם ומזהה, שיטת getRole() וירטואלית שמחזירה את סוג המשתמש כמחרוזת, ושיטת getInfo() שמחזירה "[name] ([id]) - [role]".

    המחלקה Student עוקבת אחר מזהי הקורסים שאליהם התלמיד רשום (השתמש בווקטור של מחרוזות) ומספר השיעורים שהושלמו. הוסף את השיטות enrollInCourse(const std::string& courseId), completedLesson() להגדלת המונה, ו-getCompletedCount().

    המחלקה Instructor שומרת מחרוזת של תחום התמחות ועוקבת אחר מזהי הקורסים שהוא מלמד. הוסף את addCourse(const std::string& courseId) ואת getSpecialty().

  • Lesson.h: בנה היררכיית שיעורים באמצעות מחלקת בסיס מופשטת.

    למחלקת הבסיס Lesson צריכים להיות כותרת ומשך זמן (בדקות), שיטה וירטואלית טהורה complete() שמחזירה הודעת השלמה, ושיטה getType() שמחזירה את סוג השיעור.

    צור שלוש מחלקות יורשות:

    • VideoLesson: מכילה URL של סרטון. השיטה complete() שלה מחזירה "Watched video: [title]"
    • QuizLesson: מכילה מספר שאלות. השיטה complete() שלה מחזירה "Completed quiz: [title] ([questions] questions)"
    • TextLesson: מכילה ספירת מילים. השיטה complete() שלה מחזירה "Read article: [title]"

    כל אחת מהן צריכה לדרוס את getType() כדי להחזיר "Video", "Quiz" או "Text", בהתאמה.

  • Course.h: צור מחלקת Course שבבעלותה השיעורים, באמצעות מצביעים חכמים.

    לקורס יש כותרת, מזהה ומזהה של מדריך. שמור את השיעורים בתור std::vector<std::unique_ptr<Lesson>>, מכיוון שהקורס הוא הבעלים הבלעדי שלהם.

    הוסף שיטות:

    • addLesson(std::unique_ptr<Lesson> lesson): מעבירה את הבעלות על השיעור לקורס
    • getLessonCount(): מחזירה את מספר השיעורים
    • getLesson(size_t index): מחזירה מצביע לשיעור באינדקס הזה (או nullptr אם האינדקס אינו תקין)
    • displayCurriculum(): מדפיסה את סוגו ואת כותרתו של כל שיעור בתבנית "[index]. [Type]: [title]"
  • LessonFactory.h: ממש את תבנית Factory ליצירת סוגים שונים של שיעורים.

    צור מחלקת LessonFactory עם שיטה סטטית createLesson(const std::string& type, const std::string& title, int duration, const std::string& extra) שמחזירה std::unique_ptr<Lesson>.

    הפרמטר type קובע איזה שיעור ליצור ("video", "quiz" או "text"). הפרמטר extra מכיל נתונים ייחודיים לסוג: URL לסרטון, מספר השאלות בחידון (יש להמיר ל-int), או מספר המילים בטקסט (יש להמיר ל-int).

  • Platform.h: בנה את המחלקה המרכזית Platform שמתאמת בין כל הרכיבים.

    שמור את הקורסים בתור std::vector<std::shared_ptr<Course>> ואת המשתמשים בתור std::vector<std::shared_ptr<User>>.

    ממש:

    • addCourse(std::shared_ptr<Course> course)
    • addUser(std::shared_ptr<User> user)
    • findCourse(const std::string& id): מחזירה shared_ptr או nullptr
    • findUser(const std::string& id): מחזירה shared_ptr או nullptr
    • enrollStudent(const std::string& studentId, const std::string& courseId): מוצאת את שניהם, רושמת את התלמיד לקורס ומדפיסה "Enrolled [name] in [course title]" או "Enrollment failed"
    • completeLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex): מוצאת את התלמיד ואת הקורס, קוראת לשיטת complete() של השיעור, מגדילה את מספר השיעורים שהשלים התלמיד ומדפיסה את הודעת ההשלמה או "Could not complete lesson"
  • main.cpp: חבר את כל הרכיבים יחד כדי להדגים את הפלטפורמה שלך.

    קרא ארבעה פרטי קלט:

    1. שם הפלטפורמה
    2. פרטי הקורס (תבנית: title,courseId,instructorId)
    3. פרטי התלמיד (תבנית: name,studentId)
    4. השיעור שיש להוסיף (תבנית: type,title,duration,extra)

    צור את הפלטפורמה והצג "Welcome to [platform name]!". צור את הקורס ואת התלמיד והוסף אותם לפלטפורמה. השתמש ב-LessonFactory כדי ליצור את השיעור ולהוסיף אותו לקורס. הצג את תוכנית הלימודים של הקורס. רשום את התלמיד לקורס. השלם עבור התלמיד את השיעור הראשון (אינדקס 0). לבסוף, הדפס את פרטי התלמיד ואת מספר השיעורים שהשלים בתור "Completed lessons: [count]".

לדוגמה, עם הקלטים CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001 ו-video,Introduction to OOP,30,https://example.com/oop:

Welcome to CodeAcademy!
1. Video: Introduction to OOP
Enrolled Alice in C++ Mastery
Watched video: Introduction to OOP
Alice (S001) - Student
Completed lessons: 1

עם הקלטים LearnHub, Python Basics,PY100,I002, Bob,S002 ו-quiz,Variables Quiz,15,10:

Welcome to LearnHub!
1. Quiz: Variables Quiz
Enrolled Bob in Python Basics
Completed quiz: Variables Quiz (10 questions)
Bob (S002) - Student
Completed lessons: 1

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

נסו בעצמכם

#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include "User.h"
#include "Lesson.h"
#include "Course.h"
#include "LessonFactory.h"
#include "Platform.h"

int main() {
    // קראו את נתוני הקלט
    std::string platformName;
    std::getline(std::cin, platformName);
    
    std::string courseDetails; // פורמט: title,courseId,instructorId
    std::getline(std::cin, courseDetails);
    
    std::string studentDetails; // פורמט: name,studentId
    std::getline(std::cin, studentDetails);
    
    std::string lessonDetails; // פורמט: type,title,duration,extra
    std::getline(std::cin, lessonDetails);
    
    // TODO: נתחו את courseDetails כדי לחלץ את title, courseId, instructorId
    
    // TODO: נתחו את studentDetails כדי לחלץ את name, studentId
    
    // TODO: נתחו את lessonDetails כדי לחלץ את type, title, duration, extra
    
    // TODO: צרו את הפלטפורמה והציגו "Welcome to [platform name]!"
    
    // TODO: צרו את הקורס ואת התלמיד והוסיפו אותם לפלטפורמה
    
    // TODO: השתמשו ב-LessonFactory כדי ליצור את השיעור ולהוסיף אותו לקורס
    
    // TODO: הציגו את תוכנית הלימודים של הקורס
    
    // TODO: רשמו את התלמיד לקורס
    
    // TODO: השלם את השיעור הראשון (אינדקס 0) עבור התלמיד
    
    // TODO: הדפס את פרטי התלמיד ואת מספר השיעורים שהשלים
    // פורמט: "Completed lessons: [count]"
    
    return 0;
}

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

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