JavaRush /בלוג Java /Random-HE /הסתעפות בג'אווה

הסתעפות בג'אווה

פורסם בקבוצה
במאמר זה נבחן את מושג ההסתעפות בתוכנות מחשב בכלל ובאלה הכתובות ב-Java. בואו נדבר על מבני שליטה כגון:
  • if-then(או if)
  • if-then-else(או if-else)
  • switch-case
הסתעפות בג'אווה - 1

מִסעָף

נתחיל עם המושגים הבסיסיים. כל תוכנית היא קבוצה של פקודות שמבוצעות על ידי מחשב. לרוב, פקודות מבוצעות ברצף, בזו אחר זו. לעתים קרובות מעט יותר (אך עדיין לעתים קרובות למדי) מתעוררים מצבים כאשר אתה צריך לשנות את הזרימה הרציפה של פקודות תוכנית. לפעמים, בהתאם לתנאים מסוימים, ייתכן שיהיה צורך לבצע בלוק אחד של פקודות במקום אחר. וכאשר התנאים הללו משתנים, עשה את ההיפך. לדוגמה, ישנם מספר אתרים שאסור לבקר בהם אנשים מתחת לגיל 18. בדרך כלל, בעת ביקור במשאב כזה בפעם הראשונה, המשתמש מתקבל בטופס כלשהו שבו המשתמש מוזהר על הגבלת הגיל ומתבקש להזין את תאריך הלידה שלו. לאחר מכן, בהתאם לנתונים שהמשתמש הזין, הוא יורשה להיכנס למשאב או לא. פונקציונליות זו מסופקת על ידי מה שנקרא בדרך כלל הסתעפות. בוא ניתן אנלוגיה נוספת. בואו נדמיין את עצמנו בצומת של שבעה כבישים. אנו עומדים בפני בחירה: לפנות שמאלה או ימינה, או ללכת ישר. הבחירה שלנו מבוססת על תנאים מסוימים. אין לנו גם אפשרות לנסוע במספר כבישים במקביל. הָהֵן. בהתאם לתנאים מסוימים, נצטרך לבחור דרך אחת. אותו עיקרון חל על הסתעפות. כעת ננסה לתת הגדרה של הסתעפות. הסתעפות היא תכנון אלגוריתמי שבו, בהתאם לאמיתות של מצב כלשהו, ​​מתבצע אחד מכמה רצפים של פעולות. הסתעפות מיושמת (ככל הנראה) בכל שפות התכנות. לשפת התכנות ג'אווה יש כמה מה שנקרא מבני בקרה המאפשרים לך ליישם הסתעפות בתוכנית שלך. ישנן 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לבניה . כעת, אם נריץ את התוכנית, היא תוציא לקונסולה לא 2 שורות, אלא 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, גם אם היו בדיקות נוספות לפנינו. הביטוי "משפט N+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אינו תומך בשום סוג נתונים כטיעון. סוגים חוקיים מפורטים להלן:
  • בייט ובייט
  • קצר וקצר
  • int ומספר שלם
  • char ו-Character
  • enum
  • חוּט
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