복습 - 학생 기록 시스템
Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 30번째.
챌린지
중급두 클래스로 간단한 학생 기록 시스템을 만드세요.
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에서 학생들을 ID를 키로 사용하는 비공개 Dictionary에 보관합니다.
add_student(student)는 해당 ID가 이미 사용 중이면false를 반환하고 아무것도 변경하지 않습니다. 그렇지 않으면 학생을 저장하고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])
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 GDScript 컴파일러