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

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

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 105 من 107.

challenge icon

التحدي

سهل

لنَبْنِ منصة تعلّم إلكتروني تدير الدورات والطلاب وتتتبّع تقدّم التعلّم! ستجمع بين البُنى والواجهات والتركيب وتعدّد الأشكال لإنشاء نظام متماسك يمكن فيه للطلاب التسجيل في الدورات وإكمال Lessons.

ستنظّم شفرتك عبر خمسة ملفات:

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

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

    طبّق الطرق التالية على Enrollment:

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

    اقرأ معرّف course وعنوانه وInstructor الخاص به. ثم اقرأ عدد lessons ومعرّف كل lesson وعنوانه ومدته. اقرأ معرّف student واسمه وEmail الخاص به. أنشئ enrollment يربط student بـ course.

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

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

  • معرّف Course وTitle وInstructor (3 أسطر)
  • عدد lessons، ثم معرّف كل lesson وTitle وDuration (3 أسطر لكل منها)
  • معرّف Student وName وEmail (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 التركيب لربط students وcourses معًا، بينما تتيح واجهة Progressable لأي نوع الإبلاغ عن حالة الإكمال الخاصة به. يجعل هذا التصميم التوسّع سهلًا. يمكنك إضافة تتبّع التقدّم إلى lessons الفردية أو مسارات التعلّم الكاملة باستخدام الواجهة نفسها!

جرّب بنفسك

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("") // استبدل بالنتيجة الفعلية
		}
	}
}

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

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

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

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