مراجعة - نظام سجلات الطلاب
جزء من قسم البرمجة كائنية التوجّه في رحلة GDScript على Coddy. الدرس 30 من 65.
التحدي
متوسطأنشئ نظامًا صغيرًا لسجلات الطلاب باستخدام صنفين.
يحتفظ الصنف 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])
جميع دروس البرمجة كائنية التوجّه
1أساسيات البرمجة كائنية التوجه
الملفات الخارجيةمقدمة إلى البرمجة كائنية التوجهالفئات مقابل الكائناتالكلمة المفتاحية selfالأساليبالخصائصالمُنشئ (_init)مراجعة - آلة حاسبة بسيطة4تعدد الأشكال
إعادة النظر في تجاوز الأساليبكتابة الأنواع بأسلوب البطةالفئات والأساليب المجرّدةتصميم الواجهاتمراجعة - حاسبة الأشكال10أنماط التصميم، الجزء الثاني
نمط الأوامرنمط المحوّلنمط المُزيّننمط الطريقة القالبيةنمط الحالةالنمط المركّب2خصائص الأصناف
متغيرات الكائن مقابل المتغيرات الساكنةالدوال الساكنةمُعيِّنات الخصائصمُسترجِعات الخصائصخاص وفقًا للاتفاقيةمراجعة - مدير الحسابات البنكية5التغليف
الأعضاء العامة والخاصةالتحقق من الصحة باستخدام دوال الضبطإخفاء المعلوماتالخصائص للقراءة فقطمراجعة - نظام سجلات الطلاب8مفاهيم متقدمة في البرمجة كائنية التوجه
التركيب مقابل الوراثةالأصناف الداخليةالعُقد كمكوّناتRefCounted مقابل Nodeالتعدادات في الأصنافتدرّب بنفسك: مترجم GDScript عبر الإنترنت