Podsumowanie – system ewidencji uczniów
Część sekcji Programowanie obiektowe ścieżki GDScript w Coddy. Lekcja 30 z 65.
Wyzwanie
ŚredniZbuduj niewielki system ewidencji studentów złożony z dwóch klas.
Student w pliku student.gd przechowuje swoje dane prywatnie:
_init(id, new_name)zapisuje ID w prywatnej zmiennej i przypisuje imię za pomocą setterastudent_name.student_idjest tylko do odczytu i zwraca ID.student_namema setter: imię krótsze niż2znaki zostaje odrzucone (poprzednie imię pozostaje bez zmian), alast_errorprzyjmuje wartośćName must be at least 2 characters. Poprawne imię czyścilast_error.add_grade(course, grade)zapisuje ocenę z kursu w prywatnym słowniku (nowa ocena z tego samego kursu zastępuje poprzednią) i zwracatrue. Ocena poniżej0lub powyżej100nie zostaje zapisana, a metoda zwracafalse.averagejest tylko do odczytu i oblicza średnią ocen jako wartość typufloatalbo zwraca0.0, jeśli nie ma ocen.course_count()zwraca liczbę kursów, z których wystawiono ocenę.
StudentRegistry w pliku student_registry.gd przechowuje studentów w prywatnym słowniku, używając ID jako klucza:
add_student(student)zwracafalsei niczego nie zmienia, gdy dane ID jest już zajęte; w przeciwnym razie zapisuje studenta i zwracatrue.remove_student(id)zwraca informację, czy student został usunięty.get_student(id)zwraca studenta albonull.top_student()zwraca studenta z najwyższą średnią (w przypadku remisu tego, który został dodany jako pierwszy) albonull, gdy rejestr jest pusty.get_ids()zwraca ID w kolejności, w jakiej dodano studentów.
Dostarczony kod odczytuje liczbę poleceń, a następnie wykonuje po jednym poleceniu w każdym wierszu: add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (próbuje nadpisać student_id i average, które nie mogą się zmienić), top i list. Dla tego wejścia:
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
listwypisuje:
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.00Umieść swój kod w plikach student.gd i student_registry.gd. Plik main.gd zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
extends Node
func _ready():
# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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":
# Próbuje nadpisać właściwości tylko do odczytu
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])
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe selfMetodyWłaściwościKonstruktor (_init)Powtórka – prosty kalkulator4Polimorfizm
Ponowne omówienie przesłaniania metodDuck typingKlasy i metody abstrakcyjneProjektowanie interfejsówPowtórzenie – kalkulator kształtów7Sygnały
Czym jest sygnał?Deklarowanie i emitowanieŁączenie z sygnałamiSygnały z argumentamiPodsumowanie — system zdrowia10Wzorce projektowe, część 2
Wzorzec poleceniaWzorzec adapteraWzorzec dekoratoraWzorzec metody szablonowejWzorzec stanuWzorzec kompozytu2Właściwości klas
Zmienne instancji a zmienne statyczneFunkcje statyczneSettery właściwościGettery właściwościPrywatne z konwencjiPodsumowanie — menedżer kont bankowych5Enkapsulacja
Elementy publiczne i prywatneWalidacja za pomocą setterówUkrywanie informacjiWłaściwości tylko do odczytuPodsumowanie – system ewidencji uczniów8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieKlasy wewnętrzneWęzły jako komponentyRefCounted a NodeTypy wyliczeniowe w klasach11Projekt: Zarządzanie biblioteką
Przegląd projektuKlasy książki i użytkownika3Dziedziczenie
Podstawy dziedziczeniaSłowo kluczowe superNadpisywanie metodŁańcuchy dziedziczeniaSprawdzanie typów za pomocą isPodsumowanie – hierarchia pracowników6Metody specjalne
Wprowadzenie do metod wirtualnychMetoda _to_stringWłasne iteratoryPodsumowanie — własna lista9Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec ObserverWzorzec StrategyPoćwicz samodzielnie: Kompilator GDScript online