نطبّق كل ما تعلمناه في برنامج واحد متكامل: متغيرات، إدخال، شروط، String، وتحقق من الأخطاء.
ما الذي سنبنيه؟
هذا المشروع هدفه تجميع المفاهيم التي تعلمتها في برنامج واحد حقيقي — آلة حاسبة تسأل المستخدم عن رقمين وعملية، ثم تطبع الناتج مع التحقق من الأخطاء.
المتغيرات
إدخال المستخدم
الشروط if/else
String وequals
التحقق من الأخطاء
أنواع البيانات
التخطيط قبل الكود — خطوات البرنامج
قاعدة ذهبية: قبل كتابة أي كود، فكّر في الخطوات بلغة بشرية أولاً. هذا يُسمى Pseudocode.
🗺️ خطة البرنامج
المبرمجون المحترفون يرسمون خطة البرنامج قبل الكود. هذا يوفّر وقتاً ويقلّل الأخطاء كثيراً.
أداة Scanner — كيف نقرأ إدخال المستخدم؟
لقراءة إدخال المستخدم في Java نستخدم كلاساً خاصاً يُسمى Scanner — يجب استيراده أولاً.
// ① استيراد Scanner — في أعلى الملف import java.util.Scanner; // ② إنشاء Scanner Scanner in = new Scanner(System.in); // ③ قراءة أنواع مختلفة int num = in.nextInt(); ← عدد صحيح double dec = in.nextDouble(); ← عدد عشري String word = in.next(); ← كلمة واحدة String line = in.nextLine(); ← سطر كامل
| الدالة | تقرأ | مثال |
|---|---|---|
nextInt() | عدد صحيح | 5, -3, 100 |
nextDouble() | عدد عشري | 3.14, 9.99 |
next() | كلمة واحدة | "+", "hello" |
nextLine() | سطر كامل | "Ahmed Ali" |
الكود الكامل للمشروع
import java.util.Scanner; public class Calculator { public static void main(String[] args) { Scanner in = new Scanner(System.in); // ① قراءة الرقم الأول System.out.print("أدخل الرقم الأول: "); double a = in.nextDouble(); // ② قراءة الرقم الثاني System.out.print("أدخل الرقم الثاني: "); double b = in.nextDouble(); // ③ قراءة العملية System.out.print("اختر العملية (+ - * /): "); String op = in.next(); double result = 0; // ④ تنفيذ العملية المناسبة if (op.equals("+")) { result = a + b; } else if (op.equals("-")) { result = a - b; } else if (op.equals("*")) { result = a * b; } else if (op.equals("/")) { // ⑤ التحقق من القسمة على صفر if (b == 0) { System.out.println("خطأ: لا يمكن القسمة على صفر!"); return; } result = a / b; } else { System.out.println("خطأ: عملية غير صحيحة!"); return; } // ⑥ طباعة النتيجة System.out.println("النتيجة: " + a + " " + op + " " + b + " = " + result); } }
🖥️ مثال على التشغيل:
أدخل الرقم الأول: 10 أدخل الرقم الثاني: 3 اختر العملية (+ - * /): + النتيجة: 10.0 + 3.0 = 13.0
شرح النقاط المهمة داخل الكود
import java.util.Scanner; يجب استيراد Scanner في أول الملف قبل الكلاس. بدونها ستظهر رسالة خطأ "cannot find symbol".
استخدمنا double بدل int حتى يقبل البرنامج الأعداد العشرية مثل 3.5 و 9.99. وهو يقبل الأعداد الصحيحة أيضاً.
استخدمنا .equals() لمقارنة العملية — وليس ==. هذا تطبيق مباشر للقاعدة التي تعلمناها في درس String.
قبل القسمة، نتحقق أن المقسوم عليه ليس صفراً — القسمة على صفر تسبب ArithmeticException وتوقف البرنامج بشكل مفاجئ.
return في دالة void تعني: أنهِ الدالة هنا — لا تكمل تنفيذ بقية الكود. نستخدمها عند حدوث خطأ لإيقاف البرنامج بأمان.
تطوير المشروع — تمارين للمبتدئ 💪
جرّب تطوير المشروع خطوة بخطوة — حتى لو استغرق وقتاً:
أضف عملية باقي القسمة %
أضف شرطاً جديداً يتحقق من العملية "%" ويحسب الباقي.
else if (op.equals("%")) { result = (int) a % (int) b;} اجعل البرنامج يعيد السؤال
ضع كود الآلة الحاسبة داخل حلقة while(true) مع خيار للخروج.
while (true) { // ... كود الآلة الحاسبة if (op.equals("exit")) break;} أضف رسالة ترحيب ووداع
اطبع رسالة في البداية وأخرى في النهاية — يُحسّن تجربة المستخدم.
أخطاء شائعة في هذا المشروع ⚠️
نسيان import Scanner
❌ بدون import
public class Calculator { Scanner in = ... cannot find symbol: Scanner
✅ مع import
import java.util.Scanner; public class Calculator { مقارنة العملية بـ == بدل equals
❌ قد لا يعمل
if (op == "+") ✅ صحيح
if (op.equals("+")) عدم التحقق من القسمة على صفر
بدون التحقق، إدخال 0 كمقسوم عليه سيتسبب في ArithmeticException ويوقف البرنامج فجأة.
كيف أبني مشروعًا فعليًا (طريقتي العملية)
هذا أول مشروع متكامل لك، ودعني أشاركك الطريقة التي أبني بها أي برنامج، صغُر أم كبُر — فهي أهم ما يميّز من ينجز عمن يتعثّر.
أولًا أكتب الخطوات بلغة بشرية قبل أي كود، تمامًا كما فعلنا في تخطيط هذا المشروع. ثانيًا أبني خطوة واحدة وأشغّلها للتأكد أنها تعمل قبل الانتقال للتالية — لا أكتب البرنامج كاملًا ثم أشغّله، لأن أي خطأ حينها يضيع وسط عشرات الأسطر.
ونصيحة ذهبية من واقع الأخطاء التي رأيتها في آلات حاسبة كثيرة: لا تنسَ معالجة القسمة على صفر. المستخدم سيجرّبها حتمًا، وإن لم تتوقّعها سيتوقّف برنامجك أو يعطي نتيجة غريبة. تحقّق من المقام قبل القسمة، واعرض رسالة واضحة. هذه التفصيلة الصغيرة هي ما يحوّل تمرينًا إلى برنامج يثق به مستخدمه.
🎉 أتممت الوحدة الرابعة!
في هذا المشروع طبّقت:
Scanner لقراءة إدخال المستخدم
if/else if/else لتنفيذ العمليات
.equals() لمقارنة النصوص
التحقق من الأخطاء واستخدام return
🏆 ما أنجزته حتى الآن:
المتغيرات ← الشروط ← الحلقات ← الدوال ← Class وObject ← Constructor ← Encapsulation ← final ← static ← Arrays ← String ← مشروع تطبيقي!
⏭️ الخطوة القادمة:
سنجعل الكلاس لا يحتوي بيانات فقط، بل يحتوي سلوكاً (Methods) أيضاً — ونبدأ بناء برامج أكثر احترافية وتنظيماً.