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

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

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

challenge icon

التحدي

سهل

لنقم ببناء منصة تعليم إلكتروني تدير الدورات التدريبية، والطلاب، وعمليات التسجيل! يجمع هذا التحدي كل ما تعلمته عن البرمجة كائنية التوجه (OOP) - الفئات (classes)، والوراثة (inheritance)، والواجهات (interfaces)، والتغليف (encapsulation)، والخدمات التي تعمل معاً في بنية نظيفة.

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

  • Lesson.cs: أنشئ فئة Lesson في مساحة الأسماء ELearning.Models. لكل درس Title (string) و DurationMinutes (int) كخصائص للقراءة فقط يتم تعيينها من خلال منشئ الفئة (constructor).
  • Course.cs: أنشئ فئة Course في مساحة الأسماء ELearning.Models. للدورة التدريبية خصائص للقراءة فقط هي Id (string)، و Title (string)، و Instructor (string)، بالإضافة إلى قائمة Lessons. قم بتضمين طريقة AddLesson(Lesson lesson) وخاصية للقراءة فقط TotalDuration تحسب مجموع مدد جميع الدروس.
  • Student.cs: أنشئ فئة Student في مساحة الأسماء ELearning.Models مع خصائص للقراءة فقط Id (int) و Name (string). يتتبع الطلاب تقدمهم من خلال قاموس خاص (private dictionary) يربط معرفات الدورات (course IDs) بعدد الدروس المكتملة. قم بتضمين الطرق CompleteLesson(string courseId) لزيادة التقدم و GetProgress(string courseId) لإرجاع عدد الدروس المكتملة (أو 0 إذا لم يكن مسجلاً).
  • EnrollmentService.cs: أنشئ فئة EnrollmentService في مساحة الأسماء ELearning.Services. تدير هذه الخدمة الدورات والتسجيلات باستخدام مجموعات خاصة (private collections). قم بتنفيذ ما يلي:
    • AddCourse(Course course) - يضيف دورة تدريبية إلى المنصة
    • Enroll(Student student, string courseId) - يرجع true إذا نجح التسجيل، و false إذا كانت الدورة غير موجودة أو كان الطالب مسجلاً بالفعل
    • GetEnrolledCourses(Student student) - يرجع قائمة بمعرفات الدورات التي سجل فيها الطالب
    • GetCourse(string courseId) - يرجع الدورة التدريبية أو null إذا لم يتم العثور عليها
  • Program.cs: اجمع كل شيء معاً عن طريق إنشاء دورات تدريبية مع دروس، وتسجيل الطلاب، وتتبع التقدم، وعرض النتائج بناءً على المدخلات.

ستتلقى المدخلات التالية:

  • عدد الدورات التدريبية المراد إنشاؤها
  • لكل دورة: المعرف (ID)، العنوان، المحاضر، عدد الدروس، ثم لكل درس: العنوان والمدة (بالدقائق)
  • معرف الطالب واسمه
  • عدد العمليات المراد تنفيذها
  • لكل عملية: الإجراء (enroll، أو complete، أو progress، أو info) متبوعاً بمعرف الدورة (course ID)

تنسيقات المخرجات:

  • enroll: اطبع Enrolled in: {CourseTitle} أو Enrollment failed: {courseId}
  • complete: اطبع Completed lesson in {CourseTitle} (زيادة التقدم بمقدار 1)
  • progress: اطبع {CourseTitle}: {completed}/{total} lessons
  • info: اطبع {CourseTitle} by {Instructor} - {TotalDuration} minutes

على سبيل المثال، إذا كانت المدخلات هي:

2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999

يجب أن تكون المخرجات:

Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999

لاحظ كيف تدير الخدمة العلاقة بين الطلاب والدورات، بينما تتعامل كل فئة مع مسؤولياتها الخاصة. يتتبع الطالب تقدمه الخاص، وتحسب الدورات مدتها الإجمالية، وتنسق خدمة التسجيل كل شيء - فصل نظيف للمسؤوليات (separation of concerns)!

جرّب بنفسك

using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;

class Program
{
    public static void Main(string[] args)
    {
        // قراءة عدد الدورات
        int numCourses = Convert.ToInt32(Console.ReadLine());
        
        // TODO: إنشاء مثيل من EnrollmentService
        
        // TODO: قراءة وإنشاء كل دورة مع دروسها
        // لكل دورة: قراءة ID، والعنوان، والمدرس، وعدد الدروس
        // لكل درس: قراءة العنوان والمدة
        // إضافة الدروس إلى الدورة، ثم إضافة الدورة إلى الخدمة
        
        // قراءة معلومات الطالب
        int studentId = Convert.ToInt32(Console.ReadLine());
        string studentName = Console.ReadLine();
        
        // TODO: إنشاء مثيل من Student
        
        // قراءة عدد العمليات
        int numOperations = Convert.ToInt32(Console.ReadLine());
        
        // TODO: معالجة كل عملية
        // لكل عملية: قراءة الإجراء و courseId
        // التعامل مع: enroll، و complete، و progress، و info
        // إخراج الرسالة المناسبة بناءً على الإجراء
    }
}

جميع دروس Object Oriented Programming