Menu
CoddyTech

Ringkasan: Sistem Catatan Siswa

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 30 dari 65.

challenge icon

Tantangan

Sedang

Buat sistem kecil untuk mencatat data siswa menggunakan dua class.

Student di student.gd menyimpan datanya secara privat:

  • _init(id, new_name) menyimpan ID dalam variabel privat dan menetapkan nama melalui setter student_name.
  • student_id hanya bisa dibaca dan mengembalikan ID.
  • student_name memiliki setter: nama yang lebih pendek dari 2 karakter akan ditolak (nama lama tetap) dan last_error menjadi Name must be at least 2 characters. Nama yang valid akan mengosongkan last_error.
  • add_grade(course, grade) menyimpan nilai untuk course dalam Dictionary privat (nilai baru untuk course yang sama akan menggantikan nilai lama) dan mengembalikan true. Nilai di bawah 0 atau di atas 100 tidak disimpan dan mengembalikan false.
  • average adalah property hasil perhitungan yang hanya bisa dibaca: rata-rata nilai dalam bentuk float, atau 0.0 jika tidak ada nilai.
  • course_count() mengembalikan jumlah course yang memiliki nilai.

StudentRegistry di student_registry.gd menyimpan siswa dalam Dictionary privat, dengan ID sebagai key:

  • add_student(student) mengembalikan false dan tidak mengubah apa pun jika ID sudah digunakan. Jika tidak, fungsi ini menyimpan siswa dan mengembalikan true.
  • remove_student(id) mengembalikan apakah seorang siswa berhasil dihapus.
  • get_student(id) mengembalikan siswa, atau null.
  • top_student() mengembalikan siswa dengan rata-rata tertinggi (siswa yang ditambahkan lebih dahulu jika nilainya sama), atau null jika registry kosong.
  • get_ids() mengembalikan ID sesuai urutan siswa ditambahkan.

Kode yang disediakan membaca jumlah perintah, lalu menjalankan satu perintah untuk setiap baris: add ID NAME, grade ID COURSE GRADE, rename ID NAME, remove ID, show ID, tamper ID (mencoba menimpa student_id dan average, yang nilainya tidak boleh berubah), top dan list. Untuk input ini:

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

hasilnya:

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

Letakkan kodemu di student.gd dan student_registry.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya
	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":
			# Mencoba menimpa property yang hanya bisa dibaca
			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])

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online