Menu
CoddyTech

복습 - 학생 기록 시스템

Coddy GDScript 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 65개 중 30번째.

challenge icon

챌린지

중급

두 클래스로 간단한 학생 기록 시스템을 만드세요.

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 컴파일러