פלטפורמת למידה מקוונת
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C++ של Coddy. שיעור 103 מתוך 104.
אתגר
קלבואו נבנה פלטפורמת למידה מקוונת שמאגדת את כל מושגי ה-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 או nullptrfindUser(const std::string& id): מחזירה shared_ptr או nullptrenrollStudent(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: חבר את כל הרכיבים יחד כדי להדגים את הפלטפורמה שלך.קרא ארבעה פרטי קלט:
- שם הפלטפורמה
- פרטי הקורס (תבנית:
title,courseId,instructorId) - פרטי התלמיד (תבנית:
name,studentId) - השיעור שיש להוסיף (תבנית:
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;
}
כל השיעורים ביחידה תכנות מונחה עצמים
1יסודות OOP
קבצים חיצונייםבנייה וקומפילציה של C++קובצי Header וקובצי מקורמרחבי שמות והיקףמבוא ל-OOP ב-C++מחלקות לעומת אובייקטיםמצביע thisמתודות (פונקציות איבר)תכונות (חברי נתונים)יסודות הבנאים וההורסיםסיכום – מחשבון פשוט4מאפייני מחלקה
חברי מופע לעומת חברים סטטייםגטרים וסטריםפונקציות איבר קבועותמילת המפתח mutableמתודות ומשתנים סטטייםפונקציות ומחלקות ידידותסיכום – מנהל חשבונות בנק7ירושה
ירושה בסיסיתרמות גישה בירושהסדר הקריאות לבנאי ולמפרקדריסת מתודותפונקציות וירטואליות ו־VTableירושה מרובהירושה וירטואליתסיכום – היררכיית עובדים2ניהול זיכרון
זיכרון Stack לעומת Heapמצביעים והפניותזיכרון דינמי (new/delete)מצביעים חכמים ב-C++RAII ב-C++סיכום – מנהל מערכים דינמיים5כימוס
מצייני גישה ב-C++מצייני גישה לעומקהסתרת מידעמבנה לעומת מחלקהמחלקות מקוננות ופנימיותסיכום – מערכת רשומות תלמידים8רב־צורתיות
רב־צורתיות בזמן קומפילציה לעומת בזמן ריצההעמסת פונקציותפונקציות וירטואליות — מבט נוסףפונקציות וירטואליות טהורותמחלקות מופשטותתכנון ממשקים ב־C++המרה דינמית ו־RTTIסיכום — מחשבון צורות3בנאים והורסים
בנאי ברירת מחדלבנאי עם פרמטריםבנאי העתקהבנאי העברהרשימות אתחול בבנאיםבנאים מאציליםמעמיקים בנושא הורסיםכלל השלושה / החמישה / האפססיכום – מחלקת String6העמסת אופרטורים
מבוא להעמסת אופרטוריםהעמסת אופרטורים אריתמטייםהעמסת אופרטורי השוואהאופרטורי זרםהעמסת אופרטור השמההעמסת האופרטורים [] ו־()אופרטורים להמרת טיפוסיםסיכום – מחלקת Matrix9תבניות
תבניות פונקציהתבניות מחלקההתמחות תבניותתבניות ארגומנטים משתנותיסודות SFINAE ותכונות טיפוסיםסיכום – מכל גנריתרגלו בעצמכם: קומפיילר C++ אונליין