Menu
Coddy logo textTech

Plateforme d'E-Learning

Fait partie de la section Programmation Orientée Objet du Journey GO de Coddy — leçon 105 sur 107.

challenge icon

Défi

Facile

Construisons une plateforme d'apprentissage en ligne qui gère des cours, des étudiants et suit les progrès d'apprentissage ! Vous combinerez des structures (structs), des interfaces, la composition et le polymorphisme pour créer un système cohérent où les étudiants peuvent s'inscrire à des cours et terminer des leçons.

Vous organiserez votre code sur cinq fichiers :

  • lesson.go : Définissez une structure Lesson représentant des unités d'apprentissage individuelles. Chaque leçon possède un ID, un Title et une Duration (en minutes). Incluez un constructeur NewLesson qui retourne un pointeur vers une Lesson.
  • course.go : Créez une structure Course qui contient un ID, un Title, un Instructor et une tranche (slice) de pointeurs *Lesson. Incluez un constructeur NewCourse et une méthode AddLesson. Implémentez également une méthode TotalDuration() int qui retourne la somme des durées de toutes les leçons du cours.
  • student.go : Définissez une structure Student avec les champs ID, Name et Email. Incluez un constructeur NewStudent.
  • enrollment.go : C'est ici que la magie du suivi des progrès s'opère. Créez une structure Enrollment qui lie un étudiant à un cours et suit les leçons qu'il a terminées. Elle doit avoir :
    • Un pointeur vers le Student
    • Un pointeur vers le Course
    • Une map CompletedLessons (ID de la leçon vers booléen)

    Définissez une interface Progressable avec une méthode Progress() float64 qui retourne un pourcentage (0.0 à 100.0).

    Implémentez ces méthodes sur Enrollment :

    • NewEnrollment(student *Student, course *Course) *Enrollment — constructeur qui initialise une map de leçons terminées vide
    • CompleteLesson(lessonID string) string — marque une leçon comme terminée. Retourne "lesson not found" si la leçon n'existe pas dans le cours, "already completed" si elle est déjà faite, ou "completed" en cas de succès
    • Progress() float64 — retourne le pourcentage de leçons terminées (terminées/total * 100), ou 0.0 si le cours n'a pas de leçons
  • main.go : Construisez votre plateforme et traitez les opérations d'inscription.

    Lisez l'ID, le titre et l'instructeur d'un cours. Lisez ensuite le nombre de leçons et l'ID, le titre et la durée de chaque leçon. Lisez l'ID, le nom et l'e-mail d'un étudiant. Créez une inscription (enrollment) liant l'étudiant au cours.

    Ensuite, lisez le nombre d'opérations. Chaque opération est soit "complete [lessonID]" soit "progress". Pour les opérations complete, affichez le message de résultat. Pour les opérations progress, affichez le progrès formaté avec une décimale suivi d'un signe de pourcentage.

Les entrées suivantes seront fournies :

  • ID du cours, Titre, Instructeur (3 lignes)
  • Nombre de leçons, puis l'ID, le Titre, la Durée de chaque leçon (3 lignes chacune)
  • ID de l'étudiant, Nom, E-mail (3 lignes)
  • Nombre d'opérations, puis chaque opération (1 ligne chacune)

Par exemple, étant donné :

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

Votre sortie devrait être :

0.0%
completed
33.3%
already completed
completed

Et étant donné :

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

Votre sortie devrait être :

lesson not found
completed
completed
100.0%

Remarquez comment la structure Enrollment utilise la composition pour lier les étudiants et les cours ensemble, tandis que l'interface Progressable permet à n'importe quel type de rapporter son état d'avancement. Cette conception facilite l'extension — vous pourriez ajouter le suivi des progrès à des leçons individuelles ou à des parcours d'apprentissage entiers en utilisant la même interface !

Essayez vous-même

package main

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

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

	// Fonction auxiliaire pour lire une ligne
	readLine := func() string {
		scanner.Scan()
		return strings.TrimSpace(scanner.Text())
	}

	// Lire les informations du cours
	courseID := readLine()
	courseTitle := readLine()
	courseInstructor := readLine()

	// TODO: Créer le cours en utilisant NewCourse
	_ = courseID
	_ = courseTitle
	_ = courseInstructor

	// Lire le nombre de leçons
	numLessons, _ := strconv.Atoi(readLine())

	// TODO: Lire chaque leçon et l'ajouter au cours
	for i := 0; i < numLessons; i++ {
		lessonID := readLine()
		lessonTitle := readLine()
		lessonDuration, _ := strconv.Atoi(readLine())

		// TODO: Créer la leçon et l'ajouter au cours
		_ = lessonID
		_ = lessonTitle
		_ = lessonDuration
	}

	// Lire les informations de l'étudiant
	studentID := readLine()
	studentName := readLine()
	studentEmail := readLine()

	// TODO: Créer l'étudiant en utilisant NewStudent
	_ = studentID
	_ = studentName
	_ = studentEmail

	// TODO: Créer l'inscription liant l'étudiant au cours

	// Lire le nombre d'opérations
	numOps, _ := strconv.Atoi(readLine())

	// Traiter chaque opération
	for i := 0; i < numOps; i++ {
		operation := readLine()

		if operation == "progress" {
			// TODO: Appeler Progress() et afficher avec le format "%.1f%%"
			fmt.Println("0.0%") // Remplacer par la progression réelle
		} else if strings.HasPrefix(operation, "complete ") {
			lessonID := strings.TrimPrefix(operation, "complete ")
			// TODO: Appeler CompleteLesson et afficher le résultat
			_ = lessonID
			fmt.Println("") // Remplacer par le résultat réel
		}
	}
}

Toutes les leçons de Programmation Orientée Objet