Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

  • Lesson.cs: Создайте класс Lesson в пространстве имен ELearning.Models. Каждый урок имеет свойства только для чтения Title (string) и DurationMinutes (int), устанавливаемые через конструктор.
  • Course.cs: Создайте класс Course в пространстве имен ELearning.Models. Курс имеет свойства только для чтения Id (string), Title (string) и Instructor (string), а также список Lessons. Включите метод AddLesson(Lesson lesson) и свойство только для чтения TotalDuration, которое вычисляет сумму длительностей всех уроков.
  • Student.cs: Создайте класс Student в пространстве имен ELearning.Models со свойствами только для чтения Id (int) и Name (string). Студенты отслеживают свой прогресс через приватный словарь, который сопоставляет ID курсов с количеством пройденных уроков. Включите методы CompleteLesson(string courseId) для увеличения прогресса и GetProgress(string courseId) для возврата количества пройденных уроков (или 0, если студент не записан на курс).
  • EnrollmentService.cs: Создайте класс EnrollmentService в пространстве имен ELearning.Services. Этот сервис управляет курсами и записями, используя приватные коллекции. Реализуйте:
    • AddCourse(Course course) — добавляет курс на платформу
    • Enroll(Student student, string courseId) — возвращает true, если запись прошла успешно, и false, если курс не существует или студент уже записан
    • GetEnrolledCourses(Student student) — возвращает список ID курсов, на которые записан студент
    • GetCourse(string courseId) — возвращает курс или null, если он не найден
  • Program.cs: Объедините все вместе, создавая курсы с уроками, записывая студентов, отслеживая прогресс и отображая результаты на основе входных данных.

Вы получите следующие входные данные:

  • Количество курсов для создания
  • Для каждого курса: ID, название, инструктор, количество уроков, затем для каждого урока: название и длительность (в минутах)
  • ID и имя студента
  • Количество операций для выполнения
  • Для каждой операции: действие (enroll, complete, progress или info), за которым следует ID курса

Форматы вывода:

  • enroll: Вывести Enrolled in: {CourseTitle} или Enrollment failed: {courseId}
  • complete: Вывести Completed lesson in {CourseTitle} (увеличить прогресс на 1)
  • progress: Вывести {CourseTitle}: {completed}/{total} lessons
  • info: Вывести {CourseTitle} by {Instructor} - {TotalDuration} minutes

Например, если входные данные следующие:

2
CS101
Intro to Programming
Dr. Smith
3
Variables
30
Loops
45
Functions
60
CS102
Data Structures
Dr. Jones
2
Arrays
40
Lists
50
1
Alice
6
enroll
CS101
info
CS101
complete
CS101
complete
CS101
progress
CS101
enroll
CS999

Вывод должен быть таким:

Enrolled in: Intro to Programming
Intro to Programming by Dr. Smith - 135 minutes
Completed lesson in Intro to Programming
Completed lesson in Intro to Programming
Intro to Programming: 2/3 lessons
Enrollment failed: CS999

Обратите внимание, как сервис управляет отношениями между студентами и курсами, в то время как каждый класс отвечает за свои собственные задачи. Студент отслеживает свой собственный прогресс, курсы вычисляют свою общую длительность, а сервис записи координирует все — чистое разделение ответственности!

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

using System;
using System.Collections.Generic;
using ELearning.Models;
using ELearning.Services;

class Program
{
    public static void Main(string[] args)
    {
        // Считать количество курсов
        int numCourses = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Создать экземпляр EnrollmentService
        
        // TODO: Считать и создать каждый курс с его уроками
        // Для каждого курса: считать ID, название, инструктора, количество уроков
        // Для каждого урока: считать название и продолжительность
        // Добавить уроки в курс, затем добавить курс в сервис
        
        // Считать информацию о студенте
        int studentId = Convert.ToInt32(Console.ReadLine());
        string studentName = Console.ReadLine();
        
        // TODO: Создать экземпляр Student
        
        // Считать количество операций
        int numOperations = Convert.ToInt32(Console.ReadLine());
        
        // TODO: Обработать каждую операцию
        // Для каждой операции: считать действие и courseId
        // Обработать: enroll, complete, progress, info
        // Вывести соответствующее сообщение в зависимости от действия
    }
}

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