منصة التعلم الإلكتروني
جزء من قسم البرمجة كائنية التوجه في رحلة 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 للفيديو، أو عدد الأسئلة للاختبار (يُحلَّل كعدد صحيح)، أو عدد الكلمات للنص (يُحلَّل كعدد صحيح).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: أكمل الدرس الأول (index 0) للطالب
// TODO: Print the student's info and completed lesson count
// Format: "Completed lessons: [count]"
return 0;
}
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةبناء وتجميع (Compilation) لغة C++ملفات الـ Header وملفات الـ Sourceالـ Namespaces والـ Scopeمقدمة في الـ OOP في C++الـ Classes مقابل الـ Objectsالمؤشر 'this'الـ Methods (الدوال الأعضاء)الـ Attributes (بيانات الأعضاء)أساسيات الـ Ctors والـ Dtorsمراجعة - آلة حاسبة بسيطة4خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticدوال الـ Getters والـ Settersدوال الأعضاء الثابتة (Const)الكلمة المفتاحية Mutableالدوال والمتغيرات الساكنة (Static)الدوال والفئات الصديقة (Friend)مراجعة - مدير الحساب البنكي7الوراثة
الوراثة الأساسيةمستويات الوصول في الوراثةترتيب استدعاء الـ Ctor والـ Dtorإعادة تعريف الدوال (Method Overriding)الدوال الافتراضية والـ VTableالوراثة المتعددةالوراثة الافتراضيةمراجعة - هيكلية الموظفين10نظرة عامة على STL
نظرة عامة وفلسفة STLحاويات STLالـ Iteratorsخوارزميات STLالـ Functors وتعبيرات Lambdaمراجعة - تكرار الكلمات13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy2إدارة الذاكرة
ذاكرة Stack مقابل Heapالمؤشرات والمراجعالذاكرة الديناميكية (new/delete)المؤشرات الذكية في C++RAII في C++مراجعة - مدير المصفوفات الديناميكية5التغليف (Encapsulation)
محددات الوصول في C++محددات الوصول بشكل متعمقإخفاء المعلوماتStruct مقابل Classالأصناف المتداخلة والداخليةمراجعة - نظام سجلات الطلاب8تعدد الأشكال (Polymorphism)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالتحميل الزائد للدوال (Function Overloading)مراجعة الدوال الافتراضية (Virtual Functions)الدوال الافتراضية البحتة (Pure Virtual Functions)الأصناف المجردة (Abstract Classes)تصميم الواجهات (Interface) في C++التحويل الديناميكي (Dynamic Casting) و RTTIملخص - حاسبة الأشكال11مفاهيم OOP المتقدمة
التركيب مقابل الوراثةالـ Mixins عبر CRTPنمط Pimplمحو النوع (Type Erasure)أصناف Enum والأنواع القويةمعالجة الاستثناءات في OOPتسلسلات الاستثناءات المخصصة14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط قالب الطريقةنمط الحالةنمط التركيبRAII كنمط3المنشئات والموادم
المنشئ الافتراضيالمنشئ ذو المعاملاتمنشئ النسخمنشئ النقلقوائم تهيئة المنشئالمنشئات المفوضةتعمق في الموادمقاعدة الثلاثة / الخمسة / الصفرمراجعة - فئة String6تحميل العوامل (Operator Overloading)
مقدمة في تحميل العواملتحميل العوامل الحسابيةتحميل عوامل المقارنةعوامل Streamتحميل عامل التعيينتحميل العوامل [] و ()عوامل تحويل النوعمراجعة - Matrix Class9القوالب
قوالب الدوالقوالب الأصنافتخصيص القوالبالقوالب المتغيرةأساسيات SFINAE و Type Traitsمراجعة - الحاويات العامةتدرّب بنفسك: مترجم C++ عبر الإنترنت