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

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

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 105 من 107.

challenge icon

التحدي

سهل

لنقم ببناء منصة تعليم إلكتروني تدير الدورات التدريبية، والطلاب، وتتبع تقدم التعلم! ستجمع بين الهياكل (structs)، والواجهات (interfaces)، والتركيب (composition)، وتعدد الأشكال (polymorphism) لإنشاء نظام متماسك حيث يمكن للطلاب التسجيل في الدورات وإكمال الدروس.

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

  • lesson.go: قم بتعريف هيكل Lesson يمثل وحدات تعليمية فردية. كل درس له ID، و Title، و Duration (بالدقائق). قم بتضمين منشئ NewLesson يعيد مؤشراً إلى Lesson.
  • course.go: قم بإنشاء هيكل Course يحتوي على ID، و Title، و Instructor، وشريحة (slice) من مؤشرات *Lesson. قم بتضمين منشئ NewCourse وتابع AddLesson. قم أيضاً بتنفيذ تابع TotalDuration() int يعيد مجموع مدد جميع الدروس في الدورة.
  • student.go: قم بتعريف هيكل Student مع حقول ID، و Name، و Email. قم بتضمين منشئ NewStudent.
  • enrollment.go: هذا هو المكان الذي يحدث فيه سحر تتبع التقدم. قم بإنشاء هيكل Enrollment يربط الطالب بدورة تدريبية ويتتبع الدروس التي أكملها. يجب أن يحتوي على:
    • مؤشر إلى Student
    • مؤشر إلى Course
    • خريطة CompletedLessons (معرف الدرس إلى قيمة منطقية boolean)

    قم بتعريف واجهة Progressable مع تابع Progress() float64 يعيد نسبة مئوية (من 0.0 إلى 100.0).

    قم بتنفيذ هذه التوابع على Enrollment:

    • NewEnrollment(student *Student, course *Course) *Enrollment — منشئ يقوم بتهيئة خريطة دروس مكتملة فارغة.
    • CompleteLesson(lessonID string) string — يحدد الدرس كمكتمل. يعيد "lesson not found" إذا لم يكن الدرس موجوداً في الدورة، أو "already completed" إذا كان قد اكتمل بالفعل، أو "completed" عند النجاح.
    • Progress() float64 — يعيد النسبة المئوية للدروس المكتملة (المكتملة/الإجمالي * 100)، أو 0.0 إذا كانت الدورة لا تحتوي على دروس.
  • main.go: قم ببناء منصتك ومعالجة عمليات التسجيل.

    اقرأ معرف الدورة، وعنوانها، والمحاضر. ثم اقرأ عدد الدروس ومعرف كل درس وعنوانه ومدته. اقرأ معرف الطالب واسمه وبريده الإلكتروني. أنشئ تسجيلاً (enrollment) يربط الطالب بالدورة.

    ثم اقرأ عدد العمليات. كل عملية هي إما "complete [lessonID]" أو "progress". بالنسبة لعمليات الإكمال، اطبع رسالة النتيجة. بالنسبة لعمليات التقدم، اطبع التقدم منسقاً إلى منزلة عشرية واحدة متبوعاً بعلامة النسبة المئوية.

سيتم توفير المدخلات التالية:

  • معرف الدورة، العنوان، المحاضر (3 أسطر)
  • عدد الدروس، ثم معرف كل درس، العنوان، المدة (3 أسطر لكل درس)
  • معرف الطالب، الاسم، البريد الإلكتروني (3 أسطر)
  • عدد العمليات، ثم كل عملية (سطر واحد لكل منها)

على سبيل المثال، إذا أعطيت:

C001
Go Fundamentals
Jane Smith
3
L001
Variables
30
L002
Functions
45
L003
Structs
60
S001
Alice
alice@learn.com
5
progress
complete L001
progress
complete L001
complete L002

يجب أن يكون مخرجك:

0.0%
completed
33.3%
already completed
completed

وإذا أعطيت:

C100
Python Basics
Bob Teacher
2
L100
Intro
20
L101
Loops
40
S100
Charlie
charlie@edu.com
4
complete L999
complete L100
complete L101
progress

يجب أن يكون مخرجك:

lesson not found
completed
completed
100.0%

لاحظ كيف يستخدم هيكل Enrollment التركيب لربط الطلاب والدورات معاً، بينما تسمح واجهة Progressable لأي نوع بالإبلاغ عن حالة اكتماله. هذا التصميم يجعل من السهل التوسع — يمكنك إضافة تتبع التقدم للدروس الفردية أو مسارات التعلم الكاملة باستخدام نفس الواجهة!

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// دالة مساعدة لقراءة سطر
	readLine := func() string {
		scanner.Scan()
		return strings.TrimSpace(scanner.Text())
	}

	// قراءة معلومات الدورة
	courseID := readLine()
	courseTitle := readLine()
	courseInstructor := readLine()

	// TODO: إنشاء الدورة باستخدام NewCourse
	_ = courseID
	_ = courseTitle
	_ = courseInstructor

	// قراءة عدد الدروس
	numLessons, _ := strconv.Atoi(readLine())

	// TODO: قراءة كل درس وإضافته إلى الدورة
	for i := 0; i < numLessons; i++ {
		lessonID := readLine()
		lessonTitle := readLine()
		lessonDuration, _ := strconv.Atoi(readLine())

		// TODO: إنشاء الدرس وإضافته إلى الدورة
		_ = lessonID
		_ = lessonTitle
		_ = lessonDuration
	}

	// قراءة معلومات الطالب
	studentID := readLine()
	studentName := readLine()
	studentEmail := readLine()

	// TODO: إنشاء الطالب باستخدام NewStudent
	_ = studentID
	_ = studentName
	_ = studentEmail

	// TODO: إنشاء تسجيل يربط الطالب بالدورة

	// قراءة عدد العمليات
	numOps, _ := strconv.Atoi(readLine())

	// معالجة كل عملية
	for i := 0; i < numOps; i++ {
		operation := readLine()

		if operation == "progress" {
			// TODO: استدعاء Progress() والطباعة بالتنسيق "%.1f%%"
			fmt.Println("0.0%") // استبدله بالتقدم الفعلي
		} else if strings.HasPrefix(operation, "complete ") {
			lessonID := strings.TrimPrefix(operation, "complete ")
			// TODO: استدعاء CompleteLesson وطباعة النتيجة
			_ = lessonID
			fmt.Println("") // استبدله بالنتيجة الفعلية
		}
	}
}

جميع دروس Object Oriented Programming

16التحديات النهائية

منصة تعليم إلكترونينظام بنكينظام شخصيات الألعاب