Menu
Coddy logo textTech

פלטפורמת למידה מקוונת

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GO של Coddy. שיעור 105 מתוך 107.

challenge icon

אתגר

קל

בואו נבנה פלטפורמת למידה מקוונת שמנהלת קורסים ותלמידים ועוקבת אחר התקדמות הלמידה! תשלבו מבנים, ממשקים, הרכבה ופולימורפיזם כדי ליצור מערכת אחידה שבה תלמידים יכולים להירשם לקורסים ולהשלים שיעורים.

תארגנו את הקוד שלכם בחמישה קבצים:

  • lesson.go: הגדירו מבנה Lesson שמייצג יחידות למידה בודדות. לכל שיעור יש ID,‏ Title ו-Duration (בדקות). כללו בנאי NewLesson שמחזיר מצביע ל-Lesson.
  • course.go: צרו מבנה Course שמכיל ID,‏ Title,‏ Instructor ופרוסה של מצביעים מסוג *Lesson. כללו בנאי NewCourse ומתודה AddLesson. כמו כן, ממשו מתודה TotalDuration() int שמחזירה את סכום משכי כל השיעורים בקורס.
  • student.go: הגדירו מבנה Student עם השדות ID,‏ Name ו-Email. כללו בנאי NewStudent.
  • enrollment.go: כאן מתרחש הקסם של מעקב ההתקדמות. צרו מבנה Enrollment שמקשר תלמיד לקורס ועוקב אחר השיעורים שהתלמיד השלים. צריכים להיות בו:
    • מצביע ל-Student
    • מצביע ל-Course
    • מפה CompletedLessons (מזהה שיעור לערך בוליאני)

    הגדירו ממשק 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: בנו את הפלטפורמה ועבדו את פעולות ההרשמה.

    קראו את מזהה הקורס, את הכותרת שלו ואת שם המדריך. לאחר מכן קראו את מספר השיעורים ואת המזהה, הכותרת והמשך של כל שיעור. קראו את מזהה התלמיד, את שמו ואת כתובת הדוא״ל שלו. צרו הרשמה שמקשרת את התלמיד לקורס.

    לאחר מכן קראו את מספר הפעולות. כל פעולה היא 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("") // החליפו בתוצאה בפועל
		}
	}
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר Go אונליין