المشروع الختامي ودراسة الحالة
نطبّق كل ما تعلّمناه: مشروع برنامج كامل، ودراسة حالة لبرنامج قائم، ومحاكاة على منصة تعليمية، مع أخلاقيات البرمجة والعمل الجماعي.
- تطبّق خطوات حل المشكلات كاملة على مشروع برمجي.
- تصمم برنامجًا يجمع الكلاسات والدوال والشروط والحلقات والتحقق من المدخلات.
- تحلّل برنامجًا قائمًا وتقترح تحسينات.
- توثّق الأخطاء التي واجهتها وطريقة حلها.
- تلتزم بأخلاقيات البرمجة والعمل الجماعي.
١ثلاثة أنشطة ختامية
تنص الخطة على ثلاثة أنشطة عملية تجمع كل ما تعلّمته. لكل نشاط وصف، ونتيجة متوقعة تسلّمها، وتقرير قصير.
| النشاط | ماذا تفعل؟ | ماذا تسلّم؟ |
|---|---|---|
| 🛠️ المشروع | تطوّر برنامجًا كاملًا: آلة حاسبة | برنامج يعمل + تقرير بخطوات التطوير والتحسين |
| 🔍 دراسة الحالة | تحلّل برنامجًا جاهزًا وتقترح تحسينات | تقرير: شرح الكود والوظائف والتوصيات |
| 💻 المحاكاة | تكتب أكوادًا على منصة تعليمية تفاعلية | أكواد تعمل + تقرير بالأخطاء التي واجهتها وكيف حللتها |
٢المشروع: آلة حاسبة متكاملة
نطبّق الخطوات المنهجية من الدرس الأول من البداية إلى النهاية.
١. التحليل
٢. التفكيك
- آلة حاسبة
- العمليات الحسابية
- الجمع
- الطرح
- الضرب
- القسمة مع منع الصفر
- الإدخال
- قراءة رمز العملية
- قراءة رقم مع التحقق
- التحكم
- قائمة متكررة حتى 0
- رفض العملية غير المعروفة
- الإخراج
- طباعة العملية والناتج
- العمليات الحسابية
٣. التصميم
نجمع العمليات الحسابية في كلاس Calculator (البرمجة الشيئية)، ونكتب دالتين مساعدتين في Main: readNumber للقراءة الآمنة، وisValid للتحقق من الرمز.
- ابدأ
- اطبع القائمة واقرأ الرمز op
- طالما op لا يساوي 0 :
- إذا كان الرمز صحيحًا: اقرأ a و b، نفّذ العملية، اطبع الناتج
- وإلا: اطبع «عملية غير معروفة»
- اطبع القائمة واقرأ op من جديد
- اطبع «مع السلامة»
- توقف
٤. التنفيذ التدريجي
- اكتب الكلاس Calculator وجرّب كل دالة وحدها من main.
- أضف قراءة عددين ورمز واحد، ونفّذ عملية واحدة.
- أضف الحلقة لتكرار القائمة حتى 0.
- أضف التحقق: القسمة على صفر، والرمز غير المعروف، والإدخال غير الرقمي.
٥. البرنامج كاملًا
اضغط ▶ شغّل هنا، واكتب المدخلات في STDIN كل واحد في سطر، مثل: + 5 3 / 8 0 0
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("مع السلامة"); }}
٦. الاختبار
| الحالة | المدخلات | المتوقع |
|---|---|---|
| عملية عادية | + 5 3 | 8.0 |
| قسمة على صفر | / 8 0 | رسالة خطأ |
| إدخال غير رقمي | abc | طلب الإدخال من جديد |
| رمز غير معروف | % | عملية غير معروفة |
| الخروج | 0 | مع السلامة |
٣دراسة حالة: تحليل برنامج قائم
اقرأ البرنامج التالي بتمعّن قبل تشغيله، ثم أجب عن أسئلة التحليل.
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)); }}
أسئلة التحليل
- ما وظيفة كل دالة؟ أعطِ كل واحدة اسمًا أوضح.
- ما المدخلات والمخرجات لكل دالة؟
- ما الذي يحدث لو تغيّر عدد المواد إلى أربع؟
- ما الحالات الحدّية التي لم يعالجها البرنامج؟
- اقترح ثلاثة تحسينات.
✍️ نموذج إجابة مختصر
fتحسب المعدل، فالأوضحaverage. وgتحوّل المعدل إلى تقدير، فالأوضحletterGrade.- average: تستقبل ثلاث درجات وتعيد معدلها. letterGrade: تستقبل المعدل وتعيد حرف التقدير.
- الدالة مكتوبة لثلاث درجات فقط، فنحتاج تعديلها.
- لا يوجد تحقق من الدرجات: درجة سالبة أو أكبر من 100 تُقبل.
- أسماء واضحة، وتحقق من الدرجات، وقراءة الدرجات من المستخدم بدل كتابتها في الكود.
هيكل تقرير دراسة الحالة
- وصف البرنامج: ماذا يفعل؟
- بنية البرنامج: الكلاسات والدوال ووظيفة كل منها.
- شرح الأجزاء المهمة من الكود.
- نقاط الضعف والحالات غير المعالجة.
- التوصيات: تحسين الأداء، وإضافة ميزات جديدة.
٤المحاكاة: منصات تعليم البرمجة
تتيح المنصات التفاعلية كتابة الكود وتشغيله في المتصفح دون تثبيت أي برنامج، وبعضها يقدّم تمارين تُصحَّح تلقائيًّا. وأنت تستخدم واحدة منها في هذا الموقع: زر ▶ شغّل هنا يعمل عبر منصة OneCompiler.
| المنصة | الاستخدام |
|---|---|
| OneCompiler | تشغيل أكواد جافا مع المدخلات STDIN، وهي المستخدمة في هذا الموقع |
| Replit | بيئة برمجة كاملة في المتصفح، تدعم مشاريع من عدة ملفات |
| Codecademy | دروس وتمارين تفاعلية متدرّجة تُصحَّح تلقائيًّا |
المطلوب
- اكتب على المنصة ثلاثة برامج: واحد بالمتغيرات والعمليات، وواحد بالشروط، وواحد بالحلقات.
- سجّل كل خطأ ظهر لك في جدول: الرسالة، ونوع الخطأ، وكيف أصلحته.
- سلّم الأكواد مع الجدول.
| # | رسالة الخطأ | نوعه | السبب | الإصلاح |
|---|---|---|---|---|
| 1 | ';' expected | صياغة | نسيت ; في السطر 5 | أضفت ; |
| 2 | … | … | … | … |
٥أخلاقيات البرمجة والعمل الجماعي
ينص ناتج التعلم الخامس على أن يلتزم المتدرب بأخلاقيات البرمجة والعمل الجماعي أثناء تنفيذ المهام، ويقيّم المدرب ذلك بالملاحظة.
أخلاقيات البرمجة
- الأمانة: لا تنسخ كود غيرك وتنسبه لنفسك. إذا استفدت من مصدر أو من زميل أو من أداة ذكاء اصطناعي فاذكر ذلك.
- الفهم قبل الاستخدام: لا تسلّم كودًا لا تستطيع شرحه سطرًا سطرًا.
- الخصوصية: لا تستخدم بيانات حقيقية لأشخاص دون إذنهم، ولا تعرض كلمات المرور أو البيانات الشخصية.
- الجودة: اختبر برنامجك جيدًا قبل تسليمه، فالبرامج تؤثر على أشخاص حقيقيين.
- احترام الترخيص: التزم بشروط استخدام الأكواد والمكتبات المنشورة.
العمل الجماعي
| الدور في الفريق | المهمة |
|---|---|
| المحلّل | يحلل المتطلبات ويكتب جدول المدخلات والمخرجات وشجرة التفكيك |
| المطوّر | يكتب الكود حسب التصميم المتفق عليه |
| المختبِر | يكتب جدول حالات الاختبار ويجرّب البرنامج ويبلّغ عن الأخطاء |
| الموثّق | يكتب التقرير ويجمع لقطات الشاشة |
- وزّعوا المهام حسب شجرة التفكيك: كل عضو جزء أو دالة.
- اتفقوا على أسماء الدوال والمتغيرات قبل البدء.
- راجعوا كود بعضكم Code Review باحترام: انتقدوا الكود لا الشخص.
- تبادلوا الأدوار في المشاريع القادمة ليتعلم الجميع كل المهارات.
٦معايير التقييم
| المعيار | الوزن | يُقاس بـ |
|---|---|---|
| التحليل والتفكيك والخوارزمية | 20% | جدول المدخلات والمخرجات، وشجرة التفكيك، والسودوكود |
| البرنامج يعمل ويحقق المطلوب | 30% | سلم التقدير العددي: الأداء العملي |
| جودة الكود: أسماء وتنسيق ودوال | 15% | مراجعة الكود |
| الاختبار ومعالجة الأخطاء | 15% | جدول حالات الاختبار |
| التقرير والعرض | 10% | قائمة الرصد: التقديم والعرض التوضيحي |
| الأخلاقيات والعمل الجماعي | 10% | ملاحظة المدرب |
الأوزان مقترحة، ويعدّلها المدرب حسب خطة التقييم المعتمدة.
توقّع وتحقّق
لماذا وضعنا العمليات الحسابية في كلاس Calculator؟
ما فائدة الدالة readNumber؟
استفدت من حل زميلك في جزء من المشروع. ما التصرف الصحيح؟
الخلاصة
- المشروع يمر بالتحليل، ثم التفكيك، ثم التصميم، ثم التنفيذ التدريجي، ثم الاختبار.
- البرمجة الشيئية تجمع العمليات المترابطة في كلاس واحد.
- دراسة الحالة: فهم بنية برنامج قائم ونقاط ضعفه واقتراح تحسينات.
- المنصات التفاعلية تتيح التدرّب وتسجيل الأخطاء وحلولها.
- الأمانة والفهم والخصوصية والتعاون جزء من عمل المبرمج.
تحدٍّ برمجي: طوّر الآلة الحاسبة
متقدمأضف إلى الكلاس Calculator عمليتين جديدتين: الأس ^ والنسبة المئوية %.
- أضف الدالة power(a, b) باستخدام Math.pow.
- أضف الدالة percent(a, b) التي تعيد a × b ÷ 100.
- عدّل isValid والشروط في main لتقبل ^ و %.
- مع ^ 2 10 يطبع: 2.0 ^ 10.0 = 1024.0
ابدأ من هذا الكود، واضغط ▶ شغّل هنا لتكتب حلّك وتجرّبه مباشرة:
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("مع السلامة"); }}
💡 تلميح 1
💡 تلميح 2
حاول بنفسك أولًا؛ للمسألة أكثر من حلّ صحيح.
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("مع السلامة"); }}