Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

منصة التعلم الإلكتروني

جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 103 من 104.

challenge icon

التحدي

سهل

لنقم ببناء منصة تعليم إلكتروني تجمع بين جميع مفاهيم البرمجة كائنية التوجه (OOP) التي أتقنتها طوال هذه الدورة. ستقوم بإنشاء نظام يدير الدورات التدريبية، وأنواعاً مختلفة من الدروس، ويتتبع تقدم الطلاب — مما يوضح تدرجات الوراثة، وتعدد الأشكال (polymorphism)، والمؤشرات الذكية (smart pointers)، وأنماط التصميم (design patterns) وهي تعمل في انسجام تام.

ستقوم بتنظيم الكود الخاص بك عبر ستة ملفات:

  • User.h: أنشئ تدرجاً للمستخدمين مع فئة أساسية User وفئتين مشتقتين: Student و Instructor.

    يجب أن يكون للفئة الأساسية User اسم ومعرف (ID)، مع دالة افتراضية getRole() تعيد نوع المستخدم كسلسلة نصية (string)، ودالة getInfo() تعيد "[name] ([id]) - [role]".

    تتتبع فئة Student معرفات الدورات المسجل فيها (استخدم vector من السلاسل النصية) وعدد الدروس المكتملة. أضف الدوال enrollInCourse(const std::string& courseId)، و completedLesson() لزيادة العداد، و getCompletedCount().

    تخزن فئة Instructor سلسلة نصية للتخصص وتتتبع معرفات الدورات التي يقوم بتدريسها. أضف addCourse(const std::string& courseId) و getSpecialty().

  • Lesson.h: ابنِ تدرجاً للدروس باستخدام فئة أساسية مجردة (abstract base class).

    يجب أن تحتوي الفئة الأساسية Lesson على عنوان ومدة (بالدقائق)، مع دالة افتراضية نقية (pure virtual) باسم 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 تمتلك دروسها باستخدام المؤشرات الذكية.

    تمتلك الدورة عنواناً، ومعرفاً (ID)، ومعرفاً للمحاضر. قم بتخزين الدروس كـ 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 pattern) لإنشاء أنواع مختلفة من الدروس.

    أنشئ فئة LessonFactory مع دالة ثابتة (static) باسم createLesson(const std::string& type, const std::string& title, int duration, const std::string& extra) تعيد std::unique_ptr<Lesson>.

    يحدد معامل type نوع الدرس المراد إنشاؤه ("video"، أو "quiz"، أو "text"). يحتوي معامل extra على بيانات خاصة بالنوع: رابط الفيديو، أو عدد الأسئلة للاختبار (يتم تحويله إلى 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 pattern) إنشاء الدروس مرناً، وتضمن المؤشرات الذكية إدارة آمنة للذاكرة، ويسمح لك تعدد الأشكال (polymorphism) بالتعامل مع جميع أنواع الدروس بشكل موحد بينما يتصرف كل منها بشكل فريد.

جرّب بنفسك

#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;
}

جميع دروس Object Oriented Programming