Menu
Coddy logo textTech

Plateforme d’apprentissage en ligne

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 les cours et les étudiants, et qui suit la progression de l’apprentissage ! Tu combineras les structs, les interfaces, la composition et le polymorphisme pour créer un système cohérent dans lequel les étudiants peuvent s’inscrire à des cours et terminer des leçons.

Tu organiseras ton code sur cinq fichiers :

  • lesson.go : définis une struct Lesson représentant des unités d’apprentissage individuelles. Chaque leçon possède un ID, un Title et une Duration (en minutes). Inclus un constructeur NewLesson qui renvoie un pointeur vers une Lesson.
  • course.go : crée une struct Course qui contient un ID, un Title, un Instructor et une slice de pointeurs *Lesson. Inclus un constructeur NewCourse et une méthode AddLesson. Implémente également une méthode TotalDuration() int qui renvoie la somme des durées de toutes les leçons du cours.
  • student.go : définis une struct Student avec les champs ID, Name et Email. Inclus un constructeur NewStudent.
  • enrollment.go : c’est ici que la magie du suivi de la progression opère. Crée une struct Enrollment qui relie un étudiant à un cours et suit les leçons qu’il a terminées. Elle doit contenir :
    • Un pointeur vers le Student
    • Un pointeur vers le Course
    • Une map CompletedLessons (ID de leçon vers booléen)

    Définis une interface Progressable avec une méthode Progress() float64 qui renvoie un pourcentage (de 0.0 à 100.0).

    Implémente ces méthodes sur Enrollment :

    • NewEnrollment(student *Student, course *Course) *Enrollment : constructeur qui initialise une map vide des leçons terminées
    • CompleteLesson(lessonID string) string : marque une leçon comme terminée. Renvoie lesson not found si la leçon n’existe pas dans le cours, already completed si elle est déjà terminée, ou completed en cas de succès
    • Progress() float64 : renvoie le pourcentage de leçons terminées (terminées/total * 100), ou 0.0 si le cours ne contient aucune leçon
  • main.go : construis ta plateforme et traite les opérations d’inscription.

    Lis l’ID, le titre et l’instructeur d’un cours. Lis ensuite le nombre de leçons, puis l’ID, le titre et la durée de chaque leçon. Lis l’ID, le nom et l’adresse e-mail d’un étudiant. Crée une inscription reliant l’étudiant au cours.

    Lis ensuite le nombre d’opérations. Chaque opération est soit complete [lessonID], soit progress. Pour les opérations de complétion, affiche le message de résultat. Pour les opérations de progression, affiche la progression formatée avec une décimale, suivie 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 et la durée de chaque leçon (3 lignes chacune)
  • ID de l’étudiant, nom, adresse 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

Ta sortie doit ê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

Ta sortie doit être :

lesson not found
completed
completed
100.0%

Remarque comment la struct Enrollment utilise la composition pour relier les étudiants et les cours, tandis que l’interface Progressable permet à n’importe quel type de signaler son état d’avancement. Cette conception est facile à étendre. Tu pourrais ajouter le suivi de la progression à 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

Entraînez-vous par vous-même : Compilateur Go en ligne