مقارنات Java والعوامل المنطقية
ما هذا ولماذا؟
تخيل أنك روبوت يتخذ القرارات. على سبيل المثال: "إذا كان الجو ممطرًا في الخارج، فخذ مظلة". أو: "إذا كان لدي 100 روبل وأريد آيس كريم، فاشتريه". في البرمجة، تساعد هذه القرارات في اتخاذها عوامل المقارنة (التي تقارن الأرقام أو النصوص) والعوامل المنطقية (التي تربط عدة شروط في شرط واحد).
في Java، كما في الحياة، لدينا أسئلة: "هل الرقم 10 أكبر من 5؟"، "هل الكلمتان متساويتان؟"، "هل يتم استيفاء شرطين في وقت واحد؟". الإجابات دائمًا "نعم" (true) أو "لا" (false). هذا يشبه إشارة المرور: إذا كان الضوء أخضر (true) - نمضي، إذا كان أحمر (false) - نتوقف.
لماذا نحتاج هذا؟ بدونها، لن يتمكن الكمبيوتر من اتخاذ القرارات بنفسه في المواقف المختلفة. على سبيل المثال، في لعبة: إذا نفدت حياة اللاعب (حياة == 0)، فاعرض "Game Over". أو في آلة حاسبة: إذا تم إدخال رقم أكبر من 100، فاعرض تحذيرًا. عوامل المقارنة والعوامل المنطقية هي أساس أي سلوك "ذكي" للبرامج.
في Python، بالمناسبة، كل شيء مشابه جدًا: هناك أيضًا ==, !=, >, <, >=, <= والعوامل المنطقية and, or, not. لكن في Java هناك فرق مهم واحد: السلاسل النصية (النصوص) لا تُقارن بـ ==، بل بأمر خاص .equals(). سنشرح هذا بالتفصيل.
أمثلة على الكود مع الشرح
مثال 1: مقارنة الأرقام (أكبر/أصغر بسيط)
// نعلن عن متغيرات بأرقام
int عمر_بيتيا = 12;
int عمر_فاسيا = 14;
// نقارن: هل عمر بيتيا أكبر من عمر فاسيا؟
boolean بيتيا_أكبر = عمر_بيتيا > عمر_فاسيا;
System.out.println("هل بيتيا أكبر من فاسيا؟ " + بيتيا_أكبر); // ستطبع: false
// نقارن: هل عمر بيتيا أصغر من عمر فاسيا؟
boolean بيتيا_أصغر = عمر_بيتيا < عمر_فاسيا;
System.out.println("هل بيتيا أصغر من فاسيا؟ " + بيتيا_أصغر); // ستطبع: true
// نتحقق من المساواة
boolean هما_نفس_العمر = عمر_بيتيا == عمر_فاسيا;
System.out.println("هل هما بنفس العمر؟ " + هما_نفس_العمر); // ستطبع: false
// نتحقق من عدم المساواة
boolean عمر_مختلف = عمر_بيتيا != عمر_فاسيا;
System.out.println("هل العمر مختلف؟ " + عمر_مختلف); // ستطبع: true
الشرح: أنشأنا متغيرين بأرقام. العامل > يتحقق مما إذا كان الرقم الأول أكبر من الثاني. إذا كان الأمر كذلك، تكون القيمة true، وإلا false. العامل < هو العكس. == يتحقق من المساواة (لاحظ: علامتا يساوي، وليس واحدة! العلامة الواحدة تعني التعيين). != يتحقق من أن الأرقام غير متساوية. نتيجة كل مقارنة هي قيمة منطقية true أو false، نخزنها في متغير من النوع boolean (النوع المنطقي).
مثال 2: مقارنة السلاسل النصية (النصوص) - فرق مهم عن Python
String اسم1 = "آنا";
String اسم2 = "آنا";
String اسم3 = "فانيا";
// نقارن السلاسل النصية عبر equals (وليس عبر ==!)
boolean آنا_وآنا_متطابقتان = اسم1.equals(اسم2);
System.out.println("هل الاسم1 والاسم2 متطابقان؟ " + آنا_وآنا_متطابقتان); // true
boolean آنا_وفانيا_متطابقتان = اسم1.equals(اسم3);
System.out.println("هل الاسم1 والاسم3 متطابقان؟ " + آنا_وفانيا_متطابقتان); // false
// نقارن بدون مراعاة حالة الأحرف (أحرف كبيرة/صغيرة)
String اسم4 = "آنا";
boolean بدون_مراعاة_الحالة = اسم1.equalsIgnoreCase(اسم4);
System.out.println("آنا وآنا (بدون مراعاة الحالة)؟ " + بدون_مراعاة_الحالة); // true
// لكن لا يجب فعل هذا (سنشرح لماذا في الأخطاء)
boolean مقارنة_خطيرة = (اسم1 == اسم2);
System.out.println("عبر ==: " + مقارنة_خطيرة); // قد تطبع true، لكن هذا صدفة!
الشرح: في Java، السلاسل النصية ليست أرقامًا بسيطة، بل كائنات معقدة. العامل == يتحقق مما إذا كانت السلاسل موجودة في نفس المكان في الذاكرة، وليس مما إذا كان نصها متطابقًا. لذلك، لمقارنة النصوص، نستخدم الطريقة .equals(). إذا أردت المقارنة دون مراعاة الأحرف الكبيرة/الصغيرة (مثل "آنا" و"آنا")، استخدم .equalsIgnoreCase(). في Python، بالمناسبة، يمكن استخدام == مع السلاسل النصية - فهي تعمل بشكل صحيح هناك. لكن في Java - تذكر: السلاسل النصية فقط عبر equals!
مثال 3: العوامل المنطقية - "و" (&&)، "أو" (||)، "ليس" (!)
int درجة_الحرارة = 25;
boolean مشمس = true;
boolean هناك_رياح = false;
// نتحقق من شرط معقد: "الذهاب للتنزه إذا كان الجو دافئًا ومشمسًا"
boolean يمكن_التنزه = (درجة_الحرارة > 20) && مشمس;
System.out.println("هل يمكن التنزه؟ " + يمكن_التنزه); // true (25 > 20 ومشمس = true)
// نتحقق من: "أخذ سترة إذا كان الجو باردًا أو عاصفًا"
boolean أخذ_سترة = (درجة_الحرارة < 15) || هناك_رياح;
System.out.println("هل نأخذ سترة؟ " + أخذ_سترة); // false (ليس باردًا وليس عاصفًا)
// نستخدم "ليس": "إذا لم يكن الجو ممطرًا، نذهب للتنزه"
boolean الجو_ممطر = false;
boolean ليس_ممطرًا = !الجو_ممطر; // ! يحول false -> true
System.out.println("هل الجو غير ممطر؟ " + ليس_ممطرًا); // true
// مثال معقد: "البقاء في المنزل إذا كان الجو باردًا و(ممطرًا أو عاصفًا)"
int درجة_الحرارة2 = 10;
boolean مطر = true;
boolean رياح = false;
boolean البقاء_في_المنزل = (درجة_الحرارة2 < 15) && (مطر || رياح);
System.out.println("هل نبقى في المنزل؟ " + البقاء_في_المنزل); // true (بارد ومطر)
الشرح: تعمل العوامل المنطقية كما في الرياضيات والحياة. && (و) يعطي true فقط إذا كان كلا الشرطين true. || (أو) يعطي true إذا كان شرط واحد على الأقل true. ! (ليس) يعكس القيمة: true يصبح false، false يصبح true. في Python، نفس الشيء، لكن يُكتب بالكلمات: and, or, not. في Java، تُستخدم الرموز، لكن المعنى هو نفسه تمامًا. تساعد الأقواس في تحديد الترتيب: أولاً، يتم حساب ما بداخل الأقواس، ثم الباقي.
مثال 4: الاستخدام في if-else (قرارات حقيقية)
int نقاط = 85;
int درجة_النجاح = 70;
if (نقاط >= درجة_النجاح) {
System.out.println("لقد نجحت! مبروك!");
} else {
System.out.println("حاول مرة أخرى.");
}