W tym artykule przyjrzymy się ogólnie koncepcji rozgałęzień w programach komputerowych i tych napisanych w Javie. Porozmawiajmy o strukturach kontrolnych takich jak:
if-then
(Lubif
)if-then-else
(Lubif-else
)switch-case
Rozgałęzianie
Zacznijmy od podstawowych pojęć. Każdy program to zestaw poleceń wykonywanych przez komputer. Najczęściej polecenia wykonywane są sekwencyjnie, jedno po drugim. Nieco rzadziej (ale wciąż dość często) zdarzają się sytuacje, gdy zachodzi potrzeba zmiany kolejności wykonywania poleceń programu. Czasami, w zależności od pewnych warunków, może być konieczne wykonanie jednego bloku poleceń zamiast drugiego. A kiedy te warunki się zmienią, postępuj odwrotnie. Na przykład istnieje wiele witryn, których odwiedzanie jest zabronione osobom poniżej 18 roku życia. Zwykle, odwiedzając taki zasób po raz pierwszy, użytkownik zostaje powitany jakąś formą, w której użytkownik jest ostrzegany o limicie wiekowym i proszony o podanie swojej daty urodzenia. Następnie, w zależności od danych wprowadzonych przez użytkownika, będzie on mógł wejść do zasobu lub nie. Funkcjonalność tę zapewnia tzw. rozgałęzianie. Podajmy inną analogię. Wyobraźmy sobie siebie na skrzyżowaniu siedmiu dróg. Stoimy przed wyborem: skręcić w lewo lub w prawo, albo jechać prosto. Nasz wybór opieramy na pewnych warunkach. Nie mamy też możliwości poruszania się kilkoma drogami jednocześnie. Te. w zależności od pewnych warunków będziemy musieli wybrać jedną drogę. Ta sama zasada dotyczy rozgałęzień. Spróbujmy teraz podać definicję rozgałęzienia. Rozgałęzianie to konstrukcja algorytmiczna, w której w zależności od prawdziwości jakiegoś warunku wykonywana jest jedna z kilku sekwencji działań. Rozgałęzianie jest realizowane (najprawdopodobniej) w absolutnie wszystkich językach programowania. Język programowania Java ma kilka tak zwanych konstrukcji kontrolnych, które umożliwiają implementację rozgałęzień w programie. W języku programowania istnieją 3 takie konstrukcje:- Operator
if-then
- Operator
if-then-else
- Operator trójskładnikowy
? :
if-else
i switch-case
.
Jeśli następnie
Operatorif-then
lub po prostu if
być może najpopularniejszy operator. Wyrażenie „tak, napisz 1 jeśli” stało się już popularne. Operator if
ma następującą strukturę:
if (bool_condition) {
statement
}
W tym projekcie:
bool_condition
jest wyrażeniem boolowskim, którego wynikiem jest prawda lub fałsz. To wyrażenie nazywa się warunkiem.statement
— polecenie (może być więcej niż jedno), które należy wykonać, jeśli warunek jest spełniony (bool_statement==true
)
Если (bool_condition), то {statement}
Oto kilka przykładów:
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 процентов, подключите ваш смартфон к зарядному устройству");
}
}
W tym programie użytkownik proszony jest o podanie procentu naładowania baterii swojego smartfona. Jeżeli poziom naładowania pozostanie poniżej 10 procent, program ostrzeże użytkownika o konieczności naładowania smartfona. To jest przykład najprostszego projektu if
. Warto zauważyć, że jeśli zmienna „a” jest większa lub równa 10, to nic się nie stanie. Program będzie kontynuował wykonywanie kodu następującego po if
. Należy również pamiętać, że w tym przypadku konstrukcja if
ma tylko jedną sekwencję akcji do wykonania: wydrukuj tekst lub nie rób nic. Jest to odmiana rozgałęzienia z jedną „gałęzią”. Czasami jest to konieczne. Na przykład, gdy chcemy uchronić się przed nieprawidłowymi wartościami. Na przykład nie możemy sprawdzić liczby liter w ciągu, jeśli ciąg ma postać null
. Przykłady poniżej:
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());
}
}
W wyniku wykonania metody main na konsolę zostanie wyświetlony następujący komunikat:
Количество символов в строке `Не представляю своей жизни без ветвлений...`=43
Количество символов в строке `Ифы это так захватывающе!`=25
Dzięki sprawdzeniu tego string != null
udało nam się uniknąć błędów w programie. I nie rób nic w przypadkach, gdy zmienna string
była równa null
.
jeśli-to-inne
Jeśli w zwykłym przypadkuif
program ma wybór: „zrobić coś lub nie robić nic”, wówczas if-else
wybór programu sprowadza się do „zrobienia jednej lub drugiej rzeczy”. Opcja „nic nie rób” zniknie. Istnieją dwa lub więcej wariantów wykonania (lub liczby rozgałęzień) z tego typu rozgałęzieniami. Rozważmy przypadek, gdy istnieją dwie opcje. Wówczas struktura sterująca ma następującą postać:
if (bool_condition) {
statement1
} else {
statement2
}
Tutaj:
bool_statement
jest wyrażeniem boolowskim, którego wynikiem jest prawda lub fałsz. To wyrażenie nazywa się warunkiem.statement1
— polecenie (może być więcej niż jedno), które należy wykonać, jeśli warunek jest spełniony (bool_statement==true
)statement2
— polecenie (może być więcej niż jedno), które należy wykonać, jeśli warunek jest fałszywy (bool_statement==false
)
Если (bool_condition), то {statement1}
Иначе {statement2}
Oto przykład:
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");
}
}
Ten sam przykład dotyczący poziomu baterii w smartfonie. Tylko jeśli ostatnim razem program tylko ostrzegał o konieczności naładowania smartfona, tym razem mamy dodatkowe powiadomienie. Spójrzmy na ten if
:
if (a < 10) {
System.out.println("Осталось менее 10 процентов, подключите ваш смартфон к зарядному устройству");
} else {
System.out.println("Заряда вашей батареи достаточно для того, чтобы прочитать статью на Javarush");
}
Jeśli a < 10
ma wartość true (poziom baterii poniżej 10), program wydrukuje jeden tekst. W przeciwnym razie, jeśli warunek a < 10
nie jest spełniony, program wyświetli zupełnie inny tekst. Zakończmy też nasz drugi przykład, w którym wyświetliliśmy liczbę liter w linii. Ostatnim razem program nie wypisał niczego, jeśli przekazany ciąg był równy null
. Naprawmy to, zamieniając normalny if
na 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!");
}
}
W metodzie dodaliśmy printStringSize
do konstrukcji blok . Teraz, jeśli uruchomimy program, wyświetli on na konsoli nie 2 linie, ale 4, chociaż dane wejściowe (metoda ) pozostaną takie same jak ostatnim razem. Tekst, który wyświetli program: if
else
main
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
Sytuacje są dopuszczalne, gdy else
po nich nie pojawiają się polecenia wykonania, ale inne if
. Wtedy konstrukcja przyjmuje następującą postać:
If (bool_condition1) {
statement1
} else if (bool_condition2) {
statement2
} else if (bool_conditionN) {
statementN
} else {
statementN+1
}
Ten projekt ma kilka warunków:
- warunek_bool1
- warunek_bool2
- warunek_boolN
- oświadczenie 1
- oświadczenie2
- oświadczenieN
statement
może zawierać 1 lub więcej linii kodu. Warunki są sprawdzane jeden po drugim. Po określeniu pierwszego warunku prawdziwego zostanie wykonana seria poleceń „powiązanych” z warunkiem prawdziwym. Po wykonaniu tych poleceń program wyjdzie z bloku if
, nawet jeśli przed nim było więcej kontroli. Wyrażenie „instrukcjaN+1” zostanie wykonane, jeśli żaden z warunków zdefiniowanych powyżej nie jest spełniony. Konstrukcję tę można odczytać w następujący sposób:
Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Иначе {statementN+1}
Ostatnia linia w tym przypadku jest opcjonalna. Możesz obejść się bez tego ostatniego samotnika else
. Następnie projekt przybierze następującą formę:
If (bool_condition1) {
statement1
} else if (bool_condition2) {
statement2
} else if (bool_conditionN) {
statementN
}
A będzie to brzmiało tak:
Если (bool_condition1) то {statement1}
Иначе если (bool_condition2) то {statement2}
Иначе если (bool_conditionN) то {statementN}
Odpowiednio, jeśli żaden z warunków nie jest spełniony, wówczas żadne polecenie nie zostanie wykonane. Przejdźmy do przykładów. Wróćmy do sytuacji z poziomem naładowania smartfona. Napiszmy program, który bardziej szczegółowo poinformuje właściciela o poziomie naładowania jego urządzenia:
public static void main(String[] args) {
String alert5 = "Я скоро отключусь, но помни меня бодрым";
String alert10 = "Я так скучаю по напряжению в моих жилах";
String alert20 = "Пора вспоминать, где лежит зарядка";
String alert30 = "Псс, пришло время экономить";
String alert50 = "Хм, больше половины израсходовали";
String alert75 = "Всё в порядке, заряда больше половины";
String alert100 = "Я готов к приключениям, если что..";
String illegalValue = "Такс, кто-то ввел некорректное oznaczający";
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);
}
}
Przykładowo w tym przypadku, jeśli użytkownik wpisze 15, program wyświetli na ekranie komunikat: „Czas przypomnieć sobie, gdzie jest ładowarka”. Pomimo tego, że 15 to mniej, a 30 i 50, 75 i 100, na ekranie wyświetli się tylko 1. Napiszmy kolejną aplikację, która wydrukuje na konsoli jaki jest dzień tygodnia:
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("Сегодня суббота");
}
}
Jest to oczywiście wygodne, ale obfitość monotonnego tekstu trochę razi w oczy. W sytuacjach, gdy mamy dużą liczbę opcji, lepiej skorzystać z operatora, o czym będzie mowa poniżej.
Sprawa przełącznik
Alternatywą dla pogrubieniaif
z dużą liczbą rozgałęzień jest operator switch-case
. Ten operator zdaje się mówić: „Mamy więc tę zmienną. Spójrz, jeśli jego wartość jest równa `x`, to robimy to i tamto, jeśli jego wartość jest równa `y`, to robimy to inaczej, a jeśli nie jest równe żadnemu z powyższych, po prostu to robimy to tak... ” Operator ten ma następującą strukturę.
switch (argument) {
case value1:
statement1;
break;
case value2:
statement2;
break;
case valueN:
statementN;
break;
default:
default_statement;
break;
}
Przyjrzyjmy się tej strukturze bardziej szczegółowo. argument
to zmienna, której wartość będziemy porównywać z hipotetycznymi różnymi opcjami. Zmienna musi być final
. Warto również powiedzieć, że operator switch
nie obsługuje żadnego typu danych jako argumentu. Prawidłowe typy są wymienione poniżej:
- bajt i bajt
- krótko i krótko
- int i liczba całkowita
- znak i postać
- wyliczenie
- Strunowy
case value1 (value2, valueN)
- są to wartości, konkretne stałe, z którymi porównujemy wartość zmiennej argument
. Ponadto każdy przypadek definiuje zestaw poleceń, które należy wykonać. statement1
, statement2
, statementN
to polecenia, które należy wykonać, jeśli argument
okaże się, że są równe jednemu z value
. Na przykład, jeśli argument
jest równe value2
, program wykona statement2
. default
i default_statement
są „wartościami domyślnymi”. Jeśli argument
nie jest on równy żadnemu z przedstawionych value
, wówczas gałąź zostanie uruchomiona default
i polecenie zostanie wykonane default_statement
. default
i default_statement
są opcjonalnymi atrybutami operatora switch-case
. break
— można zauważyć, że na końcu każdego bloku case znajduje się stwierdzenie break
. Operator ten jest również opcjonalny i służy do różnicowania kodu różnych przypadków. Czasami konieczne jest wykonanie tych samych czynności w różnych przypadkach: wtedy te przypadki można połączyć. W tym przypadku słowo kluczowe break
zostanie pominięte, a struktura operatora switch-case
będzie wyglądać następująco:
switch (argument) {
case value1:
statement1;
break;
case valueX:
case valueY:
statementXY;
break;
}
Warto zauważyć, że pomiędzy `wartość przypadkuX:` i `wartość przypadkuY:` nie ma operatora break
. Tutaj, jeśli argument
jest równe value1
, zostanie wykonane statement1
. A jeśli argument jest równy valueX
albo valueY
, statementXY
. Rozcieńczmy trudną do zrozumienia teorię w łatwą do zrozumienia praktykę. Przepiszmy przykład z dniami tygodnia za pomocą operatora 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;
}
}
Napiszmy teraz program, który za pomocą operatora wyświetli, czy dzisiaj jest dzień powszedni, czy weekend 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;
}
}
Pozwól, że trochę wyjaśnię. W tym programie otrzymujemy enum DayOfWeek
, które oznacza aktualny dzień tygodnia. Następnie sprawdzamy, czy wartość naszej zmiennej jest równa dayOfWeek
wartości SUNDAY
którejkolwiek z nich SATURDAY
. W takim przypadku program wyświetli komunikat „Dziś jest dzień wolny”. Jeśli nie, to sprawdzamy, czy wartość zmiennej jest równa dayOfWeek
wartości FRIDAY
. W takim przypadku program wyświetli komunikat „Jutro dzień wolny”. Jeśli w tym przypadku nie ma, to pozostaje nam niewiele opcji, pozostały dzień jest dniem powszednim, więc domyślnie, jeśli dzisiaj NIE jest piątek, NIE sobota i NIE niedziela, program wyświetli „Dzisiaj jest dzień roboczy”.
Wniosek
W tym artykule sprawdziliśmy, czym jest rozgałęzienie w programie komputerowym. Dowiedzieliśmy się także, jakie struktury kontrolne są używane do implementowania rozgałęzień w Javie. Omówiliśmy projekty takie jak:if-then
if-then-else
switch-case
GO TO FULL VERSION