JavaRush /مدونة جافا /Random-AR /المتفرعة في جاوة

المتفرعة في جاوة

نشرت في المجموعة
في هذه المقالة سوف نتناول مفهوم التفرع في برامج الكمبيوتر بشكل عام وتلك المكتوبة بلغة جافا. دعونا نتحدث عن هياكل التحكم مثل:
  • if-then(أو if)
  • if-then-else(أو if-else)
  • switch-case
التفرع في جافا - 1

المتفرعة

لنبدأ بالمفاهيم الأساسية. أي برنامج هو عبارة عن مجموعة من الأوامر التي ينفذها جهاز الكمبيوتر. في أغلب الأحيان، يتم تنفيذ الأوامر بالتتابع، واحدًا تلو الآخر. في كثير من الأحيان (ولكن لا يزال في كثير من الأحيان) تنشأ المواقف عندما تحتاج إلى تغيير التدفق المتسلسل لأوامر البرنامج. في بعض الأحيان، وفقًا لشروط معينة، قد يكون من الضروري تنفيذ مجموعة واحدة من الأوامر بدلاً من أخرى. وعندما تتغير هذه الظروف، افعل العكس. على سبيل المثال، هناك عدد من المواقع المحظورة على الأشخاص الذين تقل أعمارهم عن 18 عامًا زيارتها. عادة، عند زيارة هذا المورد لأول مرة، يتم الترحيب بالمستخدم بشكل ما يتم من خلاله تحذير المستخدم بشأن الحد الأدنى للعمر ويطلب منه إدخال تاريخ ميلاده. وبعد ذلك، اعتمادًا على البيانات التي أدخلها المستخدم، سيتم السماح له بإدخال المورد أم لا. يتم توفير هذه الوظيفة من خلال ما يسمى عادةً بالتفرع. دعونا نعطي تشبيه آخر. دعونا نتخيل أنفسنا على مفترق طرق سبعة طرق. أمامنا خيار: الانعطاف إلى اليسار أو اليمين، أو السير بشكل مستقيم. يعتمد اختيارنا على شروط معينة. كما أننا لا تتاح لنا الفرصة لسلوك عدة طرق في نفس الوقت. أولئك. اعتمادًا على بعض الظروف، سيتعين علينا اختيار طريق واحد. وينطبق نفس المبدأ على المتفرعة. الآن دعونا نحاول إعطاء تعريف للتفرع. التفرع هو تصميم خوارزمي يتم فيه، اعتمادًا على حقيقة بعض الشروط، تنفيذ واحدة من عدة تسلسلات من الإجراءات. يتم تنفيذ التفرع (على الأرجح) في جميع لغات البرمجة على الإطلاق. تحتوي لغة برمجة Java على العديد من بنيات التحكم المزعومة التي تسمح لك بتنفيذ التفرع في برنامجك. هناك 3 مثل هذه الإنشاءات في لغة البرمجة:
  • المشغل أو العاملif-then
  • المشغل أو العاملif-then-else
  • مشغل ثلاثي? :
في هذه المقالة سوف نلقي نظرة على عوامل التشغيل if-elseو switch-case.

اذا ثم

المشغل if-then، أو ربما ifالمشغل الأكثر شيوعًا. أصبحت عبارة "نعم، اكتب 1 إذا" شائعة بالفعل. المشغل ifلديه الهيكل التالي:
if (bool_condition) {
	statement
}
في هذا التصميم:
  • bool_conditionهو تعبير منطقي يتم تقييمه إلى صواب أو خطأ. ويسمى هذا التعبير شرطا.
  • statement— أمر (قد يكون هناك أكثر من أمر) يجب تنفيذه إذا كان الشرط صحيحًا ( bool_statement==true)
يمكن قراءة هذا البناء على النحو التالي:

Если (bool_condition), то {statement}
وهنا بعض الأمثلة:
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a < 10) {
        System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
    }
}
في هذا البرنامج، يُطلب من المستخدم إدخال النسبة المئوية لشحن البطارية على هاتفه الذكي. إذا بقي أقل من 10 بالمائة من الشحن، فسيقوم البرنامج بتحذير المستخدم بشأن الحاجة إلى شحن الهاتف الذكي. وهذا مثال على أبسط تصميم if. ومن الجدير بالذكر أنه إذا كان المتغير `a` أكبر من أو يساوي 10، فلن يحدث شيء. سيستمر البرنامج في تنفيذ التعليمات البرمجية التي تتبع if. لاحظ أيضًا أنه في هذه الحالة، يكون للبناء ifتسلسل واحد فقط من الإجراءات المطلوب تنفيذه: طباعة النص، أو عدم القيام بأي شيء. هذا هو الاختلاف في التفرع مع "فرع" واحد. وهذا ضروري في بعض الأحيان. على سبيل المثال، عندما نريد حماية أنفسنا من القيم غير الصحيحة. على سبيل المثال، لا يمكننا معرفة عدد الأحرف في سلسلة إذا كانت السلسلة null. الأمثلة أدناه:
public static void main(String[] args) {
    String x = null;
    printStringSize(x);
    printStringSize("Не представляю своей жизни без ветвлений...");
    printStringSize(null);
    printStringSize("Ифы это так захватывающе!");
}

static void printStringSize(String string) {
    if (string != null) {
        System.out.println("Кол-во символов в строке `" + string + "`=" + string.length());
    }
}
نتيجة لتنفيذ الطريقة الرئيسية، سيتم إخراج ما يلي إلى وحدة التحكم:

Количество символов в строке `Не представляю своей жизни без ветвлений...`=43
Количество символов в строке `Ифы это так захватывающе!`=25
وبفضل التحقق من ذلك string != null، تمكنا من تجنب الأخطاء في البرنامج. ولا تفعل شيئا في الحالات التي يكون فيها المتغير stringيساوي null.

إذا-ثم-آخر

إذا كان لدى البرنامج في الحالة المعتادة ifخيار: "افعل شيئًا أو لا تفعل شيئًا"، فعند if-elseاختيار البرنامج يتعلق الأمر بـ "القيام بشيء أو بآخر". يختفي خيار "لا تفعل شيئًا". هناك نوعان أو أكثر من أشكال التنفيذ (أو عدد الفروع) مع هذا النوع من التفرع. دعونا نفكر في الحالة عندما يكون هناك خياران. ثم يكون لهيكل التحكم النموذج التالي:
if (bool_condition) {
	statement1
} else {
	statement2
}
هنا:
  • bool_statementهو تعبير منطقي يتم تقييمه إلى صواب أو خطأ. ويسمى هذا التعبير شرطا.
  • statement1— أمر (قد يكون هناك أكثر من أمر) يجب تنفيذه إذا كان الشرط صحيحًا ( bool_statement==true)
  • statement2- أمر (قد يكون هناك أكثر من أمر) يجب تنفيذه إذا كان الشرط خطأ ( bool_statement==false)
يمكن قراءة هذا البناء على النحو التالي:

Если (bool_condition), то {statement1}
Иначе {statement2}
هنا مثال:
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);

    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a < 10) {
        System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
    } else {
        System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
    }
}
نفس المثال حول مستوى البطارية على الهاتف الذكي. فقط إذا حذر البرنامج في المرة الأخيرة فقط من الحاجة إلى شحن الهاتف الذكي، فلدينا هذه المرة إشعار إضافي. دعونا ننظر إلى هذا if:
if (a < 10) {
    System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
    System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
إذا a < 10كان صحيحًا (مستوى البطارية أقل من 10)، فسيقوم البرنامج بطباعة نص واحد. وإلا، إذا لم يتم استيفاء الشرط a < 10، فسيقوم البرنامج بإخراج نص مختلف تمامًا. لننهي أيضًا مثالنا الثاني، والذي عرضنا فيه عدد الحروف في السطر. آخر مرة لم يُخرج البرنامج أي شيء إذا كانت السلسلة التي تم تمريرها تساوي null. دعونا نصلح هذا عن طريق تحويل العادي ifإلى if-else:
public static void main(String[] args) {
    String x = null;
    printStringSize(x);
    printStringSize("Не представляю своей жизни без ветвлений...");
    printStringSize(null);
    printStringSize("Ифы это так захватывающе!");
}

static void printStringSize(String string) {
    if (string != null) {
        System.out.println("Кол-во символов в строке `" + string + "`=" + string.length());
    } else {
        System.out.println("Ошибка! Переданная строка равна null!");
    }
}
في الطريقة أضفنا كتلة printStringSizeللبناء . الآن، إذا قمنا بتشغيل البرنامج، فلن يخرج إلى وحدة التحكم سطرين، بل 4، على الرغم من أن الإدخال (الطريقة ) يظل كما هو في المرة السابقة. النص الذي سيخرجه البرنامج : ifelsemain

Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
تكون المواقف مقبولة عندما elseلا يتبعها أوامر تنفيذ، بل أوامر أخرى if. ثم يأخذ البناء الشكل التالي:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
} else {
	statementN+1
}
هذا التصميم له عدة شروط:
  • bool_condition1
  • bool_condition2
  • bool_conditionN
عدد هذه الشروط غير محدود. كل شرط له أوامره الخاصة:
  • بيان1
  • بيان2
  • بيانN
يمكن أن يحتوي كل واحد statementعلى سطر واحد أو أكثر من التعليمات البرمجية. يتم التحقق من الشروط واحدا تلو الآخر. بمجرد تحديد الشرط الحقيقي الأول، سيتم تنفيذ سلسلة من الأوامر "المرتبطة" بالشرط الحقيقي. بعد تنفيذ هذه الأوامر، سيخرج البرنامج من الكتلة if، حتى لو كان هناك المزيد من عمليات التحقق المقبلة. سيتم تنفيذ التعبير "statementN+1" في حالة عدم تحقق أي من الشروط المحددة أعلاه. يمكن قراءة هذا البناء على النحو التالي:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Иначе {statementN+1}
السطر الأخير في هذه الحالة اختياري. يمكنك الاستغناء عن آخر وحيد else. وبعد ذلك سوف يأخذ التصميم الشكل التالي :
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
}
وسيكون نصه هكذا:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
وبناء على ذلك، إذا لم يكن أي من الشروط صحيحا، فلن يتم تنفيذ أمر واحد. دعنا ننتقل إلى الأمثلة. دعنا نعود إلى الموقف بمستوى الشحن على الهاتف الذكي. لنكتب برنامجًا لإبلاغ المالك بمزيد من التفاصيل حول مستوى شحن جهازه:
public static void main(String[] args) {
    String alert5 = "Я скоро отключусь, но помни меня бодрым";
    String alert10 = "Я так скучаю по напряжению в моих жилах";
    String alert20 = "Пора вспоминать, где лежит зарядка";
    String alert30 = "Псс, пришло время экономить";
    String alert50 = "Хм, больше половины израсходовали";
    String alert75 = "Всё в порядке, заряда больше половины";
    String alert100 = "Я готов к приключениям, если что..";
    String illegalValue = "Такс, кто-то ввел некорректное meaning";

    Scanner scanner = new Scanner(System.in);
    System.out.print("Сколько процентов заряда батареи осталось на вашем смартфоне?");
    int a = scanner.nextInt();

    if (a <= 0 || a > 100) {
        System.out.println(illegalValue);
    } else if (a < 5) {
        System.out.println(alert5);
    } else if (a < 10) {
        System.out.println(alert10);
    } else if (a < 20) {
        System.out.println(alert20);
    } else if (a < 30) {
        System.out.println(alert30);
    } else if (a < 50) {
        System.out.println(alert50);
    } else if (a < 75) {
        System.out.println(alert75);
    } else if (a <= 100) {
        System.out.println(alert100);
    }
}
على سبيل المثال، في هذه الحالة، إذا أدخل المستخدم الرقم 15، فسيعرض البرنامج على الشاشة: "حان الوقت لتذكر مكان وجود الشاحن". على الرغم من أن 15 أقل و30 و50 و75 و100، فإن الناتج على الشاشة سيكون 1 فقط. لنكتب تطبيقًا آخر يطبع على وحدة التحكم في أي يوم من أيام الأسبوع:
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    if (dayOfWeek == DayOfWeek.SUNDAY) {
        System.out.println("Сегодня воскресенье");
    } else if (dayOfWeek == DayOfWeek.MONDAY) {
        System.out.println("Сегодня понедельник");
    } else if (dayOfWeek == DayOfWeek.TUESDAY) {
        System.out.println("Сегодня вторник");
    } else if (dayOfWeek == DayOfWeek.WEDNESDAY) {
        System.out.println("Сегодня среда");
    } else if (dayOfWeek == DayOfWeek.THURSDAY) {
        System.out.println("Сегодня четверг");
    } else if (dayOfWeek == DayOfWeek.FRIDAY) {
        System.out.println("Сегодня пятница");
    } else if (dayOfWeek == DayOfWeek.SATURDAY) {
        System.out.println("Сегодня суббота");
    }
}
إنها مريحة بالطبع، لكن وفرة النص الرتيب تبهر عينيك قليلاً. في المواقف التي يكون لدينا فيها عدد كبير من الخيارات، فمن الأفضل استخدام المشغل، والذي سيتم مناقشته أدناه.

حالة التبديل

بديل جريئة ifمع الكثير من الفروع هو المشغل switch-case. يبدو أن هذا العامل يقول "لذا، لدينا هذا المتغير. انظر، إذا كانت قيمتها تساوي `x` فإننا نفعل هذا وذاك، وإذا كانت قيمتها تساوي `y` فإننا نفعل ذلك بشكل مختلف، وإذا كانت لا تساوي أي شيء مما سبق نفعله فقط إنه مثل هذا..." هذا المشغل لديه البنية التالية.
switch (argument) {
	case value1:
		statement1;
		break;
	case value2:
		statement2;
		break;
	case valueN:
		statementN;
		break;
	default:
		default_statement;
		break;
}
دعونا ننظر إلى هذا الهيكل بمزيد من التفصيل. argument هو متغير سنقارن قيمته مع خيارات افتراضية مختلفة. يجب أن يكون المتغير final. ومن الجدير بالذكر أيضًا أن عامل التشغيل switchلا يدعم أي نوع بيانات كوسيطة. الأنواع الصالحة مذكورة أدناه:
  • بايت وبايت
  • قصيرة وقصيرة
  • كثافة العمليات وعدد صحيح
  • شار وشخصية
  • التعداد
  • خيط
case value1 (value2, valueN)- هذه هي القيم والثوابت المحددة التي نقارن بها قيمة المتغير argument. كما تحدد كل حالة مجموعة من الأوامر التي يجب تنفيذها. statement1, statement2, statementNهي الأوامر التي يجب تنفيذها إذا argumentتبين أنها تساوي أحد value. على سبيل المثال، إذا argumentكان يساوي value2، فسيتم تنفيذ البرنامج statement2. defaultوهي default_statement"القيم الافتراضية". إذا argumentلم يكن مساويا لأي من تلك المقدمة value، فسيتم تشغيل الفرع defaultوسيتم تنفيذ الأمر default_statement. defaultوهي default_statementسمات اختيارية للمشغل switch-case. break- يمكنك ملاحظة أنه يوجد بيان في نهاية كل كتلة حالة break. يعد هذا العامل أيضًا اختياريًا ويعمل على التمييز بين رموز الحالات المختلفة. في بعض الأحيان يكون من الضروري تنفيذ نفس الإجراءات في حالات مختلفة: ثم يمكن دمج هذه الحالات. في هذه الحالة، يتم حذف الكلمة الأساسية ، وسيبدو breakهيكل العامل كما يلي:switch-case
switch (argument) {
	case value1:
		statement1;
		break;
	case valueX:
	case valueY:
		statementXY;
		break;
}
تجدر الإشارة إلى أنه لا يوجد عامل تشغيل بين `case valueX:` و`case valueY:` break. هنا، إذا argumentكان يساوي value1، سيتم تنفيذه statement1. وإذا كانت الحجة تساوي valueXأي منهما valueY، statementXY. دعونا نخفف النظرية التي يصعب فهمها إلى ممارسة سهلة الفهم. دعونا نعيد كتابة المثال مع أيام الأسبوع باستخدام عامل التشغيل switch-case.
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    switch (dayOfWeek) {
        case SUNDAY:
            System.out.println("Сегодня воскресенье");
            break;
        case MONDAY:
            System.out.println("Сегодня понедельник");
            break;
        case TUESDAY:
            System.out.println("Сегодня вторник");
            break;
        case WEDNESDAY:
            System.out.println("Сегодня среда");
            break;
        case THURSDAY:
            System.out.println("Сегодня четверг");
            break;
        case FRIDAY:
            System.out.println("Сегодня пятница");
            break;
        case SATURDAY:
            System.out.println("Сегодня суббота");
            break;
    }
}
لنكتب الآن برنامجًا يعرض ما إذا كان اليوم أحد أيام الأسبوع أو عطلة نهاية الأسبوع باستخدام عامل التشغيل switch-case.
public static void main(String[] args) {
    // Определим текущий день недели
    DayOfWeek dayOfWeek = LocalDate.now().getDayOfWeek();

    switch (dayOfWeek) {
        case SUNDAY:
        case SATURDAY:
            System.out.println("Сегодня выходной");
            break;
        case FRIDAY:
            System.out.println("Завтра выходной");
            break;
        default:
            System.out.println("Сегодня рабочий день");
            break;

    }
}
دعني اشرح قليلا. في هذا البرنامج نحصل enum DayOfWeekعلى اليوم الحالي من الأسبوع. بعد ذلك، سنرى ما إذا كانت قيمة المتغير لدينا تساوي dayOfWeekقيم SUNDAYأي منهما SATURDAY. إذا كان الأمر كذلك، فسيعرض البرنامج "اليوم يوم عطلة". إذا لم يكن الأمر كذلك، فإننا نتحقق مما إذا كانت قيمة المتغير تساوي dayOfWeekقيمة FRIDAY. إذا كان الأمر كذلك، فسيعرض البرنامج "غدًا يوم عطلة". إذا لم يكن هناك في هذه الحالة، فلدينا خيارات قليلة، أي يوم متبقي هو أحد أيام الأسبوع، لذلك افتراضيًا، إذا لم يكن اليوم جمعة، وليس السبت وليس الأحد، فسيعرض البرنامج "اليوم هو يوم عمل".

خاتمة

لذلك، في هذه المقالة نظرنا إلى ما هو التفرع في برنامج الكمبيوتر. لقد اكتشفنا أيضًا هياكل التحكم المستخدمة لتنفيذ التفرع في Java. ناقشنا تصاميم مثل:
  • if-then
  • if-then-else
  • switch-case
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION