JavaRush /Blog Java /Random-PL /Oddział w Javie

Oddział w Javie

Opublikowano w grupie Random-PL
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(Lub if)
  • if-then-else(Lub if-else)
  • switch-case
Rozgałęzianie w Javie - 1

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:
  • Operatorif-then
  • Operatorif-then-else
  • Operator trójskładnikowy? :
W tym artykule przyjrzymy się operatorom if-elsei switch-case.

Jeśli następnie

Operator if-thenlub po prostu ifbyć może najpopularniejszy operator. Wyrażenie „tak, napisz 1 jeśli” stało się już popularne. Operator ifma następującą strukturę:
if (bool_condition) {
	statement
}
W tym projekcie:
  • bool_conditionjest 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)
Konstrukcję tę można odczytać w następujący sposób:

Если (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 ifma 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 != nulludało nam się uniknąć błędów w programie. I nie rób nic w przypadkach, gdy zmienna stringbyła równa null.

jeśli-to-inne

Jeśli w zwykłym przypadku ifprogram ma wybór: „zrobić coś lub nie robić nic”, wówczas if-elsewybó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_statementjest 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)
Konstrukcję tę można odczytać w następujący sposób:

Если (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 < 10ma wartość true (poziom baterii poniżej 10), program wydrukuje jeden tekst. W przeciwnym razie, jeśli warunek a < 10nie 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 ifna 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 printStringSizedo 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: ifelsemain

Ошибка! Переданная строка равна null!
Кол-во символов в строке `Не представляю своей жизни без ветвлений...`=43
Ошибка! Переданная строка равна null!
Кол-во символов в строке `Ифы это так захватывающе!`=25
Sytuacje są dopuszczalne, gdy elsepo 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
Liczba takich warunków nie jest ograniczona. Każdy warunek ma swoje własne polecenia:
  • oświadczenie 1
  • oświadczenie2
  • oświadczenieN
Każdy z nich statementmoż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 pogrubienia ifz 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 switchnie 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, statementNto polecenia, które należy wykonać, jeśli argumentokaże się, że są równe jednemu z value. Na przykład, jeśli argumentjest równe value2, program wykona statement2. defaulti default_statementsą „wartościami domyślnymi”. Jeśli argumentnie jest on równy żadnemu z przedstawionych value, wówczas gałąź zostanie uruchomiona defaulti polecenie zostanie wykonane default_statement. defaulti default_statementsą 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 breakzostanie pominięte, a struktura operatora switch-casebę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 argumentjest równe value1, zostanie wykonane statement1. A jeśli argument jest równy valueXalbo 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 dayOfWeekwartości SUNDAYktó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 dayOfWeekwartoś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
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION