الكلية الجامعية للعلوم التطبيقيةبرمجة 1
English
المحاضرة 7 · 100 دقيقة

الشروط: برامج تختار

كيف يقرر البرنامج ما يفعله بناءً على القيم التي بين يديه؟

في نهاية هذه المحاضرة ستكون قادرًا على

  1. تكتب شروطًا باستخدام عوامل المقارنة، وتميّز بين = و==
  2. تستخدم if وif-else لتنفيذ جزء من البرنامج دون آخر
  3. تشرح دور الأقواس { }، وتكتشف فخ الفاصلة المنقوطة بعد الشرط
  4. تجمع الشروط بالعوامل && و|| و!، وتستفيد من التقييم المختصر
  5. تفحص مدى من القيم بالطريقة الصحيحة، وتقارن النصوص باستخدام equals
محتويات المحاضرة
  1. البرامج تختار كما تختار أنت كل يوم
  2. الشرط سؤال جوابه true أو false
  3. الأمر if ينفّذ كتلة فقط إذا كان الشرط true
  4. العلامة = تخزّن قيمة، والعلامة == تطرح سؤالًا
  5. الأمر if-else ينفّذ أحد فرعين دائمًا، ولا ينفّذهما معًا
  6. الأقواس هي التي تحدد ما يتبع الشرط، وليست الإزاحة
  7. الفاصلة المنقوطة بعد الشرط تجعل الكتلة تُنفَّذ دائمًا
  8. العوامل && و|| و! تصنع من الشروط شرطًا واحدًا
  9. تُنفَّذ ! أولًا، ثم &&، ثم ||، والأقواس تغيّر هذا الترتيب
  10. تتوقف Java عن الحساب فور معرفة النتيجة، وهذا يحمينا من القسمة على صفر
  11. فحص المدى يحتاج إلى مقارنتين يصل بينهما &&
  12. تُقارَن النصوص بالدالة equals، وليس بالعامل ==
  13. الأكبر من عددين: احفظ إجابتك في متغير ثم صحّحها إذا لزم
  14. التمرين النهائي: برنامج يجمع كل ما تعلمناه
  15. أسئلة المراجعة
الجزء الأول: الشرط و if

البرامج تختار كما تختار أنت كل يوم

كانت برامجنا حتى الآن تنفّذ كل سطر من الأعلى إلى الأسفل، مهما كانت القيم. لكن البرامج الحقيقية تنظر إلى القيم أولًا، ثم تقرر.

الموقفالسؤالإذا كانت الإجابة نعمإذا كانت الإجابة لا
الصرّاف الآليهل الرصيد كافٍ؟يسلّمك الماليعرض رسالة رفض
فتح الهاتفهل الرمز صحيح؟يفتح الشاشةيطلب الرمز مرة أخرى
نتيجة الامتحانهل العلامة 60 أو أكثر؟ناجحراسب

الشرط سؤال جوابه true أو false

تعطي عوامل المقارنة قيمة من نوع boolean، وهو نوع له قيمتان فقط: true وfalse. ويمكنك طباعة هذه القيمة أو تخزينها في متغير مثل أي قيمة أخرى.

العاملالمعنىمثالالنتيجة
==يساوي5 == 5true
!=لا يساوي5 != 5false
>أكبر من7 > 3true
<أصغر من7 < 3false
>=أكبر من أو يساوي3 >= 3true
<=أصغر من أو يساوي4 <= 3false

اسأل Java ستة أسئلة

توقّع كل سطر قبل التشغيل. ثم غيّر age إلى 18 وتوقّع مرة أخرى.

public class Comparisons {
    public static void main(String[] args) {
        int age = 19;
        System.out.println(age > 18);
        System.out.println(age < 18);
        System.out.println(age >= 19);
        System.out.println(age <= 18);
        System.out.println(age == 19);
        System.out.println(age != 19);

        boolean adult = age >= 18;
        System.out.println(adult);
    }
}
الناتج
true
false
true
false
true
false
true

الحساب يأتي قبل المقارنة. ماذا يطبع؟

public class MathFirst {
    public static void main(String[] args) {
        int a = 7;
        int b = 10;
        System.out.println(a + 3 == b);
        System.out.println(a % 2 == 0);
        System.out.println(a * 2 > b);
    }
}
أظهر الناتج
الناتج
true
false
true

لماذا؟ تحسب Java طرفي المقارنة أولًا: 10 تساوي 10، والباقي 1 لا يساوي 0، و14 أكبر من 10.

كيف تكتب في Java «x لا يساوي صفرًا»؟

الأمر if ينفّذ كتلة فقط إذا كان الشرط true

if (condition) {
    // runs only when the condition is true
}
// the program always continues here
الشرط بين قوسين دائمًا، والأسطر التابعة له بين { }.

شاهد البرنامج يتخطى سطرًا

اضغط «تتبّع سطرًا سطرًا» وراقب أي سطر يتوقف عنده البرنامج. ثم غيّر temperature إلى 36 وتتبّعه من جديد: أي سطر اختفى من الرحلة؟

public class Temperature {
    public static void main(String[] args) {
        int temperature = 38;
        if (temperature > 37) {
            System.out.println("Fever: see a doctor");
        }
        System.out.println("Check finished");
    }
}
الناتج
Fever: see a doctor
Check finished

الرصيد 40 والسعر 50. ماذا يطبع البرنامج؟

public class Shop {
    public static void main(String[] args) {
        int balance = 40;
        int price = 50;
        if (balance >= price) {
            System.out.println("Bought");
            balance -= price;
        }
        System.out.println("Balance: " + balance);
    }
}
أظهر الناتج
الناتج
Balance: 40

لماذا؟ الشرط false، فتخطى البرنامج الكتلة كلها: لم تحدث الطباعة ولا الطرح. أما السطر الأخير فخارج الكتلة، فينفَّذ دائمًا.

العلامة = تخزّن قيمة، والعلامة == تطرح سؤالًا

الإسناد

يضع القيمة 5 في الصندوق x.

x = 5;
المقارنة

يسأل: هل قيمة x تساوي 5؟ والجواب true أو false.

x == 5

علامة واحدة ناقصة

أصلح الشرط حتى يطبع البرنامج x is five.

public class CheckFive {
    public static void main(String[] args) {
        int x = 5;
        if (x = 5) {
            System.out.println("x is five");
        }
    }
}
رسالة المترجمincompatible types: int cannot be converted to boolean
أظهر التصحيح
public class CheckFive {
    public static void main(String[] args) {
        int x = 5;
        if (x == 5) {
            System.out.println("x is five");
        }
    }
}
الناتج
x is five

لماذا؟ ناتج x = 5 هو القيمة 5، وهي int، بينما يطلب if قيمة boolean. تتحدث الرسالة عن الأنواع ولا تذكر العلامة الناقصة، فتذكّر هذا النمط حين تراها داخل شرط.

هنا يصمت المترجم. ماذا يطبع البرنامج؟

public class Finished {
    public static void main(String[] args) {
        boolean finished = false;
        if (finished = true) {
            System.out.println("Done");
        }
        System.out.println(finished);
    }
}
أظهر الناتج
الناتج
Done
true

لماذا؟ الشرط إسناد: يضع true في finished، وناتجه true من النوع boolean، فيقبله المترجم. ولهذا اكتب مع المتغيرات المنطقية if (finished) فقط، فلا تقع في هذا الخطأ.

الأمر if-else ينفّذ أحد فرعين دائمًا، ولا ينفّذهما معًا

ناجح أم راسب؟

شغّل البرنامج ثلاث مرات وأدخل 59 ثم 60 ثم 61، فالقيم عند الحد هي التي تكشف الأخطاء. ثم اضغط «تتبّع سطرًا سطرًا» لترى الفرع الذي ينفَّذ. لاحظ أننا استخدمنا ثابتًا لعلامة النجاح.

import java.util.Scanner;

public class PassFail {
    public static void main(String[] args) {
        final int PASS_MARK = 60;
        Scanner input = new Scanner(System.in);
        System.out.print("Mark: ");
        int mark = input.nextInt();

        if (mark >= PASS_MARK) {
            System.out.println("Pass");
        } else {
            System.out.println("Fail");
        }
        System.out.println("Done");
    }
}

يغيّر الفرع الأول قيمة x. هل يعود البرنامج لفحص الشرط؟

public class OneBranch {
    public static void main(String[] args) {
        int x = 10;
        if (x > 5) {
            x = x - 8;
        } else {
            x = x + 8;
        }
        System.out.println(x);
    }
}
أظهر الناتج
الناتج
2

لماذا؟ يُفحص الشرط مرة واحدة فقط قبل الدخول إلى الفرع. صحيح أن x أصبحت 2، لكن البرنامج لا يعود إلى الشرط، ويتجاوز else كله.

زوجي أم فردي؟

اقرأ عددًا صحيحًا واحدًا، ثم اطبع Even إذا كان زوجيًا وOdd إذا كان فرديًا. لا تطبع أي رسالة تطلب الإدخال.

import java.util.Scanner;

public class EvenOdd {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // Read the number, then decide

    }
}
stdin
4
الناتج المتوقع
Even
تلميح 1

العدد الزوجي باقي قسمته على 2 يساوي صفرًا: n % 2 == 0.

تلميح 2

لا تكتب n % 2 == 1: فناتج -3 % 2 في Java هو -1، فيخطئ شرطك مع الأعداد السالبة.

الحل
import java.util.Scanner;

public class EvenOdd {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        if (n % 2 == 0) {
            System.out.println("Even");
        } else {
            System.out.println("Odd");
        }
    }
}

الأقواس هي التي تحدد ما يتبع الشرط، وليست الإزاحة

السطران يبدوان تابعين للشرط، فهل هما كذلك؟

public class NoBraces {
    public static void main(String[] args) {
        int mark = 40;
        if (mark >= 60)
            System.out.println("Passed");
            System.out.println("Well done");
        System.out.println("End");
    }
}
أظهر الناتج
الناتج
Well done
End

لماذا؟ دون أقواس، يتبع الشرط أمر واحد فقط هو الأمر الذي يليه. والمترجم يتجاهل الإزاحة تمامًا، فهي للقارئ وحده. لذلك يُطبع Well done حتى للراسب.

أين ذهب if؟

يريد البرنامج طباعة سطرين عند النجاح. أضف ما ينقصه.

public class TwoLines {
    public static void main(String[] args) {
        int mark = 75;
        if (mark >= 60)
            System.out.println("Passed");
            System.out.println("Well done");
        else
            System.out.println("Failed");
    }
}
رسالة المترجم'else' without 'if'
أظهر التصحيح
public class TwoLines {
    public static void main(String[] args) {
        int mark = 75;
        if (mark >= 60) {
            System.out.println("Passed");
            System.out.println("Well done");
        } else {
            System.out.println("Failed");
        }
    }
}
الناتج
Passed
Well done

لماذا؟ انتهى if عند السطر الأول بعده، فصار السطر الثاني أمرًا عاديًا، ولم يجد else شرطًا يتبعه. تشير الرسالة إلى else، مع أن السبب هو الأقواس الناقصة قبله.

متغير يختفي مع نهاية الكتلة

صرّح عن result في مكان يبقى فيه معروفًا حتى سطر الطباعة.

public class BlockScope {
    public static void main(String[] args) {
        int mark = 75;
        if (mark >= 60) {
            String result = "Pass";
        } else {
            String result = "Fail";
        }
        System.out.println(result);
    }
}
رسالة المترجمcannot find symbol
أظهر التصحيح
public class BlockScope {
    public static void main(String[] args) {
        int mark = 75;
        String result;
        if (mark >= 60) {
            result = "Pass";
        } else {
            result = "Fail";
        }
        System.out.println(result);
    }
}
الناتج
Pass

لماذا؟ المتغير المصرَّح عنه داخل { } يعيش داخلها فقط. فصرّح عنه قبل الكتلة إذا احتجت إليه بعدها.

الفاصلة المنقوطة بعد الشرط تجعل الكتلة تُنفَّذ دائمًا

قيمة x هي 3، فما الناتج؟ انظر جيدًا إلى نهاية سطر if.

public class Semicolon {
    public static void main(String[] args) {
        int x = 3;
        if (x > 5);
        {
            System.out.println("x is big");
        }
        System.out.println("End");
    }
}
أظهر الناتج
الناتج
x is big
End

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

شاهد الفخ بعينيك

اضغط «تتبّع سطرًا سطرًا»: الشرط false لكن البرنامج يدخل الكتلة مع ذلك. ثم احذف الفاصلة المنقوطة بعد الشرط وتتبّعه مرة أخرى.

public class VotingAge {
    public static void main(String[] args) {
        int age = 15;
        if (age >= 18); {
            System.out.println("You may vote");
        }
    }
}
الناتج
You may vote

الخطأ نفسه، لكن المترجم يراه الآن

وجود else يكشف الفخ. أصلح السطر حتى يطبع البرنامج Small.

public class BigSmall {
    public static void main(String[] args) {
        int x = 3;
        if (x > 5); {
            System.out.println("Big");
        } else {
            System.out.println("Small");
        }
    }
}
رسالة المترجم'else' without 'if'
أظهر التصحيح
public class BigSmall {
    public static void main(String[] args) {
        int x = 3;
        if (x > 5) {
            System.out.println("Big");
        } else {
            System.out.println("Small");
        }
    }
}
الناتج
Small

لماذا؟ انتهى if عند الفاصلة المنقوطة، ثم جاءت كتلة مستقلة، فلم يجد else شرطًا يتصل به. فإذا رأيت هذه الرسالة، فافحص نهاية سطر if أولًا.

الجزء الثاني: دمج الشروط

العوامل && و|| و! تصنع من الشروط شرطًا واحدًا

&& (و)

صحيح فقط إذا تحقق الطرفان معًا.

hasId && paidFees
|| (أو)

صحيح إذا تحقق طرف واحد على الأقل.

isHoliday || isWeekend
! (ليس)

يقلب القيمة: true تصبح false، والعكس.

!paidFees
aba && ba || b!a
truetruetruetruefalse
truefalsefalsetruefalse
falsetruefalsetruetrue
falsefalsefalsefalsetrue

جدول الصواب بيديك

غيّر قيمتي hasId وpaidFees إلى كل الحالات الأربع، وتوقّع النتائج الثلاث قبل كل تشغيل، ثم قارنها بالجدول.

public class LogicTable {
    public static void main(String[] args) {
        boolean hasId = true;
        boolean paidFees = false;
        System.out.println(hasId && paidFees);
        System.out.println(hasId || paidFees);
        System.out.println(!paidFees);
    }
}
الناتج
false
true
true

شرطان في if واحد

يدخل الطالب المكتبة إذا كان معه بطاقة ولم يكن عليه كتب متأخرة. غيّر lateBooks إلى 2 وتوقّع الناتج. ثم استخدم «تتبّع سطرًا سطرًا» لترى الفرع الذي ينفَّذ.

public class Library {
    public static void main(String[] args) {
        boolean hasCard = true;
        int lateBooks = 0;
        if (hasCard && lateBooks == 0) {
            System.out.println("Welcome");
        } else {
            System.out.println("Please see the librarian");
        }
    }
}
الناتج
Welcome

تُنفَّذ ! أولًا، ثم &&، ثم ||، والأقواس تغيّر هذا الترتيب

السطران الأولان يختلفان في الأقواس فقط. ماذا يطبع البرنامج؟

public class LogicOrder {
    public static void main(String[] args) {
        boolean a = true;
        boolean b = false;
        boolean c = false;
        System.out.println(a || b && c);
        System.out.println((a || b) && c);
        System.out.println(!a || b);
    }
}
أظهر الناتج
الناتج
true
false
false

لماذا؟ في الأول تسبق && العامل ||، فنحسب b && c أولًا وناتجها false، ثم true || false أي true. والأقواس في الثاني تفرض || أولًا فتصبح true && false. وفي الثالث يُقلب a أولًا: false || false.

«يساوي 6 أو 7» كما نقولها

نقولها هكذا بالكلام، لكن Java تريد شرطًا كاملًا على كل طرف من طرفي ||.

public class Weekend {
    public static void main(String[] args) {
        int day = 7;
        if (day == 6 || 7) {
            System.out.println("Weekend");
        }
    }
}
رسالة المترجمbad operand types for binary operator '||'
أظهر التصحيح
public class Weekend {
    public static void main(String[] args) {
        int day = 7;
        if (day == 6 || day == 7) {
            System.out.println("Weekend");
        }
    }
}
الناتج
Weekend

لماذا؟ الطرف الأيمن هنا هو العدد 7 وحده، وهو ليس boolean، والعامل || لا يقبل إلا قيمًا منطقية. لهذا تذكر الرسالة أنواع الطرفين.

أي شرط يعني الشيء نفسه مثل !(x > 5)؟

تتوقف Java عن الحساب فور معرفة النتيجة، وهذا يحمينا من القسمة على صفر

التعبيرالطرف الأيسرهل يُحسب الطرف الأيمن؟السبب
a && bfalseلاالنتيجة false مهما كان الطرف الأيمن
a && btrueنعمالنتيجة تعتمد عليه
a || btrueلاالنتيجة true مهما كان الطرف الأيمن
a || bfalseنعمالنتيجة تعتمد عليه

الحارس قبل القسمة

شغّل البرنامج وهو يعمل بأمان. ثم بدّل طرفي && ليصبح الشرط total / students > 10 && students != 0 وشغّله من جديد: سينهار البرنامج باستثناء ArithmeticException: / by zero، لأن القسمة حدثت قبل الفحص.

public class GuardDivision {
    public static void main(String[] args) {
        int total = 90;
        int students = 0;
        if (students != 0 && total / students > 10) {
            System.out.println("High average");
        } else {
            System.out.println("No high average");
        }
    }
}
الناتج
No high average

العدد count صفر، وفي الشرط قسمة عليه. ماذا يحدث؟

public class OrGuard {
    public static void main(String[] args) {
        int count = 0;
        if (count == 0 || 10 / count > 1) {
            System.out.println("Safe");
        }
        System.out.println("End");
    }
}
أظهر الناتج
الناتج
Safe
End

لماذا؟ الطرف الأيسر true، وهذا يكفي لتكون نتيجة || هي true، فلا تُحسب القسمة أبدًا.

أي شرط آمن عندما تكون n صفرًا؟

فحص المدى يحتاج إلى مقارنتين يصل بينهما &&

الرياضيات ليست Java

نكتب في الرياضيات 60 ≤ x ≤ 100. أصلح الشرط بطريقة Java.

public class RangeCheck {
    public static void main(String[] args) {
        int mark = 75;
        if (60 <= mark <= 100) {
            System.out.println("Passing mark");
        }
    }
}
رسالة المترجمbad operand types for binary operator '<='
أظهر التصحيح
public class RangeCheck {
    public static void main(String[] args) {
        int mark = 75;
        if (mark >= 60 && mark <= 100) {
            System.out.println("Passing mark");
        }
    }
}
الناتج
Passing mark

لماذا؟ تحسب Java من اليسار: ناتج 60 <= mark هو true، ثم تحاول حساب true <= 100، ولا معنى لمقارنة قيمة منطقية بعدد. لذلك تذكر الرسالة الأنواع boolean وint.

العلامة 150، والمبرمج استخدم || بدلًا من &&. ماذا يطبع؟

public class WrongRange {
    public static void main(String[] args) {
        int mark = 150;
        if (mark >= 0 || mark <= 100) {
            System.out.println("Valid");
        } else {
            System.out.println("Invalid");
        }
    }
}
أظهر الناتج
الناتج
Valid

لماذا؟ كل عدد إما أكبر من أو يساوي 0، وإما أصغر من أو يساوي 100، فهذا الشرط true دائمًا. جرّب تعويض قيم على الحدود وخارجها كلما كتبت شرطًا لمدى.

عمر صالح

اقرأ عمرًا صحيحًا. اطبع Valid age إذا كان من 0 إلى 120 شاملًا الطرفين، وإلا فاطبع Invalid age. لا تطبع أي رسالة تطلب الإدخال.

import java.util.Scanner;

public class ValidAge {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // Read the age, then check the range

    }
}
stdin
19
الناتج المتوقع
Valid age
تلميح 1

«شاملًا الطرفين» تعني >= و<=، وليس > و<.

تلميح 2

استخدم &&: يجب أن يتحقق الحدان معًا.

الحل
import java.util.Scanner;

public class ValidAge {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int age = input.nextInt();
        if (age >= 0 && age <= 120) {
            System.out.println("Valid age");
        } else {
            System.out.println("Invalid age");
        }
    }
}
الجزء الثالث: النصوص وبرامج كاملة

تُقارَن النصوص بالدالة equals، وليس بالعامل ==

== مع النصوص

يسأل: هل هذان المتغيران يشيران إلى الكائن نفسه في الذاكرة؟

answer == "yes"
equals

يسأل: هل الحروف في النصين هي نفسها؟ وهذا ما تريده دائمًا تقريبًا.

answer.equals("yes")

نص من لوحة المفاتيح

أعطينا البرنامج الكلمة yes مدخلًا. يطبع == القيمة false مع أن الحروف متطابقة، لأن Scanner صنع نصًا جديدًا في مكان آخر من الذاكرة.

import java.util.Scanner;

public class CompareInput {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String answer = input.next();
        System.out.println(answer == "yes");
        System.out.println(answer.equals("yes"));
    }
}
الناتج
false
true

ثلاث مقارنات لنصوص حروفها واحدة. ماذا يطبع البرنامج؟

public class StringCompare {
    public static void main(String[] args) {
        String a = "java";
        String b = "java";
        String c = new String("java");
        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(a.equals(c));
    }
}
أظهر الناتج
الناتج
true
false
true

لماذا؟ تجعل Java النصين الحرفيين المتطابقين كائنًا واحدًا، فيعطي a == b القيمة true، وأما new فتصنع كائنًا جديدًا. ولهذا يبدو == صحيحًا في برامج التجربة، ثم يخطئ حين يأتي النص من المستخدم. لذلك استخدم equals دائمًا.

حالة الأحرف مهمة

أدخل المستخدم YES. لاحظ الفرق بين equals وequalsIgnoreCase، ثم استخدم ! لتطبع Not yes عندما لا يتطابق النصان.

import java.util.Scanner;

public class IgnoreCase {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String answer = input.next();
        System.out.println(answer.equals("yes"));
        System.out.println(answer.equalsIgnoreCase("yes"));
    }
}
الناتج
false
true

كلمة المرور

اقرأ كلمة واحدة باستخدام next. اطبع Welcome إذا كانت تساوي java123 تمامًا، وإلا فاطبع Wrong password. لا تطبع أي رسالة تطلب الإدخال.

import java.util.Scanner;

public class SecretWord {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // Read the word, then compare it

    }
}
stdin
java123
الناتج المتوقع
Welcome
تلميح 1

إذا فشل الاختبار الأول فقط، فأنت تستخدم == على الأرجح.

تلميح 2

password.equals("java123") تعطي قيمة boolean تضعها داخل if مباشرة.

الحل
import java.util.Scanner;

public class SecretWord {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String password = input.next();
        if (password.equals("java123")) {
            System.out.println("Welcome");
        } else {
            System.out.println("Wrong password");
        }
    }
}

الأكبر من عددين: احفظ إجابتك في متغير ثم صحّحها إذا لزم

تتبّع المتغير max

اضغط «تتبّع سطرًا سطرًا» وراقب الصندوق max. ثم بدّل قيمتي a وb: هل يبقى الناتج صحيحًا؟ وهل ينفَّذ الفرع هذه المرة؟

public class Largest {
    public static void main(String[] args) {
        int a = 12;
        int b = 30;
        int max = a;
        if (b > max) {
            max = b;
        }
        System.out.println("Largest: " + max);
    }
}
الناتج
Largest: 30

الأكبر من عددين

اقرأ عددين صحيحين، ثم اطبع الأكبر بينهما وحده. إذا تساويا فاطبع أيًا منهما. لا تطبع أي رسالة تطلب الإدخال.

import java.util.Scanner;

public class LargestOfTwo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // Read two numbers and print the larger

    }
}
stdin
3
8
الناتج المتوقع
8
تلميح 1

لا تستخدم max = 0 قيمة ابتدائية، وإلا فشل برنامجك مع الأعداد السالبة.

تلميح 2

ابدأ بـ int max = a; ثم استخدم if واحدًا.

الحل
import java.util.Scanner;

public class LargestOfTwo {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int a = input.nextInt();
        int b = input.nextInt();
        int max = a;
        if (b > max) {
            max = b;
        }
        System.out.println(max);
    }
}

التمرين النهائي: برنامج يجمع كل ما تعلمناه

هل يدخل الطالب الامتحان؟

اقرأ نسبة الحضور عددًا صحيحًا، ثم كلمة yes أو no تبيّن هل دفع الطالب الرسوم. اطبع Allowed إذا كان الحضور 75 أو أكثر وكانت الكلمة yes، وإلا فاطبع Not allowed. لا تطبع أي رسالة تطلب الإدخال.

import java.util.Scanner;

public class ExamEntry {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        // Read the attendance with nextInt and the word with next

    }
}
stdin
90
yes
الناتج المتوقع
Allowed
تلميح 1

تحتاج إلى && يجمع مقارنة عددية وequals.

تلميح 2

الشرط كاملًا: attendance >= 75 && paid.equals("yes").

الحل
import java.util.Scanner;

public class ExamEntry {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int attendance = input.nextInt();
        String paid = input.next();
        if (attendance >= 75 && paid.equals("yes")) {
            System.out.println("Allowed");
        } else {
            System.out.println("Not allowed");
        }
    }
}

أسئلة المراجعة

ما الفرق بين x = 5 وx == 5؟

كيف تفحص أن x بين 1 و10 شاملًا الطرفين؟

أي شرط يفحص أن النص name ليس Ali؟

تتبّع الشروط بدقة: ماذا يطبع البرنامج؟

public class ReviewCombo {
    public static void main(String[] args) {
        int x = 8;
        if (x > 5 && x % 2 == 1) {
            System.out.println("A");
        } else {
            System.out.println("B");
        }
        if (x > 10 || !(x == 3)) {
            System.out.println("C");
        }
        System.out.println("D");
    }
}
أظهر الناتج
الناتج
B
C
D

لماذا؟ 8 زوجي، فالشرط الأول false ويُطبع B. وفي الثاني x > 10 غير صحيح، لكن x ليست 3، فيكفي هذا لتحقق || ويُطبع C. أما D فخارج كل الكتل.