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

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

جزء من قسم البرمجة كائنية التوجه في رحلة 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 للفيديو، أو عدد الأسئلة للاختبار (يُحلَّل كعدد صحيح)، أو عدد الكلمات للنص (يُحلَّل كعدد صحيح).

  • 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: أكمل الدرس الأول (index 0) للطالب
    
    // TODO: Print the student's info and completed lesson count
    // Format: "Completed lessons: [count]"
    
    return 0;
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C++ عبر الإنترنت