Повторение — система учета студентов
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 30 из 65.
Задание
СреднеСоздай небольшую систему учёта студентов из двух классов.
Student в student.gd хранит свои данные приватно:
_init(id, new_name)сохраняет ID в приватной переменной и задаёт имя через сеттерstudent_name.student_idдоступно только для чтения и возвращает ID.- У
student_nameесть сеттер: имя короче2символов отклоняется (старое имя остаётся), а значениеlast_errorстановится равнымName must be at least 2 characters. Корректное имя очищаетlast_error. add_grade(course, grade)сохраняет оценку за курс в приватном Dictionary (новая оценка за тот же курс заменяет старую) и возвращаетtrue. Оценка ниже0или выше100не сохраняется, и метод возвращаетfalse.average— вычисляемое свойство только для чтения: среднее значение оценок в видеfloatили0.0, если оценок нет.course_count()возвращает количество курсов, по которым есть оценка.
StudentRegistry в student_registry.gd хранит студентов в приватном Dictionary, используя ID в качестве ключа:
add_student(student)возвращаетfalseи ничего не меняет, если этот ID уже занят; в противном случае сохраняет студента и возвращаетtrue.remove_student(id)возвращает значение, указывающее, был ли удалён студент.get_student(id)возвращает студента илиnull.top_student()возвращает студента с самым высоким средним баллом (при равенстве — того, кого добавили первым) илиnull, если реестр пуст.get_ids()возвращает ID в порядке добавления студентов.
Предоставленный код считывает количество команд, затем выполняет по одной команде в каждой строке: add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (пытается перезаписать student_id и average, которые не должны измениться), top и list. Для этого ввода:
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вывод будет таким:
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Твой код нужно разместить в student.gd и student_registry.gd. В main.gd находится предоставленный код ввода/вывода, его нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
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":
# Пытается перезаписать свойства, доступные только для чтения
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])
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript