عند مقارنة ثلاثة أعداد في Java، قد يعمل الحل على أعداد مختلفة ثم يفشل عند تساوي قيمتين. نريد إظهار العدد الأصغر نفسه، وليس اشتراط أن يكون فريدًا. يوضح هذا الدرس سبب الخطأ في المقارنة الصارمة وكيف نصححه باستخدام <=، مع كود كامل يقبل الأعداد السالبة والمتساوية.
أين يفشل الكود القديم؟
إذا استخدمت a < b && a < c ثم شرطًا مماثلًا للعدد الثاني، فإن تساوي العددين الأول والثاني قد يجعل الشرطين غير متحققين. عند إدخال 2 و2 و5 ينتقل البرنامج إلى الفرع الأخير ويختار 5، مع أن النتيجة الصحيحة هي 2. سبب الخطأ هو استبعاد المساواة، وليس ترتيب قراءة الأرقام أو نوع Scanner.
الكود المصحح مع معالجة تساوي القيم
احفظ المثال باسم SmallestOfThree.java ثم ترجمه وشغله بالأمرين javac SmallestOfThree.java وjava SmallestOfThree. أدخل ثلاثة أعداد صحيحة مفصولة بمسافات أو أسطر. يتحقق البرنامج من كل إدخال قبل استعماله، ويعرض رسالة إذا خرج العدد عن مجال int أو لم يكن عددًا صحيحًا.
import java.util.Scanner;
public class SmallestOfThree {
public static void main(String[] args) {
try (Scanner input = new Scanner(System.in)) {
int[] values = new int[3];
System.out.println("Enter three integers:");
for (int i = 0; i < values.length; i++) {
if (!input.hasNextInt()) {
System.out.println("Invalid integer input.");
return;
}
values[i] = input.nextInt();
}
int a = values[0], b = values[1], c = values[2];
int result;
if (a <= b && a <= c) {
result = a;
} else if (b <= a && b <= c) {
result = b;
} else {
result = c;
}
System.out.println("Result: " + result);
}
}
}شرح منطق القرار
يكفي أن تكون القيمة الأولى الأصغر أو مساوية للقيمتين الأخريين لاختيارها. لذلك جمعنا مقارنتين بالمعامل &&؛ يجب أن تنجحا معًا. إذا لم تكن القيمة الأولى مناسبة، نفحص الثانية. وعندما يفشل الشرطان السابقان نختار الثالثة. إن تساوت الأعداد الثلاثة نختار الأولى، وتبقى القيمة الناتجة صحيحة لأن المسألة تطلب العدد، لا موضعه في القائمة.
قراءة الأعداد في مصفوفة صغيرة هنا تمنع تكرار التحقق ثلاث مرات، ثم نستخدم أسماء a وb وc لتوضيح المقارنة. لا نرتب المصفوفة ولا نغير ترتيب المدخلات؛ نبحث عن قيمة واحدة فقط. وإذا احتجت إلى ترتيب الثلاثة من الأصغر إلى الأكبر فذلك تمرين مختلف، ويمكن تنفيذه بعمليات تبديل أو باستخدام فرز المصفوفة.
حالات اختبار يجب تجربتها
| الإدخال | النتيجة |
|---|---|
| 2 2 5 | 2 |
| 5 2 2 | 2 |
| -3 -7 -1 | -7 |
| 4 4 4 | 4 |
بديل مختصر باستخدام Math.min
int result = Math.min(a, Math.min(b, c));هذا السطر بديل لكتلة الشروط بعد قراءة الأعداد. تعيد المقارنة الداخلية الأصغر بين b وc، ثم تقارنه بالقيمة a. يصلح هذا الاختصار عندما تريد وضوح النتيجة في برنامج عملي، بينما يساعد الحل بالشروط على تعلم المقارنة وتصحيح حالات التساوي. لا حاجة إلى استيراد Math لأنه ضمن java.lang.
أخطاء أخرى ينبغي تجنبها
لا تحذف import الخاص بـScanner، ولا تضف أقواس إغلاق زائدة بعد نهاية الكلاس. استخدم ملفًا باسم الكلاس نفسه، وتجنب وضع المثال داخل main أخرى. ولا تستعمل الصفر كقيمة أولية مرجعية لجميع المسائل؛ فذلك قد يعطي نتيجة خاطئة عندما تكون المدخلات كلها سالبة أو كلها موجبة بحسب نوع المقارنة. اختبر الأعداد المتساوية والمختلفة والسالبة، ثم بدّل مواقعها لتتأكد أن النتيجة لا تعتمد على موضع الإدخال.





