📘 شرح الدرس الوحدة 7: المشروع الختامي · الدرس 17 من 17
الدرس 17
📋 في الخطة: التمارين العملية والمشاريع + ناتج التعلم 5 · ⏱ 0 نظري + 1 عملي

المشروع الختامي ودراسة الحالة

نطبّق كل ما تعلّمناه: مشروع برنامج كامل، ودراسة حالة لبرنامج قائم، ومحاكاة على منصة تعليمية، مع أخلاقيات البرمجة والعمل الجماعي.

PersonStudentTeacherSchoolstudents.txt save 🏆 كل الدروس
بعد هذا الدرس ستستطيع أن:
  • تطبّق خطوات حل المشكلات كاملة على مشروع برمجي.
  • تصمم برنامجًا يجمع الكلاسات والدوال والشروط والحلقات والتحقق من المدخلات.
  • تحلّل برنامجًا قائمًا وتقترح تحسينات.
  • توثّق الأخطاء التي واجهتها وطريقة حلها.
  • تلتزم بأخلاقيات البرمجة والعمل الجماعي.

١ثلاثة أنشطة ختامية

تنص الخطة على ثلاثة أنشطة عملية تجمع كل ما تعلّمته. لكل نشاط وصف، ونتيجة متوقعة تسلّمها، وتقرير قصير.

النشاطماذا تفعل؟ماذا تسلّم؟
🛠️ المشروعتطوّر برنامجًا كاملًا: آلة حاسبةبرنامج يعمل + تقرير بخطوات التطوير والتحسين
🔍 دراسة الحالةتحلّل برنامجًا جاهزًا وتقترح تحسيناتتقرير: شرح الكود والوظائف والتوصيات
💻 المحاكاةتكتب أكوادًا على منصة تعليمية تفاعليةأكواد تعمل + تقرير بالأخطاء التي واجهتها وكيف حللتها

٢المشروع: آلة حاسبة متكاملة

نطبّق الخطوات المنهجية من الدرس الأول من البداية إلى النهاية.

١. التحليل

📥 المدخلات Inputرمز العملية، ثم عددان. ويكرر المستخدم حتى يُدخل 0.
⚙️ المعالجة Processingتنفيذ العملية المختارة، مع منع القسمة على صفر ورفض المدخلات غير الرقمية.
📤 المخرجات Outputناتج العملية بصيغة مثل 5.0 + 3.0 = 8.0

٢. التفكيك

  • آلة حاسبة
    • العمليات الحسابية
      • الجمع
      • الطرح
      • الضرب
      • القسمة مع منع الصفر
    • الإدخال
      • قراءة رمز العملية
      • قراءة رقم مع التحقق
    • التحكم
      • قائمة متكررة حتى 0
      • رفض العملية غير المعروفة
    • الإخراج
      • طباعة العملية والناتج

٣. التصميم

نجمع العمليات الحسابية في كلاس Calculator (البرمجة الشيئية)، ونكتب دالتين مساعدتين في Main: readNumber للقراءة الآمنة، وisValid للتحقق من الرمز.

  1. ابدأ
  2. اطبع القائمة واقرأ الرمز op
  3. طالما op لا يساوي 0 :
  4. إذا كان الرمز صحيحًا: اقرأ a و b، نفّذ العملية، اطبع الناتج
  5. وإلا: اطبع «عملية غير معروفة»
  6. اطبع القائمة واقرأ op من جديد
  7. اطبع «مع السلامة»
  8. توقف

٤. التنفيذ التدريجي

  1. اكتب الكلاس Calculator وجرّب كل دالة وحدها من main.
  2. أضف قراءة عددين ورمز واحد، ونفّذ عملية واحدة.
  3. أضف الحلقة لتكرار القائمة حتى 0.
  4. أضف التحقق: القسمة على صفر، والرمز غير المعروف، والإدخال غير الرقمي.

٥. البرنامج كاملًا

اضغط ▶ شغّل هنا، واكتب المدخلات في STDIN كل واحد في سطر، مثل: + 5 3 / 8 0 0

Main.java
import java.util.Scanner; class Calculator {    double add(double a, double b) { return a + b; }    double subtract(double a, double b) { return a - b; }    double multiply(double a, double b) { return a * b; }    double divide(double a, double b) {        if (b == 0) {            System.out.println("خطأ: لا يمكن القسمة على صفر");            return 0;        }        return a / b;    }} public class Main {    static double readNumber(Scanner in, String prompt) {        System.out.println(prompt);        while (!in.hasNextDouble()) {            System.out.println("أدخل رقمًا من فضلك:");            in.next();        }        return in.nextDouble();    }     static boolean isValid(String op) {        return op.equals("+") || op.equals("-") || op.equals("*") || op.equals("/");    }     public static void main(String[] args) {        Scanner in = new Scanner(System.in);        Calculator calc = new Calculator();        System.out.println("اختر العملية: + - * /  أو 0 للخروج");        String op = in.next();        while (!op.equals("0")) {            if (isValid(op)) {                double a = readNumber(in, "العدد الأول:");                double b = readNumber(in, "العدد الثاني:");                double r;                if (op.equals("+")) r = calc.add(a, b);                else if (op.equals("-")) r = calc.subtract(a, b);                else if (op.equals("*")) r = calc.multiply(a, b);                else r = calc.divide(a, b);                System.out.println(a + " " + op + " " + b + " = " + r);            } else {                System.out.println("عملية غير معروفة");            }            System.out.println("اختر العملية: + - * /  أو 0 للخروج");            op = in.next();        }        System.out.println("مع السلامة");    }}
Output – JavaApplication (run)×
run:
اختر العملية: + - * / أو 0 للخروج
+
العدد الأول:
5
العدد الثاني:
3
5.0 + 3.0 = 8.0
اختر العملية: + - * / أو 0 للخروج
/
العدد الأول:
8
العدد الثاني:
abc
أدخل رقمًا من فضلك:
0
خطأ: لا يمكن القسمة على صفر
8.0 / 0.0 = 0.0
اختر العملية: + - * / أو 0 للخروج
%
عملية غير معروفة
اختر العملية: + - * / أو 0 للخروج
0
مع السلامة
BUILD SUCCESSFUL (total time: 0 seconds)

٦. الاختبار

الحالةالمدخلاتالمتوقع
عملية عادية+ 5 38.0
قسمة على صفر/ 8 0رسالة خطأ
إدخال غير رقميabcطلب الإدخال من جديد
رمز غير معروف%عملية غير معروفة
الخروج0مع السلامة

٣دراسة حالة: تحليل برنامج قائم

اقرأ البرنامج التالي بتمعّن قبل تشغيله، ثم أجب عن أسئلة التحليل.

Main.java
public class Main {    static double f(double a, double b, double c) {        double s = a + b + c;        return s / 3;    }    static String g(double x) {        if (x >= 90) return "A";        else if (x >= 80) return "B";        else if (x >= 70) return "C";        else if (x >= 60) return "D";        return "F";    }    public static void main(String[] args) {        double m = f(85, 92, 78);        System.out.println("المعدل: " + m);        System.out.println("التقدير: " + g(m));        double m2 = f(55, 61, 58);        System.out.println("المعدل: " + m2);        System.out.println("التقدير: " + g(m2));    }}
Output – JavaApplication (run)×
run:
المعدل: 85.0
التقدير: B
المعدل: 58.0
التقدير: F
BUILD SUCCESSFUL (total time: 0 seconds)

أسئلة التحليل

  1. ما وظيفة كل دالة؟ أعطِ كل واحدة اسمًا أوضح.
  2. ما المدخلات والمخرجات لكل دالة؟
  3. ما الذي يحدث لو تغيّر عدد المواد إلى أربع؟
  4. ما الحالات الحدّية التي لم يعالجها البرنامج؟
  5. اقترح ثلاثة تحسينات.
✍️ نموذج إجابة مختصر
  • f تحسب المعدل، فالأوضح average. وg تحوّل المعدل إلى تقدير، فالأوضح letterGrade.
  • average: تستقبل ثلاث درجات وتعيد معدلها. letterGrade: تستقبل المعدل وتعيد حرف التقدير.
  • الدالة مكتوبة لثلاث درجات فقط، فنحتاج تعديلها.
  • لا يوجد تحقق من الدرجات: درجة سالبة أو أكبر من 100 تُقبل.
  • أسماء واضحة، وتحقق من الدرجات، وقراءة الدرجات من المستخدم بدل كتابتها في الكود.

هيكل تقرير دراسة الحالة

  1. وصف البرنامج: ماذا يفعل؟
  2. بنية البرنامج: الكلاسات والدوال ووظيفة كل منها.
  3. شرح الأجزاء المهمة من الكود.
  4. نقاط الضعف والحالات غير المعالجة.
  5. التوصيات: تحسين الأداء، وإضافة ميزات جديدة.

٤المحاكاة: منصات تعليم البرمجة

تتيح المنصات التفاعلية كتابة الكود وتشغيله في المتصفح دون تثبيت أي برنامج، وبعضها يقدّم تمارين تُصحَّح تلقائيًّا. وأنت تستخدم واحدة منها في هذا الموقع: زر ▶ شغّل هنا يعمل عبر منصة OneCompiler.

المنصةالاستخدام
OneCompilerتشغيل أكواد جافا مع المدخلات STDIN، وهي المستخدمة في هذا الموقع
Replitبيئة برمجة كاملة في المتصفح، تدعم مشاريع من عدة ملفات
Codecademyدروس وتمارين تفاعلية متدرّجة تُصحَّح تلقائيًّا

المطلوب

  1. اكتب على المنصة ثلاثة برامج: واحد بالمتغيرات والعمليات، وواحد بالشروط، وواحد بالحلقات.
  2. سجّل كل خطأ ظهر لك في جدول: الرسالة، ونوع الخطأ، وكيف أصلحته.
  3. سلّم الأكواد مع الجدول.
#رسالة الخطأنوعهالسببالإصلاح
1';' expectedصياغةنسيت ; في السطر 5أضفت ;
2…………

٥أخلاقيات البرمجة والعمل الجماعي

ينص ناتج التعلم الخامس على أن يلتزم المتدرب بأخلاقيات البرمجة والعمل الجماعي أثناء تنفيذ المهام، ويقيّم المدرب ذلك بالملاحظة.

أخلاقيات البرمجة

العمل الجماعي

الدور في الفريقالمهمة
المحلّليحلل المتطلبات ويكتب جدول المدخلات والمخرجات وشجرة التفكيك
المطوّريكتب الكود حسب التصميم المتفق عليه
المختبِريكتب جدول حالات الاختبار ويجرّب البرنامج ويبلّغ عن الأخطاء
الموثّقيكتب التقرير ويجمع لقطات الشاشة

٦معايير التقييم

المعيارالوزنيُقاس بـ
التحليل والتفكيك والخوارزمية20%جدول المدخلات والمخرجات، وشجرة التفكيك، والسودوكود
البرنامج يعمل ويحقق المطلوب30%سلم التقدير العددي: الأداء العملي
جودة الكود: أسماء وتنسيق ودوال15%مراجعة الكود
الاختبار ومعالجة الأخطاء15%جدول حالات الاختبار
التقرير والعرض10%قائمة الرصد: التقديم والعرض التوضيحي
الأخلاقيات والعمل الجماعي10%ملاحظة المدرب

الأوزان مقترحة، ويعدّلها المدرب حسب خطة التقييم المعتمدة.

توقّع وتحقّق

لماذا وضعنا العمليات الحسابية في كلاس Calculator؟

هذه فائدة البرمجة الشيئية.

ما فائدة الدالة readNumber؟

تمنع InputMismatchException.

استفدت من حل زميلك في جزء من المشروع. ما التصرف الصحيح؟

الأمانة وفهم الكود من أخلاقيات البرمجة.

الخلاصة

تحدٍّ برمجي: طوّر الآلة الحاسبة

متقدم

أضف إلى الكلاس Calculator عمليتين جديدتين: الأس ^ والنسبة المئوية %.

المطلوب:
  • أضف الدالة power(a, b) باستخدام Math.pow.
  • أضف الدالة percent(a, b) التي تعيد a × b ÷ 100.
  • عدّل isValid والشروط في main لتقبل ^ و %.
  • مع ^ 2 10 يطبع: 2.0 ^ 10.0 = 1024.0

ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:

Main.java
import java.util.Scanner; class Calculator {    double add(double a, double b) { return a + b; }    double subtract(double a, double b) { return a - b; }    double multiply(double a, double b) { return a * b; }    double divide(double a, double b) {        if (b == 0) {            System.out.println("خطأ: لا يمكن القسمة على صفر");            return 0;        }        return a / b;    }} public class Main {    static double readNumber(Scanner in, String prompt) {        System.out.println(prompt);        while (!in.hasNextDouble()) {            System.out.println("أدخل رقمًا من فضلك:");            in.next();        }        return in.nextDouble();    }     static boolean isValid(String op) {        return op.equals("+") || op.equals("-") || op.equals("*") || op.equals("/");    }     public static void main(String[] args) {        Scanner in = new Scanner(System.in);        Calculator calc = new Calculator();        System.out.println("اختر العملية: + - * /  أو 0 للخروج");        String op = in.next();        while (!op.equals("0")) {            if (isValid(op)) {                double a = readNumber(in, "العدد الأول:");                double b = readNumber(in, "العدد الثاني:");                double r;                if (op.equals("+")) r = calc.add(a, b);                else if (op.equals("-")) r = calc.subtract(a, b);                else if (op.equals("*")) r = calc.multiply(a, b);                else r = calc.divide(a, b);                System.out.println(a + " " + op + " " + b + " = " + r);            } else {                System.out.println("عملية غير معروفة");            }            System.out.println("اختر العملية: + - * /  أو 0 للخروج");            op = in.next();        }        System.out.println("مع السلامة");    }}
Output – المطلوب×
2.0 ^ 10.0 = 1024.0
200.0 % 15.0 = 30.0
💡 تلميح 1
الدالة: double power(double a, double b) { return Math.pow(a, b); }
💡 تلميح 2
لا تنسَ إضافة الرمزين إلى isValid.

حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.

Main.java
import java.util.Scanner; class Calculator {    double add(double a, double b) { return a + b; }    double subtract(double a, double b) { return a - b; }    double multiply(double a, double b) { return a * b; }    double power(double a, double b) { return Math.pow(a, b); }    double percent(double a, double b) { return a * b / 100; }    double divide(double a, double b) {        if (b == 0) {            System.out.println("خطأ: لا يمكن القسمة على صفر");            return 0;        }        return a / b;    }} public class Main {    static double readNumber(Scanner in, String prompt) {        System.out.println(prompt);        while (!in.hasNextDouble()) {            System.out.println("أدخل رقمًا من فضلك:");            in.next();        }        return in.nextDouble();    }     static boolean isValid(String op) {        return op.equals("+") || op.equals("-") || op.equals("*") || op.equals("/")            || op.equals("^") || op.equals("%");    }     public static void main(String[] args) {        Scanner in = new Scanner(System.in);        Calculator calc = new Calculator();        System.out.println("اختر العملية: + - * /  أو 0 للخروج");        String op = in.next();        while (!op.equals("0")) {            if (isValid(op)) {                double a = readNumber(in, "العدد الأول:");                double b = readNumber(in, "العدد الثاني:");                double r;                if (op.equals("+")) r = calc.add(a, b);                else if (op.equals("-")) r = calc.subtract(a, b);                else if (op.equals("*")) r = calc.multiply(a, b);                else if (op.equals("^")) r = calc.power(a, b);                else if (op.equals("%")) r = calc.percent(a, b);                else r = calc.divide(a, b);                System.out.println(a + " " + op + " " + b + " = " + r);            } else {                System.out.println("عملية غير معروفة");            }            System.out.println("اختر العملية: + - * /  أو 0 للخروج");            op = in.next();        }        System.out.println("مع السلامة");    }}
انتقل إلى تقييم الدرسأسئلة الاختيار، وصح وخطأ، وأكمل الفراغات، والأسئلة العملية.ابدأ التقييم ←