Menu
Coddy logo textTech

Платформа для онлайн-обучения

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy — урок 103 из 104.

challenge icon

Задание

Легко

Давайте создадим платформу электронного обучения (E-Learning Platform), которая объединит все концепции ООП, освоенные вами в этом курсе. Вы создадите систему, которая управляет курсами, различными типами уроков и отслеживает прогресс студентов, демонстрируя иерархии наследования, полиморфизм, умные указатели и паттерны проектирования, работающие в гармонии.

Вы распределите свой код по шести файлам:

  • User.h: Создайте иерархию пользователей с базовым классом User и двумя производными классами: Student и Instructor.

    Ваш базовый класс User должен иметь имя и ID, виртуальный метод getRole(), который возвращает тип пользователя в виде строки, и метод getInfo(), который возвращает "[name] ([id]) - [role]".

    Класс Student отслеживает ID курсов, на которые он записан (используйте вектор строк), и количество пройденных уроков. Добавьте методы enrollInCourse(const std::string& courseId), completedLesson() для увеличения счетчика и getCompletedCount().

    Класс Instructor хранит строку со специализацией и отслеживает ID курсов, которые он ведет. Добавьте addCourse(const std::string& courseId) и getSpecialty().

  • Lesson.h: Постройте иерархию уроков, используя абстрактный базовый класс.

    Ваш базовый класс Lesson должен иметь название и продолжительность (в минутах), чисто виртуальный метод complete(), который возвращает сообщение о завершении, и метод getType(), возвращающий тип урока.

    Создайте три производных класса:

    • VideoLesson: Имеет URL-адрес видео. Его метод complete() возвращает "Watched video: [title]"
    • QuizLesson: Имеет количество вопросов. Его метод complete() возвращает "Completed quiz: [title] ([questions] questions)"
    • TextLesson: Имеет количество слов. Его метод complete() возвращает "Read article: [title]"

    Каждый класс должен переопределять getType(), чтобы возвращать "Video", "Quiz" или "Text" соответственно.

  • Course.h: Создайте класс Course, который владеет своими уроками с помощью умных указателей.

    Курс имеет название, ID и ID инструктора. Храните уроки как std::vector<std::unique_ptr<Lesson>>, так как курс владеет своими уроками эксклюзивно.

    Добавьте методы:

    • addLesson(std::unique_ptr<Lesson> lesson) — передает владение уроком курсу
    • getLessonCount() — возвращает количество уроков
    • getLesson(size_t index) — возвращает указатель на урок по этому индексу (или nullptr, если индекс невалиден)
    • displayCurriculum() — выводит тип и название каждого урока в формате "[index]. [Type]: [title]"
  • LessonFactory.h: Реализуйте паттерн «Фабрика» для создания различных типов уроков.

    Создайте класс LessonFactory со статическим методом createLesson(const std::string& type, const std::string& title, int duration, const std::string& extra), который возвращает std::unique_ptr<Lesson>.

    Параметр type определяет, какой урок создать ("video", "quiz" или "text"). Параметр extra содержит данные, специфичные для типа: URL для видео, количество вопросов для теста (преобразовать в int) или количество слов для текста (преобразовать в int).

  • Platform.h: Создайте центральный класс Platform, который координирует всё остальное.

    Храните курсы как std::vector<std::shared_ptr<Course>>, а пользователей как std::vector<std::shared_ptr<User>>.

    Реализуйте:

    • addCourse(std::shared_ptr<Course> course)
    • addUser(std::shared_ptr<User> user)
    • findCourse(const std::string& id) — возвращает shared_ptr или nullptr
    • findUser(const std::string& id) — возвращает shared_ptr или nullptr
    • enrollStudent(const std::string& studentId, const std::string& courseId) — находит обоих, записывает студента, выводит "Enrolled [name] in [course title]" или "Enrollment failed"
    • completeLesson(const std::string& studentId, const std::string& courseId, size_t lessonIndex) — находит студента и курс, вызывает метод complete() урока, увеличивает счетчик пройденных уроков студента, выводит сообщение о завершении или "Could not complete lesson"
  • main.cpp: Соберите всё вместе, чтобы продемонстрировать работу вашей платформы.

    Прочитайте четыре входных значения:

    1. Название платформы
    2. Детали курса (формат: title,courseId,instructorId)
    3. Детали студента (формат: name,studentId)
    4. Урок для добавления (формат: type,title,duration,extra)

    Создайте платформу и выведите "Welcome to [platform name]!". Создайте курс и студента, добавьте их на платформу. Используйте LessonFactory для создания урока и добавьте его в курс. Выведите учебный план курса. Запишите студента на курс. Завершите первый урок (индекс 0) для этого студента. Наконец, выведите информацию о студенте и количество пройденных им уроков в формате "Completed lessons: [count]".

Например, при входных данных CodeAcademy, C++ Mastery,CPP101,I001, Alice,S001 и 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

При входных данных LearnHub, Python Basics,PY100,I002, Bob,S002 и 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

Эта задача демонстрирует структуру реальных платформ электронного обучения — с четким разделением между пользователями, контентом и платформой, которая их координирует. Паттерн «Фабрика» делает создание уроков гибким, умные указатели обеспечивают безопасное управление памятью, а полиморфизм позволяет единообразно работать со всеми типами уроков, в то время как каждый из них ведет себя уникально.

Попробуйте сами

#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() {
    // Чтение входных данных
    std::string platformName;
    std::getline(std::cin, platformName);
    
    std::string courseDetails; // формат: title,courseId,instructorId
    std::getline(std::cin, courseDetails);
    
    std::string studentDetails; // формат: name,studentId
    std::getline(std::cin, studentDetails);
    
    std::string lessonDetails; // формат: type,title,duration,extra
    std::getline(std::cin, lessonDetails);
    
    // TODO: Разобрать courseDetails, чтобы извлечь title, courseId, instructorId
    
    // TODO: Разобрать studentDetails, чтобы извлечь name, studentId
    
    // TODO: Разобрать lessonDetails, чтобы извлечь type, title, duration, extra
    
    // TODO: Создать платформу и вывести "Welcome to [platform name]!"
    
    // TODO: Создать курс и студента, добавить их на платформу
    
    // TODO: Использовать LessonFactory для создания урока и добавить его в курс
    
    // TODO: Отобразить учебную программу курса
    
    // TODO: Записать студента на курс
    
    // TODO: Завершить первый урок (индекс 0) для студента
    
    // TODO: Вывести информацию о студенте и количество завершенных уроков
    // Формат: "Completed lessons: [count]"
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование

15Финальные испытания

Платформа для онлайн-обученияБанковская система