Menu
CoddyTech
flag Ar iconالعربيةdown icon

مراجعة - نظام سجلات الطلاب

جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 30 من 65.

challenge icon

التحدي

متوسط

أنشئ نظامًا صغيرًا لسجلات الطلاب باستخدام صنفين.

يحتفظ الصنف Student في student.gd ببياناته بشكل خاص:

  • يخزّن _init(id, new_name) المعرّف في متغير خاص، ويعيّن الاسم عبر المُعيّن student_name.
  • الخاصية student_id للقراءة فقط، وتُعيد المعرّف.
  • لدى student_name مُعيّن: يُرفض الاسم الأقصر من 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 عبر الإنترنت