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

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