Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

  • lesson.go: Определите структуру Lesson, представляющую отдельные учебные единицы. Каждый урок имеет ID, Title и Duration (в минутах). Включите конструктор NewLesson, который возвращает указатель на Lesson.
  • course.go: Создайте структуру Course, которая содержит ID, Title, Instructor и слайс указателей *Lesson. Включите конструктор NewCourse и метод AddLesson. Также реализуйте метод TotalDuration() int, который возвращает сумму длительностей всех уроков в курсе.
  • student.go: Определите структуру Student с полями ID, Name и Email. Включите конструктор NewStudent.
  • enrollment.go: Здесь происходит магия отслеживания прогресса. Создайте структуру Enrollment, которая связывает студента с курсом и отслеживает, какие уроки он завершил. Она должна иметь:
    • Указатель на Student
    • Указатель на Course
    • Карту CompletedLessons (ID урока в логическое значение)

    Определите интерфейс Progressable с методом Progress() float64, который возвращает процент (от 0.0 до 100.0).

    Реализуйте эти методы для Enrollment:

    • NewEnrollment(student *Student, course *Course) *Enrollment — конструктор, который инициализирует пустую карту завершенных уроков
    • CompleteLesson(lessonID string) string — помечает урок как завершенный. Возвращает "lesson not found", если урок не существует в курсе, "already completed", если он уже выполнен, или "completed" в случае успеха
    • Progress() float64 — возвращает процент завершенных уроков (завершенные/всего * 100) или 0.0, если в курсе нет уроков
  • main.go: Создайте свою платформу и обработайте операции по зачислению.

    Считайте ID курса, название и инструктора. Затем считайте количество уроков и ID, название и длительность каждого урока. Считайте ID студента, имя и email. Создайте запись о зачислении (enrollment), связывающую студента с курсом.

    Затем считайте количество операций. Каждая операция — это либо "complete [lessonID]", либо "progress". Для операций complete выведите ответное сообщение. Для операций progress выведите прогресс, отформатированный до одного знака после запятой, за которым следует знак процента.

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

  • ID курса, Название, Инструктор (3 строки)
  • Количество уроков, затем ID, Название, Длительность каждого урока (по 3 строки на каждый)
  • ID студента, Имя, Email (3 строки)
  • Количество операций, затем каждая операция (по 1 строке на каждую)

Например, при вводе:

C001
Go Fundamentals
Jane Smith
3
L001
Variables
30
L002
Functions
45
L003
Structs
60
S001
Alice
alice@learn.com
5
progress
complete L001
progress
complete L001
complete L002

Ваш вывод должен быть:

0.0%
completed
33.3%
already completed
completed

И при вводе:

C100
Python Basics
Bob Teacher
2
L100
Intro
20
L101
Loops
40
S100
Charlie
charlie@edu.com
4
complete L999
complete L100
complete L101
progress

Ваш вывод должен быть:

lesson not found
completed
completed
100.0%

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

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

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// Вспомогательная функция для чтения строки
	readLine := func() string {
		scanner.Scan()
		return strings.TrimSpace(scanner.Text())
	}

	// Чтение информации о курсе
	courseID := readLine()
	courseTitle := readLine()
	courseInstructor := readLine()

	// TODO: Создать курс, используя NewCourse
	_ = courseID
	_ = courseTitle
	_ = courseInstructor

	// Чтение количества уроков
	numLessons, _ := strconv.Atoi(readLine())

	// TODO: Прочитать каждый урок и добавить в курс
	for i := 0; i < numLessons; i++ {
		lessonID := readLine()
		lessonTitle := readLine()
		lessonDuration, _ := strconv.Atoi(readLine())

		// TODO: Создать урок и добавить в курс
		_ = lessonID
		_ = lessonTitle
		_ = lessonDuration
	}

	// Чтение информации о студенте
	studentID := readLine()
	studentName := readLine()
	studentEmail := readLine()

	// TODO: Создать студента, используя NewStudent
	_ = studentID
	_ = studentName
	_ = studentEmail

	// TODO: Создать регистрацию (enrollment), связывающую студента с курсом

	// Чтение количества операций
	numOps, _ := strconv.Atoi(readLine())

	// Обработка каждой операции
	for i := 0; i < numOps; i++ {
		operation := readLine()

		if operation == "progress" {
			// TODO: Вызвать Progress() и вывести в формате "%.1f%%"
			fmt.Println("0.0%") // Заменить на фактический прогресс
		} else if strings.HasPrefix(operation, "complete ") {
			lessonID := strings.TrimPrefix(operation, "complete ")
			// TODO: Вызвать CompleteLesson и вывести результат
			_ = lessonID
			fmt.Println("") // Заменить на фактический результат
		}
	}
}

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

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

Платформа онлайн-обученияБанковская системаСистема игровых персонажей