Menu
CoddyTech

Récapitulatif - Système de dossiers étudiants

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

challenge icon

Défi

Moyen

Créez un petit système de dossiers étudiants à partir de deux classes.

Student dans student.gd garde ses données privées :

  • _init(id, new_name) stocke l’ID dans une variable privée et définit le nom à l’aide du setter de student_name.
  • student_id est en lecture seule et renvoie l’ID.
  • student_name possède un setter : un nom de moins de 2 caractères est rejeté (l’ancien nom est conservé) et last_error prend la valeur Name must be at least 2 characters. Un nom valide efface last_error.
  • add_grade(course, grade) stocke la note du cours dans un dictionnaire privé (une nouvelle note pour le même cours remplace l’ancienne) et renvoie true. Une note inférieure à 0 ou supérieure à 100 n’est pas stockée et la méthode renvoie false.
  • average est une propriété calculée en lecture seule : la moyenne des notes sous forme de float, ou 0.0 en l’absence de notes.
  • course_count() renvoie le nombre de cours ayant une note.

StudentRegistry dans student_registry.gd conserve les étudiants dans un dictionnaire privé, avec l’ID comme clé :

  • add_student(student) renvoie false et ne change rien lorsque l’ID est déjà pris ; sinon, la méthode stocke l’étudiant et renvoie true.
  • remove_student(id) indique si un étudiant a été supprimé.
  • get_student(id) renvoie l’étudiant, ou null.
  • top_student() renvoie l’étudiant ayant la moyenne la plus élevée (celui qui a été ajouté en premier en cas d’égalité), ou null lorsque le registre est vide.
  • get_ids() renvoie les ID dans l’ordre d’ajout des étudiants.

Le code fourni lit le nombre de commandes, puis exécute une commande par ligne : add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (essaie de modifier student_id et average, qui ne doivent pas changer), top et list. Pour cette entrée :

10
add 1001 Alice Smith
add 1002 Bob
grade 1001 Math 90
grade 1001 Art 85
grade 1002 Math 95
grade 1002 Art 120
rename 1002 B
show 1002
top
list

il affiche :

Added Alice Smith (1001)
Added Bob (1002)
Alice Smith: Math = 90
Alice Smith: Art = 85
Bob: Math = 95
Invalid grade: 120
Rejected: Name must be at least 2 characters
ID: 1002, Name: Bob, Courses: 1, Average: 95.00
Top: Bob (95.00)
ID: 1001, Name: Alice Smith, Courses: 2, Average: 87.50
ID: 1002, Name: Bob, Courses: 1, Average: 95.00

Votre code doit se trouver dans student.gd et student_registry.gd. main.gd contient le code d’entrée/sortie fourni 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 registry := StudentRegistry.new()
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ", true, 2)
		var command := parts[0]
		if command == "top":
			var best := registry.top_student()
			if best == null:
				print("Top: none")
			else:
				print("Top: %s (%.2f)" % [best.student_name, best.average])
			continue
		if command == "list":
			for listed_id in registry.get_ids():
				print_student(registry.get_student(listed_id))
			continue
		var id := int(parts[1])
		if command == "add":
			var student := Student.new(id, parts[2])
			if student.last_error != "":
				print("Rejected: " + student.last_error)
			elif registry.add_student(student):
				print("Added %s (%d)" % [student.student_name, id])
			else:
				print("Duplicate ID: %d" % id)
			continue
		if command == "remove":
			print(("Removed %d" if registry.remove_student(id) else "No student %d") % id)
			continue
		var student := registry.get_student(id)
		if student == null:
			print("No student %d" % id)
		elif command == "grade":
			var grade_parts := parts[2].split(" ")
			if student.add_grade(grade_parts[0], int(grade_parts[1])):
				print("%s: %s = %s" % [student.student_name, grade_parts[0], grade_parts[1]])
			else:
				print("Invalid grade: " + grade_parts[1])
		elif command == "rename":
			student.student_name = parts[2]
			if student.last_error != "":
				print("Rejected: " + student.last_error)
			else:
				print("Renamed to " + student.student_name)
		elif command == "tamper":
			# Tente d'écraser les propriétés en lecture seule
			student.student_id = 0
			student.average = 100.0
			print_student(student)
		else:
			print_student(student)

func print_student(student: Student) -> void:
	print("ID: %d, Name: %s, Courses: %d, Average: %.2f" % [student.student_id, student.student_name, student.course_count(), student.average])

Toutes les leçons de Programmation orientée objet

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