Ô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.
Thử thách
Trung bìnhXâ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ủastudent_name.student_idchỉ có thể đọc và trả về ID.student_namecó setter: tên ngắn hơn2ký tự sẽ bị từ chối (tên cũ vẫn giữ nguyên) vàlast_errortrở thànhName must be at least 2 characters. Tên hợp lệ sẽ xóalast_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ơn0hoặc lớn hơn100sẽ không được lưu và hàm trả vềfalse.averagelà một thuộc tính được tính toán và chỉ có thể đọc: điểm trung bình dưới dạngfloat, hoặc0.0nế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ềfalsevà 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ặcnull.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ặcnullkhi 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
listchươ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.00Hã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
1Nền tảng về OOP
Tệp bên ngoàiGiới thiệu về OOPLớp và đối tượngTừ khóa selfPhương thứcThuộc tínhHàm khởi tạo (_init)Ôn tập: máy tính đơn giản4Tính đa hình
Xem lại cách ghi đè phương thứcĐịnh kiểu vịtLớp và phương thức trừu tượngThiết kế interfaceÔn tập: máy tính hình học7Tín hiệu
Tín hiệu là gì?Khai báo và phát tín hiệuKết nối với tín hiệuTín hiệu có đối sốÔn tập: hệ thống sức khỏe10Các mẫu thiết kế phần 2
Mẫu lệnhMẫu bộ chuyển đổiMẫu trang tríMẫu phương thức khuôn mẫuMẫu trạng tháiMẫu tổng hợp2Thuộc tính của lớp
Biến instance và biến staticHàm staticPhương thức thiết lập thuộc tínhPhương thức lấy thuộc tínhQuy ước về tính riêng tưÔn tập: trình quản lý tài khoản ngân hàng5Tính đóng gói
Thành viên công khai và riêng tưXác thực bằng phương thức setterẨn thông tinThuộc tính chỉ đọcÔn tập: hệ thống hồ sơ học sinh8Khái niệm OOP nâng cao
Kết hợp và kế thừaLớp bên trongNode dưới dạng thành phầnRefCounted và NodeEnum trong lớpTự luyện tập: Trình biên dịch GDScript online