Menu
CoddyTech

Ôn tập: hệ thống hồ sơ học sinh

Thuộc phần Lập trình hướng đối tượng trong hành trình GDScript của Coddy. Bài học 30 trên 65.

challenge icon

Thử thách

Trung bình

Xây dựng một hệ thống quản lý hồ sơ học sinh nhỏ từ hai lớp.

Student trong student.gd giữ dữ liệu ở chế độ riêng tư:

  • _init(id, new_name) lưu ID vào một biến riêng tư và gán tên thông qua setter của student_name.
  • student_id chỉ có thể đọc và trả về ID.
  • student_name có setter: tên ngắn hơn 2 ký tự sẽ bị từ chối (tên cũ vẫn giữ nguyên) và last_error trở thành Name must be at least 2 characters. Tên hợp lệ sẽ xóa last_error.
  • add_grade(course, grade) lưu điểm của khóa học vào một từ điển riêng tư (điểm mới cho cùng khóa học sẽ thay thế điểm cũ) và trả về true. Điểm nhỏ hơn 0 hoặc lớn hơn 100 sẽ không được lưu và hàm trả về false.
  • average là một thuộc tính được tính toán và chỉ có thể đọc: điểm trung bình dưới dạng float, hoặc 0.0 nếu chưa có điểm.
  • course_count() trả về số khóa học có điểm.

StudentRegistry trong student_registry.gd lưu học sinh trong một từ điển riêng tư, dùng ID làm khóa:

  • add_student(student) trả về false và không thay đổi gì nếu ID đã được dùng; nếu không, hàm lưu học sinh và trả về true.
  • remove_student(id) trả về giá trị cho biết học sinh có bị xóa hay không.
  • get_student(id) trả về học sinh hoặc null.
  • top_student() trả về học sinh có điểm trung bình cao nhất (nếu hòa, chọn học sinh được thêm trước), hoặc null khi danh sách đăng ký trống.
  • get_ids() trả về các ID theo thứ tự học sinh được thêm vào.

Code được cung cấp đọc số lượng lệnh, sau đó chạy từng lệnh trên mỗi dòng: add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (thử ghi đè student_id và average, các thuộc tính này không được thay đổi), top và list. Với đầu vào sau:

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

chương trình in ra:

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

Hãy viết code trong student.gd và student_registry.gd. main.gd chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

extends Node

func _ready():
	# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
	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":
			# Thử ghi đè các thuộc tính chỉ đọc
			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])

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch GDScript online