الموضوع 17
المشروع الشامل: نظام إدارة الطلاب
مشروع واحد يجمع دروس المقرر كلها: نظام صغير يحفظ بيانات طلاب الشعبة ودرجاتهم.
بعد هذا الدرس ستستطيع أن:
- تحلّل مشروعًا متكاملًا إلى كلاسات وواجهات وحزم.
- تربط كل جزء في المشروع بالمفهوم الذي درسته.
- تنفّذ المشروع في NetBeans، وتتتبّع مخرجاته.
- تطوّر المشروع بإضافة ميزات جديدة.
١فكرة المشروع
نبني نظامًا لإدارة طلاب الشعبة: نضيف الطلاب ودرجاتهم، ونرفض الدرجة غير الصحيحة، ونعرض أعلى طالب ومتوسط الدرجات، ونطبع بيانات المعلّم والطالب بطريقة واحدة، ثم نحفظ كشف الدرجات في ملف ونقرؤه.
الفكرة مألوفة لك: كلاس الطالب Student من التدريب 6 (رقم واسم ودرجة)، لكننا نطوّره خطوة خطوة بكل ما تعلّمته.
٢ماذا نستخدم من الدروس؟
| المفهوم | أين يظهر في المشروع | الدرس |
|---|---|---|
| الدوال وإعادة القيمة | average() و topStudent() تعيدان قيمة | 1. الدوال |
| الكلاس والكائن | Student و Teacher و School كلاسات، و new ينشئ كائنات | 2. الكلاس والكائن |
| دالة البناء و this | Student(int id, String name, double mark) | 3. دالة البناء |
| الحزم و import | الحزمتان school.model و school.app | 4. الحزم |
| محددات الوصول | الخصائص private والدوال public | 5. محددات الوصول |
| static و final | العداد count والثابت PASS_MARK | 6. static و final |
| التغليف | setMark ترفض الدرجة خارج 0 إلى 100 | 7. التغليف |
| الوراثة و super | Student و Teacher يرثان Person | 8. الوراثة |
| تعدد الأشكال | printInfo() مختلفة لكل نوع، وقائمة من نوع Person | 9. تعدد الأشكال |
| التجريد | Person كلاس مجرد فيه printInfo() مجردة | 10. التجريد |
| الاستثناءات | try و catch عند الدرجة 120 وعند الملف | 11. الاستثناءات |
| الملفات | saveToFile تكتب، و printFile تقرأ | 12. الملفات |
| الواجهات Interface | Student ينفّذ Reportable | 13. الواجهات |
| ArrayList | قائمة الطلاب داخل School | 14. ArrayList |
٣خطوات البناء
- الواجهة Reportable: دالة واحدة report() تعيد سطرًا نصيًّا لحفظه في الملف.
- الكلاس المجرد Person: رقم واسم مغلّفان (private) مع get، ودالة مجردة printInfo().
- Student يرث Person وينفّذ Reportable: درجة محمية بـ setMark؛ إذا كانت الدرجة خارج 0 إلى 100 تطلق الدالة استثناءً بنفسها بالكلمة throw فيُرفض إنشاء الطالب. وفيه ثابت النجاح PASS_MARK، وعدّاد static للطلاب.
- Teacher يرث Person: ويضيف المادة subject.
- الكلاس School: قائمة ArrayList للطلاب، ودوال للإضافة والمتوسط والأعلى والحفظ في ملف والقراءة منه.
- Main: يجرّب كل شيء: إضافة، ومعالجة خطأ، وتعدد أشكال، وإحصاءات، وملف.
افتح تبويب 🧩 UML في المشروع أدناه لترى العلاقات بين الكلاسات، وانقر على أي كلاس لفتح كوده.
٤المشروع كاملًا
package school.model; public interface Reportable { String report();}
ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.
run:
خطأ: الدرجة يجب أن تكون بين 0 و 100
Teacher: 1 | Saud | Java
Student: 4355 | Fahad | 92.0 | Pass
Students: 3
Average: 74.0
--- students.txt ---
4321,Mohammed,80.0,Pass
4344,Turki,50.0,Fail
4355,Fahad,92.0,Pass
BUILD SUCCESSFUL (total time: 0 seconds)
٥تطوير المشروع
- الواجهة الرسومية: صمّم في NetBeans نافذة فيها ثلاثة حقول (الرقم والاسم والدرجة) وزر «إضافة» يستدعي school.addStudent، كما في 15. درس الواجهات الرسومية.
- قاعدة البيانات: احفظ الطلاب في جدول students بدل الملف، كما في 16. درس قاعدة البيانات.
- تحدٍّ: أضف إلى School دالة countPassed() تعيد عدد الناجحين.
الخلاصة
- المشروع يجمع الكلاسات والوراثة والتجريد والواجهات في تصميم واحد.
- ArrayList يحفظ الطلاب، والاستثناءات تحمي من البيانات الخاطئة.
- الملفات تحفظ النتائج بعد إغلاق البرنامج.
- يمكن تطويره بواجهة رسومية وقاعدة بيانات.