Menu
Coddy logo textTech

E-Learning-Plattform

Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 103 von 104.

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine E-Learning-Plattform bauen, die alle OOP-Konzepte zusammenführt, die Sie in diesem Kurs gemeistert haben. Sie werden ein System erstellen, das Kurse und verschiedene Arten von Lektionen verwaltet sowie den Fortschritt der Studenten verfolgt — und dabei zeigen, wie Vererbungshierarchien, Polymorphismus, Smart Pointer und Entwurfsmuster harmonisch zusammenarbeiten.

Sie werden Ihren Code auf sechs Dateien verteilen:

  • User.h: Erstellen Sie eine Benutzerhierarchie mit einer Basisklasse User und zwei abgeleiteten Klassen: Student und Instructor.

    Ihre Basisklasse User sollte einen Namen und eine ID haben, mit einer virtuellen Methode getRole(), die den Benutzertyp als String zurückgibt, und einer Methode getInfo(), die "[name] ([id]) - [role]" zurückgibt.

    Die Klasse Student verfolgt die IDs der eingeschriebenen Kurse (verwenden Sie einen Vector von Strings) und die Anzahl der abgeschlossenen Lektionen. Fügen Sie die Methoden enrollInCourse(const std::string& courseId), completedLesson() zum Erhöhen des Zählers und getCompletedCount() hinzu.

    Die Klasse Instructor speichert einen Spezialisierungs-String und verfolgt die IDs der Kurse, die sie unterrichten. Fügen Sie addCourse(const std::string& courseId) und getSpecialty() hinzu.

  • Lesson.h: Erstellen Sie eine Lektionshierarchie unter Verwendung einer abstrakten Basisklasse.

    Ihre Basisklasse Lesson sollte einen Titel und eine Dauer (in Minuten) haben, mit einer rein virtuellen Methode complete(), die eine Abschlussmeldung zurückgibt, und einer Methode getType(), die den Lektionstyp zurückgibt.

    Erstellen Sie drei abgeleitete Klassen:

    • VideoLesson: Hat eine Video-URL. Ihr complete() gibt "Watched video: [title]" zurück.
    • QuizLesson: Hat eine Anzahl von Fragen. Ihr complete() gibt "Completed quiz: [title] ([questions] questions)" zurück.
    • TextLesson: Hat eine Wortanzahl. Ihr complete() gibt "Read article: [title]" zurück.

    Jede Klasse sollte getType() überschreiben, um jeweils "Video", "Quiz" oder "Text" zurückzugeben.

  • Course.h: Erstellen Sie eine Klasse Course, die ihre Lektionen mittels Smart Pointern besitzt.

    Ein Kurs hat einen Titel, eine ID und eine Dozenten-ID. Speichern Sie Lektionen als std::vector<std::unique_ptr<Lesson>>, da der Kurs seine Lektionen exklusiv besitzt.

    Fügen Sie folgende Methoden hinzu:

    • addLesson(std::unique_ptr<Lesson> lesson) — überträgt den Besitz der Lektion auf den Kurs.
    • getLessonCount() — gibt die Anzahl der Lektionen zurück.
    • getLesson(size_t index) — gibt einen Pointer auf die Lektion an diesem Index zurück (oder nullptr, falls ungültig).
    • displayCurriculum() — gibt den Typ und Titel jeder Lektion im Format "[index]. [Type]: [title]" aus.
  • LessonFactory.h: Implementieren Sie das Factory-Muster, um verschiedene Lektionstypen zu erstellen.

    Erstellen Sie eine Klasse LessonFactory mit einer statischen Methode createLesson(const std::string& type, const std::string& title, int duration, const std::string& extra), die einen std::unique_ptr<Lesson> zurückgibt.

    Der Parameter type bestimmt, welche Lektion erstellt werden soll ("video", "quiz" oder "text"). Der Parameter extra enthält typspezifische Daten: URL für Video, Fragenanzahl für Quiz (als int parsen) oder Wortanzahl für Text (als int parsen).

  • Platform.h: Bauen Sie die zentrale Klasse Platform, die alles koordiniert.

    Speichern Sie Kurse als std::vector<std::shared_ptr<Course>> und Benutzer als std::vector<std::shared_ptr<User>>.

    Implementieren Sie:

    • addCourse(std::shared_ptr<Course> course)
    • addUser(std::shared_ptr<User> user)
    • findCourse(const std::string& id) — gibt shared_ptr oder nullptr zurück.
    • findUser(const std::string& id) — gibt shared_ptr oder nullptr zurück.
    • enrollStudent(const std::string& studentId, const std::string& courseId) — findet beides, schreibt den Studenten ein, gibt "Enrolled [name] in [course title]" oder "Enrollment failed" aus.
    • completeLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex) — findet den Studenten und den Kurs, ruft die complete()-Methode der Lektion auf, erhöht den Zähler der abgeschlossenen Lektionen des Studenten und gibt die Abschlussmeldung oder "Could not complete lesson" aus.
  • main.cpp: Bringen Sie alles zusammen, um Ihre Plattform zu demonstrieren.

    Lesen Sie vier Eingaben ein:

    1. Name der Plattform
    2. Kursdetails (Format: title,courseId,instructorId)
    3. Studentendetails (Format: name,studentId)
    4. Hinzuzufügende Lektion (Format: type,title,duration,extra)

    Erstellen Sie die Plattform und geben Sie "Welcome to [platform name]!" aus. Erstellen Sie den Kurs und den Studenten, fügen Sie sie der Plattform hinzu. Verwenden Sie die LessonFactory, um die Lektion zu erstellen und dem Kurs hinzuzufügen. Zeigen Sie das Kurs-Curriculum an. Schreiben Sie den Studenten in den Kurs ein. Schließen Sie die erste Lektion (Index 0) für diesen Studenten ab. Geben Sie schließlich die Informationen des Studenten und die Anzahl seiner abgeschlossenen Lektionen als "Completed lessons: [count]" aus.

Zum Beispiel mit den Eingaben CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001 und video,Introduction to OOP,30,https://example.com/oop:

Welcome to CodeAcademy!
1. Video: Introduction to OOP
Enrolled Alice in C++ Mastery
Watched video: Introduction to OOP
Alice (S001) - Student
Completed lessons: 1

Mit den Eingaben LearnHub, Python Basics,PY100,I002, Bob,S002 und quiz,Variables Quiz,15,10:

Welcome to LearnHub!
1. Quiz: Variables Quiz
Enrolled Bob in Python Basics
Completed quiz: Variables Quiz (10 questions)
Bob (S002) - Student
Completed lessons: 1

Diese Herausforderung zeigt, wie echte E-Learning-Plattformen strukturiert sind — mit einer klaren Trennung zwischen Benutzern, Inhalten und der Plattform, die sie koordiniert. Das Factory-Muster macht die Erstellung von Lektionen flexibel, Smart Pointer gewährleisten eine sichere Speicherverwaltung und Polymorphismus ermöglicht es Ihnen, alle Lektionstypen einheitlich zu behandeln, während sich jeder individuell verhält.

Probier es selbst

#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include "User.h"
#include "Lesson.h"
#include "Course.h"
#include "LessonFactory.h"
#include "Platform.h"

int main() {
    // Eingaben lesen
    std::string platformName;
    std::getline(std::cin, platformName);
    
    std::string courseDetails; // Format: title,courseId,instructorId
    std::getline(std::cin, courseDetails);
    
    std::string studentDetails; // Format: name,studentId
    std::getline(std::cin, studentDetails);
    
    std::string lessonDetails; // Format: type,title,duration,extra
    std::getline(std::cin, lessonDetails);
    
    // TODO: courseDetails parsen, um title, courseId, instructorId zu extrahieren
    
    // TODO: studentDetails parsen, um name, studentId zu extrahieren
    
    // TODO: lessonDetails parsen, um type, title, duration, extra zu extrahieren
    
    // TODO: Die Plattform erstellen und "Welcome to [platform name]!" anzeigen
    
    // TODO: Den Kurs und den Studenten erstellen und zur Plattform hinzufügen
    
    // TODO: LessonFactory verwenden, um die Lektion zu erstellen und zum Kurs hinzuzufügen
    
    // TODO: Das Kurs-Curriculum anzeigen
    
    // TODO: Den Studenten in den Kurs einschreiben
    
    // TODO: Die erste Lektion (Index 0) für den Studenten abschließen
    
    // TODO: Die Informationen des Studenten und die Anzahl der abgeschlossenen Lektionen ausgeben
    // Format: "Completed lessons: [count]"
    
    return 0;
}

Alle Lektionen in Objektorientierte Programmierung