Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

Вы организуете код в шести файлах:

  • 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: Реализуйте шаблон Factory для создания различных типов уроков.

    Создайте класс 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

Этот вызов демонстрирует структуру реальных платформ электронного обучения с чётким разделением пользователей, контента и платформы, которая их координирует. Шаблон Factory делает создание уроков гибким, умные указатели обеспечивают безопасное управление памятью, а полиморфизм позволяет единообразно работать со всеми типами уроков, сохраняя уникальное поведение каждого из них.

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

#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: Print the student's info and completed lesson count
    // Format: "Completed lessons: [count]"
    
    return 0;
}

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор C++