فهرس المقرر
تدريب عملي

التدريب العملي 19: نظام إدارة الطلاب

مشروع شامل يجمع كل ما تعلّمته في المقرر: الكلاسات والوراثة والتجريد والواجهات والقوائم والاستثناءات والملفات.

PersonStudentTeacherSchoolstudents.txt save 🏆 كل الدروس

من الدرس 17. المشروع الشامل: نظام إدارة الطلاب · كل التدريبات

١نص المسألة

ابنِ نظامًا لإدارة طلاب الشعبة: كلاس مجرد Person، وطالب ومعلّم يرثانه، وواجهة Reportable، وكلاس School يحفظ الطلاب في ArrayList ويحسب المتوسط وأعلى طالب ويحفظ الكشف في ملف. ارفض أي درجة خارج 0 إلى 100.

٢الخوارزمية المقترحة

  1. أنشئ الحزمتين school.model و school.app.
  2. اكتب الواجهة Reportable والكلاس المجرد Person (رقم واسم private ودالة printInfo مجردة).
  3. اكتب Student يرث Person وينفّذ Reportable: setMark يرفض الدرجة الخاطئة بـ throw، وعدّاد static، وثابت PASS_MARK.
  4. اكتب Teacher يرث Person ويضيف المادة.
  5. اكتب School: قائمة الطلاب، و average و topStudent، و saveToFile و printFile.
  6. في Main أضف الطلاب، وجرّب درجة خاطئة داخل try، واطبع المعلّم والأعلى، ثم الإحصاءات، ثم احفظ الملف واقرأه.

٣خطوات التطبيق

في NetBeans

  1. أنشئ مشروعًا باسم School دون Main Class.
  2. أنشئ حزمتين: school.model و school.app (زر أيمن على Source Packages‏ ← ‏New‏ ← ‏Java Package).
  3. في school.model أنشئ: الواجهة Reportable، ثم Person، ثم Student، ثم Teacher.
  4. في school.app أنشئ: School ثم Main، ونفّذ Main.

في OneCompiler

  1. افتح OneCompiler من زر «▶ شغّل المشروع» أسفل الحل، أو من موقع onecompiler.com/java.
  2. في OneCompiler تُكتب كل الكلاسات في ملف واحد Main.java؛ زر التشغيل يجمعها لك تلقائيًّا.
  3. إذا كان البرنامج يقرأ من لوحة المفاتيح، فاكتب المدخلات في خانة STDIN التي تظهر تحت الكود في محرّر OneCompiler، ثم اضغط Run.

٤المخرجات المطلوبة

نفّذ برنامجك، ويجب أن تظهر المخرجات التالية:

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

٥الحل المقترح

حاول بنفسك أولًا، ثم قارن حلّك بالحل المقترح (كود التدريب من مذكرة العملي):

👁 اعرض الحل المقترح
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. إجاباتك تُحفظ تلقائيًّا على هذا الجهاز؛ أجب ثم اضغط «صحّح ورقتي».

1السؤال الأول: اختر الإجابة الصحيحة

1) ما الكلاس المجرد في المشروع؟
2) لماذا لم يُضَف الطالب Ali إلى القائمة؟
3) ما فائدة الواجهة Reportable في المشروع؟
4) لماذا ظهر Fahad في المخرجات مع المعلّم؟
5) كيف حسبنا المتوسط 74.0؟
6) لماذا وضعنا saveToFile داخل try؟
7) أي مفهوم يمثّله الثابت PASS_MARK؟
8) ما الحزمة التي فيها الكلاس Student؟
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».