الوحدة 8: المشروع الشامل · الموضوع 17 من 17
الموضوع 17

المشروع الشامل: نظام إدارة الطلاب

مشروع واحد يجمع دروس المقرر كلها: نظام صغير يحفظ بيانات طلاب الشعبة ودرجاتهم.

PersonStudentTeacherSchoolstudents.txt save 🏆 كل الدروس
بعد هذا الدرس ستستطيع أن:
  • تحلّل مشروعًا متكاملًا إلى كلاسات وواجهات وحزم.
  • تربط كل جزء في المشروع بالمفهوم الذي درسته.
  • تنفّذ المشروع في NetBeans، وتتتبّع مخرجاته.
  • تطوّر المشروع بإضافة ميزات جديدة.

١فكرة المشروع

نبني نظامًا لإدارة طلاب الشعبة: نضيف الطلاب ودرجاتهم، ونرفض الدرجة غير الصحيحة، ونعرض أعلى طالب ومتوسط الدرجات، ونطبع بيانات المعلّم والطالب بطريقة واحدة، ثم نحفظ كشف الدرجات في ملف ونقرؤه.

الفكرة مألوفة لك: كلاس الطالب Student من التدريب 6 (رقم واسم ودرجة)، لكننا نطوّره خطوة خطوة بكل ما تعلّمته.

٢ماذا نستخدم من الدروس؟

المفهومأين يظهر في المشروعالدرس
الدوال وإعادة القيمةaverage() و topStudent() تعيدان قيمة1. الدوال
الكلاس والكائنStudent و Teacher و School كلاسات، و new ينشئ كائنات2. الكلاس والكائن
دالة البناء و thisStudent(int id, String name, double mark)3. دالة البناء
الحزم و importالحزمتان school.model و school.app4. الحزم
محددات الوصولالخصائص private والدوال public5. محددات الوصول
static و finalالعداد count والثابت PASS_MARK6. static و final
التغليفsetMark ترفض الدرجة خارج 0 إلى 1007. التغليف
الوراثة و superStudent و Teacher يرثان Person8. الوراثة
تعدد الأشكالprintInfo() مختلفة لكل نوع، وقائمة من نوع Person9. تعدد الأشكال
التجريدPerson كلاس مجرد فيه printInfo() مجردة10. التجريد
الاستثناءاتtry و catch عند الدرجة 120 وعند الملف11. الاستثناءات
الملفاتsaveToFile تكتب، و printFile تقرأ12. الملفات
الواجهات InterfaceStudent ينفّذ Reportable13. الواجهات
ArrayListقائمة الطلاب داخل School14. ArrayList

٣خطوات البناء

  1. الواجهة Reportable: دالة واحدة report() تعيد سطرًا نصيًّا لحفظه في الملف.
  2. الكلاس المجرد Person: رقم واسم مغلّفان (private) مع get، ودالة مجردة printInfo().
  3. Student يرث Person وينفّذ Reportable: درجة محمية بـ setMark؛ إذا كانت الدرجة خارج 0 إلى 100 تطلق الدالة استثناءً بنفسها بالكلمة throw فيُرفض إنشاء الطالب. وفيه ثابت النجاح PASS_MARK، وعدّاد static للطلاب.
  4. Teacher يرث Person: ويضيف المادة subject.
  5. الكلاس School: قائمة ArrayList للطلاب، ودوال للإضافة والمتوسط والأعلى والحفظ في ملف والقراءة منه.
  6. Main: يجرّب كل شيء: إضافة، ومعالجة خطأ، وتعدد أشكال، وإحصاءات، وملف.

افتح تبويب 🧩 UML في المشروع أدناه لترى العلاقات بين الكلاسات، وانقر على أي كلاس لفتح كوده.

٤المشروع كاملًا

package school.model; public interface Reportable {    String report();}
package school.model; public abstract class Person {    private int id;    private String name;     public Person(int id, String name) {        this.id = id;        this.name = name;    }     public int getId() {        return id;    }     public String getName() {        return name;    }     public abstract void printInfo();}
package school.model; public class Student extends Person implements Reportable {    public static final double PASS_MARK = 60;    private static int count = 0;    private double mark;     public Student(int id, String name, double mark) {        super(id, name);        setMark(mark);        count++;    }     public double getMark() {        return mark;    }     public void setMark(double mark) {        if (mark < 0 || mark > 100)            throw new IllegalArgumentException("الدرجة يجب أن تكون بين 0 و 100");        this.mark = mark;    }     public String getResult() {        if (mark >= PASS_MARK)            return "Pass";        else            return "Fail";    }     public static int getCount() {        return count;    }     @Override    public void printInfo() {        System.out.println("Student: " + getId() + " | " + getName()                + " | " + mark + " | " + getResult());    }     @Override    public String report() {        return getId() + "," + getName() + "," + mark + "," + getResult();    }}
package school.model; public class Teacher extends Person {    private String subject;     public Teacher(int id, String name, String subject) {        super(id, name);        this.subject = subject;    }     @Override    public void printInfo() {        System.out.println("Teacher: " + getId() + " | " + getName() + " | " + subject);    }}
package school.app; import java.io.File;import java.io.FileNotFoundException;import java.io.FileWriter;import java.io.IOException;import java.util.ArrayList;import java.util.Scanner;import school.model.Student; public class School {    private ArrayList<Student> students = new ArrayList<>();     public void addStudent(Student s) {        students.add(s);    }     public double average() {        double sum = 0;        for (Student s : students) {            sum = sum + s.getMark();        }        return sum / students.size();    }     public Student topStudent() {        Student top = students.get(0);        for (Student s : students) {            if (s.getMark() > top.getMark())                top = s;        }        return top;    }     public void saveToFile(String fileName) throws IOException {        FileWriter writer = new FileWriter(fileName);        for (Student s : students) {            writer.write(s.report() + "\n");        }        writer.close();    }     public void printFile(String fileName) throws FileNotFoundException {        Scanner reader = new Scanner(new File(fileName));        while (reader.hasNextLine()) {            System.out.println(reader.nextLine());        }        reader.close();    }}
package school.app; import java.io.IOException;import java.util.ArrayList;import school.model.Person;import school.model.Student;import school.model.Teacher; public class Main {    public static void main(String[] args) {        School school = new School();         // 1) إضافة الطلاب        school.addStudent(new Student(4321, "Mohammed", 80));        school.addStudent(new Student(4344, "Turki", 50));        school.addStudent(new Student(4355, "Fahad", 92));         // 2) معالجة درجة غير صحيحة        try {            school.addStudent(new Student(4366, "Ali", 120));        } catch (IllegalArgumentException e) {            System.out.println("خطأ: " + e.getMessage());        }         // 3) تعدد الأشكال: قائمة من نوع الأب Person        ArrayList<Person> people = new ArrayList<>();        people.add(new Teacher(1, "Saud", "Java"));        people.add(school.topStudent());        for (Person p : people) {            p.printInfo();        }         // 4) الإحصاءات        System.out.println("Students: " + Student.getCount());        System.out.println("Average: " + school.average());         // 5) الحفظ في ملف ثم القراءة منه        try {            school.saveToFile("students.txt");            System.out.println("--- students.txt ---");            school.printFile("students.txt");        } catch (IOException e) {            System.out.println("خطأ في الملف: " + e.getMessage());        }    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
«interface»Reportable«abstract»PersonStudentTeacherSchoolMain
«interface»Reportable+ report() : String«abstract»Person- id : int- name : String+ Person(id : int, name : String)+ getId() : int+ getName() : String+ printInfo() : voidStudent+ PASS_MARK : double- count : int- mark : double+ Student(id : int, name : String, mark : double)+ getMark() : double+ setMark(mark : double) : void+ getResult() : String+ getCount() : int+ printInfo() : void+ report() : StringTeacher- subject : String+ Teacher(id : int, name : String, subject : String)+ printInfo() : voidSchool- students : ArrayList<Student>+ addStudent(s : Student) : void+ average() : double+ topStudent() : Student+ saveToFile(fileName : String) : void+ printFile(fileName : String) : voidMain+ main(args : String[]) : void

ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.

Output – School (run)×
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)

٥تطوير المشروع

التدريب العملي 19: نظام إدارة الطلابمشروع شامل يجمع كل ما تعلّمته في المقرر: الكلاسات والوراثة والتجريد والواجهات والقوائم والاستثناءات والملفات.افتح التدريب ←

الخلاصة

انتقل إلى تقييم الدرسأسئلة التقييم، وأكمل الفراغات.ابدأ التقييم ←
أنهيت المقرر كاملًا!اختبر نفسك في الاختبار النهائي الشامل.ابدأ الاختبار ←