Platforma e-learningowa
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 103 z 104.
Wyzwanie
ŁatwyZbudujmy platformę e-learningową, która łączy wszystkie koncepcje OOP opanowane przez Ciebie w trakcie tego kursu. Stworzysz system zarządzający kursami i różnymi typami lekcji oraz śledzący postępy uczniów, demonstrujący współdziałanie hierarchii dziedziczenia, polimorfizmu, inteligentnych wskaźników i wzorców projektowych.
Rozmieścisz swój kod w sześciu plikach:
User.h: Utwórz hierarchię użytkowników z bazową klasąUseri dwiema klasami pochodnymi:StudentorazInstructor.Twoja bazowa klasa
Userpowinna zawierać imię i identyfikator, wirtualną metodęgetRole(), która zwraca typ użytkownika jako ciąg znaków, oraz metodęgetInfo(), która zwraca"[name] ([id]) - [role]".Klasa
Studentśledzi identyfikatory zapisanych kursów (użyj wektora ciągów znaków) oraz liczbę ukończonych lekcji. Dodaj metodyenrollInCourse(const std::string& courseId),completedLesson()do zwiększania licznika orazgetCompletedCount().Klasa
Instructorprzechowuje ciąg znaków określający specjalizację i śledzi identyfikatory prowadzonych kursów. Dodaj metodyaddCourse(const std::string& courseId)igetSpecialty().Lesson.h: Zbuduj hierarchię lekcji, używając abstrakcyjnej klasy bazowej.Twoja bazowa klasa
Lessonpowinna zawierać tytuł i czas trwania (w minutach), czysto wirtualną metodęcomplete(), która zwraca komunikat o ukończeniu, oraz metodęgetType(), która zwraca typ lekcji.Utwórz trzy klasy pochodne:
VideoLesson: Zawiera URL filmu. Jej metodacomplete()zwraca"Watched video: [title]"QuizLesson: Zawiera liczbę pytań. Jej metodacomplete()zwraca"Completed quiz: [title] ([questions] questions)"TextLesson: Zawiera liczbę słów. Jej metodacomplete()zwraca"Read article: [title]"
Każda z nich powinna nadpisywać metodę
getType(), zwracając odpowiednio"Video","Quiz"lub"Text".Course.h: Utwórz klasęCourse, która zarządza swoimi lekcjami za pomocą inteligentnych wskaźników.Kurs ma tytuł, identyfikator oraz identyfikator instruktora. Przechowuj lekcje jako
std::vector<std::unique_ptr<Lesson>>, ponieważ kurs jest ich wyłącznym właścicielem.Dodaj metody:
addLesson(std::unique_ptr<Lesson> lesson): przenosi własność lekcji na kursgetLessonCount(): zwraca liczbę lekcjigetLesson(size_t index): zwraca wskaźnik do lekcji o podanym indeksie (lub nullptr, jeśli indeks jest nieprawidłowy)displayCurriculum(): wyświetla typ i tytuł każdej lekcji w formacie"[index]. [Type]: [title]"
LessonFactory.h: Zaimplementuj wzorzec Fabryki, aby tworzyć różne typy lekcji.Utwórz klasę
LessonFactoryze statyczną metodącreateLesson(const std::string& type, const std::string& title, int duration, const std::string& extra), która zwracastd::unique_ptr<Lesson>.Parametr
typeokreśla, którą lekcję utworzyć ("video","quiz"lub"text"). Parametrextrazawiera dane właściwe dla danego typu: URL filmu, liczbę pytań w quizie (przekształć na int) lub liczbę słów w lekcji tekstowej (przekształć na int).Platform.h: Zbuduj centralną klasęPlatform, która koordynuje wszystkie elementy.Przechowuj kursy jako
std::vector<std::shared_ptr<Course>>, a użytkowników jakostd::vector<std::shared_ptr<User>>.Zaimplementuj:
addCourse(std::shared_ptr<Course> course)addUser(std::shared_ptr<User> user)findCourse(const std::string& id): zwraca shared_ptr lub nullptrfindUser(const std::string& id): zwraca shared_ptr lub nullptrenrollStudent(const std::string& studentId, const std::string& courseId): wyszukuje oba elementy, zapisuje ucznia na kurs i wyświetla"Enrolled [name] in [course title]"lub"Enrollment failed"completeLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex): wyszukuje ucznia i kurs, wywołuje metodę complete() lekcji, zwiększa licznik ukończonych lekcji ucznia i wyświetla komunikat o ukończeniu lub"Could not complete lesson"
main.cpp: Połącz wszystkie elementy, aby zaprezentować działanie platformy.Wczytaj cztery dane wejściowe:
- Nazwę platformy
- Szczegóły kursu (format:
title,courseId,instructorId) - Szczegóły ucznia (format:
name,studentId) - Dodawaną lekcję (format:
type,title,duration,extra)
Utwórz platformę i wyświetl
"Welcome to [platform name]!". Utwórz kurs i ucznia, a następnie dodaj ich do platformy. Użyj LessonFactory, aby utworzyć lekcję i dodać ją do kursu. Wyświetl program kursu. Zapisz ucznia na kurs. Ukończ pierwszą lekcję (indeks 0) przez tego ucznia. Na koniec wyświetl informacje o uczniu oraz liczbę ukończonych przez niego lekcji w formacie"Completed lessons: [count]".
Na przykład dla danych wejściowych CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001 i 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: 1Dla danych wejściowych LearnHub, Python Basics,PY100,I002, Bob,S002 i 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: 1To wyzwanie pokazuje, jak są zbudowane rzeczywiste platformy e-learningowe, z wyraźnym podziałem na użytkowników, treści i koordynującą je platformę. Wzorzec Fabryki uelastycznia tworzenie lekcji, inteligentne wskaźniki zapewniają bezpieczne zarządzanie pamięcią, a polimorfizm pozwala traktować wszystkie typy lekcji jednolicie, mimo że każdy z nich zachowuje się inaczej.
Spróbuj swoich sił
#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() {
// Odczytaj dane wejściowe
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: Przeanalizuj courseDetails, aby wyodrębnić title, courseId, instructorId
// TODO: Przeanalizuj studentDetails, aby wyodrębnić name, studentId
// TODO: Przeanalizuj lessonDetails, aby wyodrębnić type, title, duration, extra
// TODO: Utwórz platformę i wyświetl "Welcome to [platform name]!"
// TODO: Utwórz kurs i studenta, a następnie dodaj ich do platformy
// TODO: Użyj LessonFactory, aby utworzyć lekcję i dodać ją do kursu
// TODO: Wyświetl program kursu
// TODO: Zapisz studenta na kurs
// TODO: Oznacz pierwszą lekcję (indeks 0) jako ukończoną przez ucznia
// TODO: Wyświetl informacje o uczniu i liczbę ukończonych lekcji
// Format: "Completed lessons: [count]"
return 0;
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online