Menu
Coddy logo textTech

E-Learning-Plattform

Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 105 von 107.

challenge icon

Aufgabe

Einfach

Lass uns eine E-Learning-Plattform erstellen, die Kurse und Studierende verwaltet und den Lernfortschritt verfolgt! Du wirst Structs, Interfaces, Komposition und Polymorphismus kombinieren, um ein zusammenhängendes System zu erstellen, in dem sich Studierende für Kurse einschreiben und Lektionen abschließen können.

Du wirst deinen Code auf fünf Dateien verteilen:

  • lesson.go: Definiere ein Lesson-Struct, das einzelne Lerneinheiten repräsentiert. Jede Lektion hat eine ID, einen Title und eine Duration (in Minuten). Füge einen NewLesson-Konstruktor hinzu, der einen Zeiger auf ein Lesson zurückgibt.
  • course.go: Erstelle ein Course-Struct, das eine ID, einen Title, einen Instructor und ein Slice mit *Lesson-Zeigern enthält. Füge einen NewCourse-Konstruktor und eine AddLesson-Methode hinzu. Implementiere außerdem eine TotalDuration() int-Methode, die die Summe der Dauer aller Lektionen im Kurs zurückgibt.
  • student.go: Definiere ein Student-Struct mit den Feldern ID, Name und Email. Füge einen NewStudent-Konstruktor hinzu.
  • enrollment.go: Hier geschieht die Magie der Fortschrittsverfolgung. Erstelle ein Enrollment-Struct, das einen Studierenden mit einem Kurs verknüpft und verfolgt, welche Lektionen abgeschlossen wurden. Es sollte Folgendes enthalten:
    • Einen Zeiger auf den Student
    • Einen Zeiger auf den Course
    • Eine CompletedLessons-Map (Lektions-ID zu Boolean)

    Definiere ein Progressable-Interface mit einer Progress() float64-Methode, die einen Prozentsatz (0.0 bis 100.0) zurückgibt.

    Implementiere diese Methoden für Enrollment:

    • NewEnrollment(student *Student, course *Course) *Enrollment: Konstruktor, der eine leere Map für abgeschlossene Lektionen initialisiert
    • CompleteLesson(lessonID string) string: Markiert eine Lektion als abgeschlossen. Gibt lesson not found zurück, wenn die Lektion im Kurs nicht existiert, already completed, wenn sie bereits abgeschlossen wurde, oder bei Erfolg completed
    • Progress() float64: Gibt den Prozentsatz der abgeschlossenen Lektionen zurück (abgeschlossen/gesamt * 100) oder 0.0, wenn der Kurs keine Lektionen enthält
  • main.go: Erstelle deine Plattform und verarbeite Einschreibevorgänge.

    Lies die ID, den Titel und den Dozenten eines Kurses ein. Lies anschließend die Anzahl der Lektionen sowie die ID, den Titel und die Dauer jeder Lektion ein. Lies die ID, den Namen und die E-Mail-Adresse eines Studierenden ein. Erstelle eine Einschreibung, die den Studierenden mit dem Kurs verknüpft.

    Lies anschließend die Anzahl der Vorgänge ein. Jeder Vorgang ist entweder complete [lessonID] oder progress. Gib bei Abschlussvorgängen die Ergebnismeldung aus. Gib bei Fortschrittsvorgängen den Fortschritt, auf eine Dezimalstelle formatiert, gefolgt von einem Prozentzeichen aus.

Die folgenden Eingaben werden bereitgestellt:

  • Kurs-ID, Titel, Dozent (3 Zeilen)
  • Anzahl der Lektionen, anschließend die ID, der Titel und die Dauer jeder Lektion (jeweils 3 Zeilen)
  • Studierenden-ID, Name, E-Mail-Adresse (3 Zeilen)
  • Anzahl der Vorgänge, anschließend jeder Vorgang (jeweils 1 Zeile)

Beispielweise bei folgenden Eingaben:

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

Deine Ausgabe sollte lauten:

0.0%
completed
33.3%
already completed
completed

Und bei folgenden Eingaben:

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

Deine Ausgabe sollte lauten:

lesson not found
completed
completed
100.0%

Beachte, wie das Enrollment-Struct Komposition verwendet, um Studierende und Kurse miteinander zu verknüpfen, während das Progressable-Interface es jedem Typ ermöglicht, seinen Abschlussstatus zu melden. Dieses Design lässt sich leicht erweitern. Du könntest mithilfe desselben Interfaces die Fortschrittsverfolgung auf einzelne Lektionen oder ganze Lernpfade ausweiten!

Probier es selbst

package main

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

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

	// Hilfsfunktion zum Lesen einer Zeile
	readLine := func() string {
		scanner.Scan()
		return strings.TrimSpace(scanner.Text())
	}

	// Kursinformationen lesen
	courseID := readLine()
	courseTitle := readLine()
	courseInstructor := readLine()

	// TODO: Create the course using NewCourse
	_ = courseID
	_ = courseTitle
	_ = courseInstructor

	// Anzahl der Lektionen lesen
	numLessons, _ := strconv.Atoi(readLine())

	// TODO: Read each lesson and add to course
	for i := 0; i < numLessons; i++ {
		lessonID := readLine()
		lessonTitle := readLine()
		lessonDuration, _ := strconv.Atoi(readLine())

		// TODO: Create lesson and add to course
		_ = lessonID
		_ = lessonTitle
		_ = lessonDuration
	}

	// Studenteninformationen lesen
	studentID := readLine()
	studentName := readLine()
	studentEmail := readLine()

	// TODO: Create the student using NewStudent
	_ = studentID
	_ = studentName
	_ = studentEmail

	// TODO: Create enrollment linking student to course

	// Anzahl der Operationen lesen
	numOps, _ := strconv.Atoi(readLine())

	// Jede Operation verarbeiten
	for i := 0; i < numOps; i++ {
		operation := readLine()

		if operation == "progress" {
			// TODO: Call Progress() and print with format "%.1f%%"
			fmt.Println("0.0%") // Ersetze durch den tatsächlichen Fortschritt
		} else if strings.HasPrefix(operation, "complete ") {
			lessonID := strings.TrimPrefix(operation, "complete ")
			// TODO: CompleteLesson aufrufen und das Ergebnis ausgeben
			_ = lessonID
			fmt.Println("") // Ersetze durch das tatsächliche Ergebnis
		}
	}
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Go-Compiler