Menu
Coddy logo textTech

Plataforma de E-Learning

Parte da seção Programação Orientada a Objetos do Journey de GO da Coddy. Lição 105 de 107.

challenge icon

Desafio

Fácil

Vamos criar uma Plataforma de E-Learning que gerencia cursos, estudantes e acompanha o progresso de aprendizagem! Você combinará structs, interfaces, composição e polimorfismo para criar um sistema coeso no qual os estudantes podem se matricular em cursos e concluir lições.

Você organizará seu código em cinco arquivos:

  • lesson.go: Defina uma struct Lesson que represente unidades individuais de aprendizagem. Cada lição tem um ID, Title e Duration (em minutos). Inclua um construtor NewLesson que retorne um ponteiro para uma Lesson.
  • course.go: Crie uma struct Course que contenha um ID, Title, Instructor e um slice de ponteiros *Lesson. Inclua um construtor NewCourse e um método AddLesson. Implemente também um método TotalDuration() int que retorne a soma das durações de todas as lições do curso.
  • student.go: Defina uma struct Student com os campos ID, Name e Email. Inclua um construtor NewStudent.
  • enrollment.go: É aqui que acontece a mágica do acompanhamento do progresso. Crie uma struct Enrollment que vincule um estudante a um curso e acompanhe quais lições eles concluíram. Ela deve ter:
    • Um ponteiro para o Student
    • Um ponteiro para o Course
    • Um mapa CompletedLessons (ID da lição para booleano)

    Defina uma interface Progressable com um método Progress() float64 que retorne uma porcentagem (de 0.0 a 100.0).

    Implemente estes métodos em Enrollment:

    • NewEnrollment(student *Student, course *Course) *Enrollment: construtor que inicializa um mapa vazio de lições concluídas
    • CompleteLesson(lessonID string) string: marca uma lição como concluída. Retorna lesson not found se a lição não existir no curso, already completed se já tiver sido concluída ou completed em caso de sucesso
    • Progress() float64: retorna a porcentagem de lições concluídas (concluídas/total * 100) ou 0.0 se o curso não tiver lições
  • main.go: Construa sua plataforma e processe as operações de matrícula.

    Leia o ID, o título e o instrutor de um curso. Em seguida, leia o número de lições e o ID, o título e a duração de cada lição. Leia o ID, o nome e o e-mail de um estudante. Crie uma matrícula vinculando o estudante ao curso.

    Depois, leia o número de operações. Cada operação é complete [lessonID] ou progress. Para operações de conclusão, imprima a mensagem do resultado. Para operações de progresso, imprima o progresso formatado com uma casa decimal, seguido por um símbolo de porcentagem.

As seguintes entradas serão fornecidas:

  • ID, título e instrutor do curso (3 linhas)
  • Número de lições e, em seguida, o ID, o título e a duração de cada lição (3 linhas cada)
  • ID, nome e e-mail do estudante (3 linhas)
  • Número de operações e, em seguida, cada operação (1 linha cada)

Por exemplo, considerando:

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

Sua saída deve ser:

0.0%
completed
33.3%
already completed
completed

E considerando:

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

Sua saída deve ser:

lesson not found
completed
completed
100.0%

Observe como a struct Enrollment usa composição para vincular estudantes e cursos, enquanto a interface Progressable permite que qualquer tipo informe seu status de conclusão. Esse design facilita a extensão. Você poderia adicionar o acompanhamento do progresso a lições individuais ou a trilhas de aprendizagem inteiras usando a mesma interface!

Experimente você mesmo

package main

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

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

	// Função auxiliar para ler uma linha
	readLine := func() string {
		scanner.Scan()
		return strings.TrimSpace(scanner.Text())
	}

	// Ler informações do curso
	courseID := readLine()
	courseTitle := readLine()
	courseInstructor := readLine()

	// TODO: Criar o curso usando NewCourse
	_ = courseID
	_ = courseTitle
	_ = courseInstructor

	// Ler o número de lições
	numLessons, _ := strconv.Atoi(readLine())

	// TODO: Ler cada lição e adicionar ao curso
	for i := 0; i < numLessons; i++ {
		lessonID := readLine()
		lessonTitle := readLine()
		lessonDuration, _ := strconv.Atoi(readLine())

		// TODO: Criar a lição e adicionar ao curso
		_ = lessonID
		_ = lessonTitle
		_ = lessonDuration
	}

	// Ler informações do aluno
	studentID := readLine()
	studentName := readLine()
	studentEmail := readLine()

	// TODO: Criar o aluno usando NewStudent
	_ = studentID
	_ = studentName
	_ = studentEmail

	// TODO: Criar a matrícula vinculando o aluno ao curso

	// Ler o número de operações
	numOps, _ := strconv.Atoi(readLine())

	// Processar cada operação
	for i := 0; i < numOps; i++ {
		operation := readLine()

		if operation == "progress" {
			// TODO: Chamar Progress() e imprimir com o formato "%.1f%%"
			fmt.Println("0.0%") // Substitua pelo progresso real
		} else if strings.HasPrefix(operation, "complete ") {
			lessonID := strings.TrimPrefix(operation, "complete ")
			// TODO: Chame CompleteLesson e imprima o resultado
			_ = lessonID
			fmt.Println("") // Substitua pelo resultado real
		}
	}
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Go online