JavaRush /Java Blogu /Random-AZ /Java-da şaxələnmə

Java-da şaxələnmə

Qrupda dərc edilmişdir
Bu yazıda biz ümumiyyətlə kompüter proqramlarında və Java-da yazılanlarda budaqlanma anlayışına baxacağıq. Nəzarət strukturları haqqında danışaq, məsələn:
  • if-then(və ya if)
  • if-then-else(və ya if-else)
  • switch-case
Java-da budaqlanma - 1

Budaqlanma

Əsas anlayışlardan başlayaq. İstənilən proqram kompüter tərəfindən yerinə yetirilən əmrlər toplusudur. Çox vaxt əmrlər bir-birinin ardınca ardıcıl olaraq yerinə yetirilir. Proqram əmrlərinin ardıcıl axını dəyişdirmək lazım olduqda bir az daha az (lakin hələ də olduqca tez-tez) vəziyyətlər yaranır. Bəzən, müəyyən şərtlərdən asılı olaraq, başqa bir əmr blokunun əvəzinə bir əmr blokunu yerinə yetirmək lazım ola bilər. Və bu şərtlər dəyişdikdə, əksini edin. Məsələn, bir sıra saytlar var ki, onlara 18 yaşdan kiçik şəxslərin girişi qadağandır. Adətən, belə bir resursa ilk dəfə baş çəkərkən istifadəçi hansı formada qarşılanır ki, orada istifadəçiyə yaş həddi barədə xəbərdarlıq edilir və onun doğum tarixini daxil etməsi xahiş olunur. Sonra istifadəçinin daxil etdiyi məlumatlardan asılı olaraq, ya resursa daxil olmağa icazə veriləcək, ya da verilməyəcək. Bu funksionallıq ümumiyyətlə budaqlanma adlanan şey tərəfindən təmin edilir. Başqa bir bənzətmə gətirək. Özümüzü yeddi yolun kəsişməsində təsəvvür edək. Seçim qarşısındayıq: sola və ya sağa dönün, ya da düz gedin. Seçimimiz müəyyən şərtlərə əsaslanır. Bizim də eyni vaxtda bir neçə yolla getmək imkanımız yoxdur. Bunlar. bəzi şərtlərdən asılı olaraq bir yolu seçməli olacağıq. Eyni prinsip budaqlanmaya da aiddir. İndi isə budaqlanmanın tərifini verməyə çalışaq. Budaqlanma hansısa şərtin doğruluğundan asılı olaraq bir neçə hərəkət ardıcıllığından birinin yerinə yetirildiyi alqoritmik konstruksiyadır. Budaqlanma (çox güman ki) tamamilə bütün proqramlaşdırma dillərində həyata keçirilir. Java proqramlaşdırma dilində proqramınızda şaxələnməni həyata keçirməyə imkan verən bir neçə nəzarət konstruksiyaları var. Proqramlaşdırma dilində 3 belə konstruksiya var:
  • Operatorif-then
  • Operatorif-then-else
  • Üçlü operator? :
if-elseBu yazıda və operatorlarına baxacağıq switch-case.

əgər-onda

Operator if-thenvə ya sadəcə ifbəlkə də ən ümumi operator. “Bəli, əgər 1 yaz” ifadəsi artıq məşhurlaşıb. Operator ifaşağıdakı quruluşa malikdir:
if (bool_condition) {
	statement
}
Bu dizaynda:
  • bool_conditiondoğru və ya yalan kimi qiymətləndirən bir boolean ifadəsidir. Bu ifadə şərt adlanır.
  • statement— şərt doğrudursa yerinə yetirilməli olan əmr (birdən çox ola bilər) ( bool_statement==true)
Bu tikinti belə oxuna bilər:

Если (bool_condition), то {statement}
Budur bəzi nümunələr:
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 процентов, подключите ваш смартфон к зарядному устройству");
    }
}
Bu proqramda istifadəçidən smartfonunda batareyanın doldurulma faizini daxil etməsi tələb olunur. Əgər şarjın 10 faizindən azı qalsa, proqram istifadəçiyə smartfonu doldurmaq zərurəti barədə xəbərdarlıq edəcək. Bu ən sadə dizayn nümunəsidir if. Qeyd etmək lazımdır ki, `a` dəyişəni 10-dan böyük və ya bərabərdirsə, heç bir şey olmayacaq. Proqram aşağıdakı kodu icra etməyə davam edəcək if. Onu da qeyd edək ki, bu halda konstruksiya ifyerinə yetirilməsi üçün yalnız bir hərəkət ardıcıllığına malikdir: mətni çap edin və ya heç nə etməyin. Bu, bir "budaq" ilə budaqlanmanın variasiyasıdır. Bu bəzən zəruridir. Məsələn, özümüzü yanlış dəyərlərdən qorumaq istədiyimiz zaman. Məsələn, sətir sətirdə olan hərflərin sayını öyrənə bilmərik null. Aşağıdakı nümunələr:
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());
    }
}
Əsas metodun icrası nəticəsində konsola aşağıdakılar çıxacaq:

Количество символов в строке `Не представляю своей жизни без ветвлений...`=43
Количество символов в строке `Ифы это так захватывающе!`=25
Bunu yoxlamaq sayəsində string != nullproqramda səhvlərdən qaça bildik. stringVə dəyişənin bərabər olduğu hallarda heç nə etməyin null.

əgər-onda-başqa

Adi vəziyyətdə ifproqramın seçimi varsa: "nəsə etmək və ya heç nə etmə", onda if-elseproqram seçimində "ya bu, ya da digərini etmək" baş verir. "Heç bir şey etmə" seçimi yox olur. Bu tip budaqlanma ilə iki və ya daha çox icra variantı (və ya budaqların sayı) var. İki variantın olduğu halı nəzərdən keçirək. Sonra nəzarət strukturu aşağıdakı formaya malikdir:
if (bool_condition) {
	statement1
} else {
	statement2
}
Burada:
  • bool_statementdoğru və ya yalan kimi qiymətləndirən bir boolean ifadəsidir. Bu ifadə şərt adlanır.
  • statement1— şərt doğrudursa yerinə yetirilməli olan əmr (birdən çox ola bilər) ( bool_statement==true)
  • statement2— şərt yanlış olduqda yerinə yetirilməli olan əmr (birdən çox ola bilər) ( bool_statement==false)
Bu tikinti belə oxuna bilər:

Если (bool_condition), то {statement1}
Иначе {statement2}
Budur bir nümunə:
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");
    }
}
Smartfonun batareya səviyyəsi ilə bağlı eyni nümunə. Yalnız sonuncu dəfə proqram yalnız smartfonun doldurulması zərurəti barədə xəbərdarlıq edibsə, bu dəfə əlavə bildirişimiz var. Gəlin buna baxaq if:
if (a < 10) {
    System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
    System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
Doğrudursa a < 10(batareya səviyyəsi 10-dan azdır), proqram bir mətn çap edəcək. Əks halda, şərt a < 10yerinə yetirilməzsə, proqram tamamilə fərqli mətn çıxaracaq. Bir sətirdəki hərflərin sayını göstərdiyimiz ikinci nümunəmizi də yekunlaşdıraq. Keçən dəfə keçən sətir -ə bərabər olarsa, proqram heç nə çıxarmadı null. ifNormal olanı çevirərək bunu düzəldək 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!");
    }
}
Metodda printStringSizetikintiyə ifbir blok əlavə etdik else. İndi proqramı işə salsaq, o, konsola 2 sətir deyil, 4 sətir çıxaracaq, baxmayaraq ki, giriş (metod main) keçən dəfə olduğu kimi qalır. Proqramın çıxaracağı mətn:

Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
elseVəziyyətlər icra əmrləri ilə deyil, başqa bir əmrlə izləndikdə məqbuldur if. Sonra tikinti aşağıdakı formanı alır:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
} else {
	statementN+1
}
Bu dizayn bir neçə şərtə malikdir:
  • bool_şərt1
  • bool_şərt2
  • bool_şərtN
Belə şərtlərin sayı məhdud deyil. Hər bir şərtin öz əmrləri var:
  • bəyanat 1
  • bəyanat 2
  • bəyanat N
Hər birində statement1 və ya daha çox kod sətirləri ola bilər. Şərtlər bir-bir yoxlanılır. İlk həqiqi şərt müəyyən edildikdən sonra, həqiqi vəziyyətə "bağlanmış" bir sıra əmrlər yerinə yetiriləcəkdir. ifBu əmrləri yerinə yetirdikdən sonra, qarşıda daha çox yoxlama olsa belə, proqram blokdan çıxacaq . Yuxarıda göstərilən şərtlərdən heç biri doğru deyilsə, “ifadə N+1” yerinə yetiriləcək. Bu tikinti belə oxuna bilər:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Иначе {statementN+1}
Bu vəziyyətdə son sətir isteğe bağlıdır. Sonuncu tənha olmadan edə bilərsiniz else. Və sonra dizayn aşağıdakı formanı alacaq:
If (bool_condition1) {
	statement1
} else if (bool_condition2) {
	statement2
} else if (bool_conditionN) {
	statementN
}
Və belə oxunacaq:

Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Müvafiq olaraq, şərtlərdən heç biri doğru deyilsə, heç bir əmr yerinə yetirilməyəcəkdir. Nümunələrə keçək. Smartfonda şarj səviyyəsi ilə bağlı vəziyyətə qayıdaq. Sahibini cihazının şarj səviyyəsi haqqında daha ətraflı məlumatlandıracaq bir proqram yazaq:
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);
    }
}
Məsələn, bu halda, istifadəçi 15-i daxil edərsə, proqram ekranda görünəcək: "Şarj cihazının harada olduğunu xatırlamağın vaxtı gəldi." 15 az və 30 və 50 və 75 və 100 olmasına baxmayaraq, ekranda çıxış yalnız 1 olacaq. Həftənin hansı günü olduğunu konsola çap edəcək başqa bir proqram yazaq:
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("Сегодня суббота");
    }
}
Bu, əlbəttə ki, rahatdır, lakin monoton mətnin bolluğu gözlərinizi bir az qamaşdırır. Çox sayda seçimimiz olduğu hallarda, aşağıda müzakirə ediləcək operatordan istifadə etmək daha yaxşıdır.

keçid qutusu

Bir çox filialı olan qalın üçün alternativ ifoperatordur switch-case. Bu operator deyəsən “Beləliklə, bizdə bu dəyişən var. Baxın, əgər onun dəyəri `x`-ə bərabərdirsə, onda biz bunu və bunu edirik, əgər dəyəri `y`-ə bərabərdirsə, onda biz bunu başqa cür edirik və yuxarıdakıların heç birinə bərabər deyilsə, sadəcə edirik. bu belə... ” Bu operator aşağıdakı quruluşa malikdir.
switch (argument) {
	case value1:
		statement1;
		break;
	case value2:
		statement2;
		break;
	case valueN:
		statementN;
		break;
	default:
		default_statement;
		break;
}
Bu strukturu daha ətraflı nəzərdən keçirək. argument dəyərini hipotetik müxtəlif variantlarla müqayisə edəcəyimiz dəyişəndir. Dəyişən olmalıdır final. Operatorun switchheç bir məlumat növünü arqument kimi dəstəkləmədiyini də söyləmək lazımdır. Etibarlı növlər aşağıda verilmişdir:
  • bayt və bayt
  • qısa və qısa
  • int və Tam ədəd
  • simvol və xarakter
  • nömrə
  • Simli
case value1 (value2, valueN)- bunlar dəyərlərdir, dəyişənin dəyərini müqayisə etdiyimiz xüsusi sabitlərdir argument. Həmçinin, hər bir hal yerinə yetirilməli olan əmrlər toplusunu müəyyən edir. statement1, statement2, birinə bərabər olduğu statementNhalda yerinə yetirilməli olan əmrlərdir . Məsələn, -ə bərabərdirsə , proqram yerinə yetiriləcək . və "standart dəyərlər"dir. Təqdim olunanlardan heç birinə bərabər deyilsə , o zaman filial işə salınacaq və əmr yerinə yetiriləcəkdir . və operatorun isteğe bağlı atributlarıdır . — hər bir iş blokunun sonunda bir ifadə olduğunu görə bilərsiniz . Bu operator həm də isteğe bağlıdır və müxtəlif halların kodunu fərqləndirməyə xidmət edir. Bəzən müxtəlif hallarda eyni hərəkətləri yerinə yetirmək lazımdır: sonra bu hallar birləşdirilə bilər. Bu halda açar söz buraxılır və operatorun strukturu belə görünür: argumentvalueargumentvalue2statement2defaultdefault_statementargumentvaluedefaultdefault_statementdefaultdefault_statementswitch-casebreakbreakbreakswitch-case
switch (argument) {
	case value1:
		statement1;
		break;
	case valueX:
	case valueY:
		statementXY;
		break;
}
Qeyd etmək lazımdır ki, `case valueX:` və `case valueY:` arasında operator yoxdur break. Burada bərabərdirsə argument, value1icra olunacaq statement1. Əgər arqument valueXhər ikisinə bərabərdirsə valueY, statementXY. Gəlin çətin başa düşülən nəzəriyyəni asan başa düşülən praktikaya çevirək. Operatordan istifadə edərək nümunəni həftənin günləri ilə yenidən yazaq 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;
    }
}
İndi operatordan istifadə edərək günün iş günü və ya həftə sonu olduğunu göstərən proqram yazaq 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;

    }
}
Bir az izah edim. Bu proqramda enum DayOfWeekhəftənin cari gününü ifadə edən . Sonra, dəyişənimizin dəyərinin hər ikisinin dayOfWeekdəyərlərinə bərabər olub olmadığını yoxlayırıq . Əgər belədirsə, proqramda “Bu gün istirahət günüdür” göstərilir. Əgər yoxsa, onda dəyişənin dəyərinin -in dəyərinə bərabər olub olmadığını yoxlayırıq . Əgər belədirsə, proqramda “Sabah istirahət günüdür” göstərilir. Əgər bu halda yoxdursa, onda bizim seçimlərimiz azdır, qalan hər hansı gün iş günüdür, ona görə də standart olaraq bu gün Cümə DEYİL, Şənbə DEYİL və Bazar DEYİLsə, proqram “Bu gün iş günüdür” göstərəcək. SUNDAYSATURDAYdayOfWeekFRIDAY

Nəticə

Beləliklə, bu məqalədə kompüter proqramında budaqlanmanın nə olduğuna baxdıq. Java-da budaqlanmanı həyata keçirmək üçün hansı idarəetmə strukturlarından istifadə edildiyini də anladıq. kimi dizaynları müzakirə etdik:
  • if-then
  • if-then-else
  • switch-case
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION