Menu
CoddyTech

Plateforme d’apprentissage en ligne

Fait partie de la section Programmation orientée objet du Journey GDScript de Coddy. Leçon 62 sur 65.

challenge icon

Défi

Difficile

Construisez les classes d’une plateforme d’apprentissage en ligne : cours, étudiants et enseignants. Les étudiants et les enseignants sont tous des personnes ; ils partagent donc une classe parent.

Les objets ne doivent pas se référencer les uns les autres : un cours stocke les adresses e-mail de ses étudiants et le nom de son enseignant, tandis que les étudiants et les enseignants stockent les titres des cours. Une méthode qui a besoin d’un cours le reçoit en argument.

Person dans person.gd : le constructeur prend person_name et email et les stocke. _to_string() renvoie NAME (EMAIL).

Course dans course.gd :

  • Propriétés : title, max_capacity, instructor_name (initialisé à ""), ainsi que les Array[String] student_emails et completed_emails.
  • Le constructeur prend le titre et la capacité, qui vaut par défaut 30.
  • Un signal course_full(title: String), émis par add_student() lorsqu’il prend la dernière place disponible.
  • add_student(email) -> bool : renvoie false lorsque le cours est complet ou que l’adresse e-mail correspond déjà à un étudiant ; sinon, ajoute l’adresse e-mail et renvoie true.
  • remove_student(email) -> bool : supprime un étudiant actuellement inscrit ; renvoie false si l’adresse e-mail ne correspond pas à l’un d’eux.
  • mark_completed(email) -> bool : déplace un étudiant actuellement inscrit vers completed_emails ; renvoie false si l’adresse e-mail ne correspond pas à un étudiant actuellement inscrit.
  • assign_instructor(instructor) -> bool : stocke le nom de l’enseignant ou renvoie false si le cours en a déjà un.
  • _to_string() renvoie TITLE: N/CAPACITY students, M completed, instructor: NAME, avec none lorsqu’il n’y a pas d’enseignant.

Student dans student.gd étend Person et conserve son constructeur. Il possède deux Array[String] de titres, enrolled et completed :

  • enroll(course: Course) -> bool : renvoie false lorsque le cours figure déjà dans enrolled ou completed, ou lorsque course.add_student() refuse ; sinon, ajoute le titre et renvoie true.
  • unenroll(course: Course) -> bool : uniquement pour un cours auquel l’étudiant est inscrit ; supprime l’étudiant du cours et le titre de enrolled.
  • complete_course(course: Course) -> bool : uniquement pour un cours auquel l’étudiant est inscrit ; appelle course.mark_completed() et déplace le titre de enrolled vers completed.
  • _to_string() renvoie Student , le texte de Person, puis : N enrolled, M completed.

Instructor dans instructor.gd étend Person. Son constructeur prend person_name, email et expertise, et il conserve un Array[String] course_titles :

  • assign_to_course(course: Course) -> bool : appelle course.assign_instructor() avec son nom ; en cas de réussite, ajoute le titre et renvoie true.
  • _to_string() renvoie Instructor , le texte de Person, , EXPERTISE: et les titres joints avec , , ou no courses.

Le code fourni lit des commandes dont les champs sont séparés par | et se connecte à course_full pour afficher Course full: TITLE. Pour cette entrée :

course Python 101|2
course Data Science
student Ana|ana@mail.com
student Ben|ben@mail.com
instructor Grace Hopper|grace@mail.com|Compilers
enroll ana@mail.com|Python 101
enroll ben@mail.com|Python 101
enroll ben@mail.com|Data Science
assign grace@mail.com|Python 101
report

la sortie est :

Enroll Ana in Python 101: true
Course full: Python 101
Enroll Ben in Python 101: true
Enroll Ben in Data Science: true
Assign Grace Hopper to Python 101: true
Python 101: 2/2 students, 0 completed, instructor: Grace Hopper
Data Science: 1/30 students, 0 completed, instructor: none
Student Ana (ana@mail.com): 1 enrolled, 0 completed
Student Ben (ben@mail.com): 2 enrolled, 0 completed
Instructor Grace Hopper (grace@mail.com), Compilers: Python 101

Votre code va dans person.gd, course.gd, student.gd et instructor.gd. main.gd contient le code fourni pour les entrées/sorties et ne peut pas être modifié.

Essayez vous-même

extends Node

func _ready():
	# Code d'entrée/sortie fourni : conservez-le tel quel

	var courses := {}
	var people := {}

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"course":
				var course: Course
				if f.size() > 1:
					course = Course.new(f[0], int(f[1]))
				else:
					course = Course.new(f[0])
				course.course_full.connect(func(title): print("Course full: ", title))
				courses[f[0]] = course
			"student":
				people[f[1]] = Student.new(f[0], f[1])
			"instructor":
				people[f[1]] = Instructor.new(f[0], f[1], f[2])
			"enroll":
				var ok: bool = people[f[0]].enroll(courses[f[1]])
				print("Enroll ", people[f[0]].person_name, " in ", f[1], ": ", ok)
			"unenroll":
				var ok: bool = people[f[0]].unenroll(courses[f[1]])
				print("Unenroll ", people[f[0]].person_name, " from ", f[1], ": ", ok)
			"complete":
				var ok: bool = people[f[0]].complete_course(courses[f[1]])
				print(people[f[0]].person_name, " completes ", f[1], ": ", ok)
			"assign":
				var ok: bool = people[f[0]].assign_to_course(courses[f[1]])
				print("Assign ", people[f[0]].person_name, " to ", f[1], ": ", ok)
			"report":
				for title in courses:
					print(courses[title])
				for email in people:
					print(people[email])

		line = OS.read_string_from_stdin()

Toutes les leçons de Programmation orientée objet

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