Menu
CoddyTech

Revisão - Sistema de registros de alunos

Parte da seção Programação orientada a objetos do Journey de GDScript da Coddy. Lição 30 de 65.

challenge icon

Desafio

Médio

Crie um pequeno sistema de registros de alunos usando duas classes.

Student em student.gd mantém seus dados privados:

  • _init(id, new_name) armazena o ID em uma variável privada e atribui o nome por meio do setter student_name.
  • student_id é somente leitura e retorna o ID.
  • student_name tem um setter: um nome com menos de 2 caracteres é rejeitado (o nome antigo permanece) e last_error passa a ser Name must be at least 2 characters. Um nome válido limpa last_error.
  • add_grade(course, grade) armazena a nota da matéria em um Dictionary privado (uma nova nota para a mesma matéria substitui a antiga) e retorna true. Uma nota abaixo de 0 ou acima de 100 não é armazenada e retorna false.
  • average é uma propriedade computada somente leitura: a média das notas como float, ou 0.0 quando não há notas.
  • course_count() retorna o número de matérias com nota.

StudentRegistry em student_registry.gd mantém os alunos em um Dictionary privado, usando o ID como chave:

  • add_student(student) retorna false e não altera nada quando o ID já está em uso; caso contrário, armazena o aluno e retorna true.
  • remove_student(id) retorna se um aluno foi removido.
  • get_student(id) retorna o aluno ou null.
  • top_student() retorna o aluno com a maior média (em caso de empate, aquele que foi adicionado primeiro) ou null quando o registro está vazio.
  • get_ids() retorna os IDs na ordem em que os alunos foram adicionados.

O código fornecido lê o número de comandos e, em seguida, executa um comando por linha: add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (tenta sobrescrever student_id e average, que não devem mudar), top e list. Para esta entrada:

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

ele imprime:

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

Seu código deve ficar em student.gd e student_registry.gd. main.gd contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

extends Node

func _ready():
	# Código de entrada/saída fornecido: mantenha-o como está
	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":
			# Tenta sobrescrever as propriedades somente de leitura
			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])

Todas as lições de Programação orientada a objetos

Pratique por conta própria: Compilador de GDScript online