Menu
CoddyTech

온라인 학습 플랫폼

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

challenge icon

챌린지

어려움

이러닝 플랫폼의 클래스인 강좌, 학생, 강사를 만들어 보세요. 학생과 강사는 모두 사람이므로 부모 클래스를 공유합니다.

객체들은 서로를 참조하면 안 됩니다. 강좌에는 학생의 이메일과 강사의 이름이 저장되고, 학생과 강사에는 강좌의 제목이 저장됩니다. 강좌가 필요한 메서드는 강좌를 인수로 받습니다.

person.gd의 Person: 생성자는 person_name과 email을 받아 저장합니다. _to_string()은 NAME (EMAIL)을 반환합니다.

course.gd의 Course:

  • 속성: title, max_capacity, instructor_name (초깃값은 ""), 그리고 Array[String] 타입의 student_emails와 completed_emails.
  • 생성자는 제목과 정원을 받으며, 정원의 기본값은 30입니다.
  • add_student()가 마지막 빈자리를 채울 때 발생하는 신호 course_full(title: String).
  • add_student(email) -> bool: 강좌가 만석이거나 해당 이메일의 학생이 이미 등록되어 있으면 false를 반환합니다. 그렇지 않으면 이메일을 추가하고 true를 반환합니다.
  • remove_student(email) -> bool: 현재 수강 중인 학생을 삭제합니다. 해당 이메일이 학생의 이메일이 아니면 false를 반환합니다.
  • mark_completed(email) -> bool: 현재 수강 중인 학생을 completed_emails로 옮깁니다. 해당 이메일이 현재 수강 중인 학생의 이메일이 아니면 false를 반환합니다.
  • assign_instructor(instructor) -> bool: 강사의 이름을 저장하거나, 강좌에 이미 강사가 있으면 false를 반환합니다.
  • _to_string()은 TITLE: N/CAPACITY students, M completed, instructor: NAME을 반환하며, 강사가 없으면 none을 사용합니다.

student.gd의 Student는 Person을 상속하고 생성자는 그대로 유지합니다. 제목을 저장하는 Array[String] 두 개, enrolled와 completed를 가집니다.

  • enroll(course: Course) -> bool: 강좌가 이미 enrolled 또는 completed에 있거나 course.add_student()가 거부하면 false를 반환합니다. 그렇지 않으면 제목을 추가하고 true를 반환합니다.
  • unenroll(course: Course) -> bool: 수강 등록된 강좌에만 적용됩니다. 강좌에서 학생을 삭제하고 enrolled에서 제목을 삭제합니다.
  • complete_course(course: Course) -> bool: 수강 등록된 강좌에만 적용됩니다. course.mark_completed()를 호출하고 제목을 enrolled에서 completed로 옮깁니다.
  • _to_string()은 Student , Person의 텍스트, 그리고 : N enrolled, M completed를 반환합니다.

instructor.gd의 Instructor는 Person을 상속합니다. 생성자는 person_name, email, expertise를 받으며, Array[String] 타입의 course_titles를 가집니다.

  • assign_to_course(course: Course) -> bool: 자신의 이름을 사용해 course.assign_instructor()를 호출합니다. 성공하면 제목을 추가하고 true를 반환합니다.
  • _to_string()은 Instructor , Person의 텍스트, , EXPERTISE: 와 , 로 결합한 제목을 반환하며, 제목이 없으면 no courses를 반환합니다.

제공된 코드는 필드가 |로 구분된 명령을 읽고, course_full에 연결하여 Course full: TITLE을 출력합니다. 다음 입력의 경우:

course Python 101|2
course Data Science
student Ana|ana@mail.com
student Ben|ben@mail.com
instructor Grace Hopper|grace@mail.com|Compilers
enroll ana@mail.com|Python 101
enroll ben@mail.com|Python 101
enroll ben@mail.com|Data Science
assign grace@mail.com|Python 101
report

출력은 다음과 같습니다.

Enroll Ana in Python 101: true
Course full: Python 101
Enroll Ben in Python 101: true
Enroll Ben in Data Science: true
Assign Grace Hopper to Python 101: true
Python 101: 2/2 students, 0 completed, instructor: Grace Hopper
Data Science: 1/30 students, 0 completed, instructor: none
Student Ana (ana@mail.com): 1 enrolled, 0 completed
Student Ben (ben@mail.com): 2 enrolled, 0 completed
Instructor Grace Hopper (grace@mail.com), Compilers: Python 101

코드는 person.gd, course.gd, student.gd, instructor.gd에 작성합니다. main.gd에는 제공된 입력/출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

extends Node

func _ready():
	# 제공된 입력/출력 코드: 그대로 유지하세요

	var courses := {}
	var people := {}

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"course":
				var course: Course
				if f.size() > 1:
					course = Course.new(f[0], int(f[1]))
				else:
					course = Course.new(f[0])
				course.course_full.connect(func(title): print("Course full: ", title))
				courses[f[0]] = course
			"student":
				people[f[1]] = Student.new(f[0], f[1])
			"instructor":
				people[f[1]] = Instructor.new(f[0], f[1], f[2])
			"enroll":
				var ok: bool = people[f[0]].enroll(courses[f[1]])
				print("Enroll ", people[f[0]].person_name, " in ", f[1], ": ", ok)
			"unenroll":
				var ok: bool = people[f[0]].unenroll(courses[f[1]])
				print("Unenroll ", people[f[0]].person_name, " from ", f[1], ": ", ok)
			"complete":
				var ok: bool = people[f[0]].complete_course(courses[f[1]])
				print(people[f[0]].person_name, " completes ", f[1], ": ", ok)
			"assign":
				var ok: bool = people[f[0]].assign_to_course(courses[f[1]])
				print("Assign ", people[f[0]].person_name, " to ", f[1], ": ", ok)
			"report":
				for title in courses:
					print(courses[title])
				for email in people:
					print(people[email])

		line = OS.read_string_from_stdin()

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 GDScript 컴파일러