Menu
CoddyTech

סיכום – מערכת לניהול רשומות תלמידים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-GDScript של Coddy. שיעור 30 מתוך 65.

challenge icon

אתגר

בינוני

בנו מערכת קטנה לניהול רשומות תלמידים באמצעות שתי מחלקות.

Student בקובץ student.gd שומרת את הנתונים שלה באופן פרטי:

  • _init(id, new_name) שומרת את המזהה במשתנה פרטי ומקצה את השם דרך ה-setter של student_name.
  • student_id היא לקריאה בלבד ומחזירה את המזהה.
  • ל-student_name יש setter: שם קצר מ-2 תווים נדחה (השם הקודם נשאר), והערך של last_error הופך ל-Name must be at least 2 characters. שם תקין מנקה את last_error.
  • add_grade(course, grade) שומרת את הציון עבור הקורס במילון פרטי (ציון חדש עבור אותו קורס מחליף את הציון הקודם) ומחזירה true. ציון נמוך מ-0 או גבוה מ-100 אינו נשמר והפעולה מחזירה false.
  • average היא מאפיין מחושב לקריאה בלבד: ממוצע הציונים כ-float, או 0.0 כשאין ציונים.
  • course_count() מחזירה את מספר הקורסים שיש להם ציון.

StudentRegistry בקובץ student_registry.gd שומרת את התלמידים במילון פרטי, כשהמזהה משמש כמפתח:

  • add_student(student) מחזירה false ואינה משנה דבר כשהמזהה כבר תפוס; אחרת היא שומרת את התלמיד ומחזירה true.
  • remove_student(id) מחזירה האם תלמיד הוסר.
  • get_student(id) מחזירה את התלמיד, או null.
  • top_student() מחזירה את התלמיד עם הממוצע הגבוה ביותר (במקרה של שוויון, התלמיד שהוסף ראשון), או null כשהרישום ריק.
  • get_ids() מחזירה את המזהים לפי סדר הוספת התלמידים.

הקוד שסופק קורא את מספר הפקודות, ואז מריץ פקודה אחת בכל שורה: 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 אונליין