> For the complete documentation index, see [llms.txt](https://letas-organization.gitbook.io/letaats-lessons-online/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://letas-organization.gitbook.io/letaats-lessons-online/kolledzh-top/razdel-1/glava-8.-usloviya-i-logika-prinyatiya-reshenii.md).

# Глава 8. Условия и логика принятия решений

### 8.1. Зачем нужны условия

Программа без условий всегда выполняет одни и те же действия.

Но реальные программы должны реагировать на разные ситуации.

Примеры:

* если возраст больше или равен 18 — доступ разрешён;
* если пароль неверный — показать ошибку;
* если баланс меньше суммы покупки — отказать;
* если поле ввода пустое — попросить заполнить;
* если игрок набрал 100 очков — перейти на следующий уровень.

Условия позволяют программе принимать решения.

***

### 8.2. if

Базовая конструкция:

```java
if (condition) {
    // код
}
```

Код внутри выполнится только если условие равно `true`.

Пример:

```java
int age = 18;

if (age >= 18) {
    System.out.println("Доступ разрешён");
}
```

***

### 8.3. Что такое boolean-выражение

Условие всегда даёт результат:

```java
true
false
```

Пример:

```java
age >= 18
```

Если `age = 20`, результат `true`.

Если `age = 15`, результат `false`.

***

### 8.4. Операторы сравнения

| Оператор | Значение         |
| -------- | ---------------- |
| `>`      | больше           |
| `<`      | меньше           |
| `>=`     | больше или равно |
| `<=`     | меньше или равно |
| `==`     | равно            |
| `!=`     | не равно         |

Примеры:

```java
x > 0
age >= 18
score == 5
password != 1234
```

***

### 8.5. if else

```java
if (age >= 18) {
    System.out.println("Доступ разрешён");
} else {
    System.out.println("Доступ запрещён");
}
```

Если условие `true`, выполняется первый блок.\
Если `false`, выполняется `else`.

***

### 8.6. else if

Когда вариантов больше двух, используют `else if`.

```java
if (score == 5) {
    System.out.println("Отлично");
} else if (score == 4) {
    System.out.println("Хорошо");
} else if (score == 3) {
    System.out.println("Удовлетворительно");
} else {
    System.out.println("Нужно исправлять");
}
```

Проверка идёт сверху вниз. Как только найдено истинное условие, остальные блоки пропускаются.

***

### 8.7. Логический оператор &&

`&&` означает “и”.

Оба условия должны быть истинными.

```java
if (age >= 18 && hasPassport) {
    System.out.println("Можно пройти");
}
```

Если возраст подходит, но паспорта нет, условие будет `false`.

***

### 8.8. Логический оператор ||

`||` означает “или”.

Достаточно, чтобы хотя бы одно условие было истинным.

```java
if (isAdmin || isModerator) {
    System.out.println("Доступ к панели управления");
}
```

***

### 8.9. Логический оператор !

`!` означает отрицание.

```java
boolean active = false;

if (!active) {
    System.out.println("Пользователь не активен");
}
```

`!active` означает “не active”.

***

### 8.10. Таблицы истинности

Для `&&`:

| A     | B     | A && B |
| ----- | ----- | ------ |
| true  | true  | true   |
| true  | false | false  |
| false | true  | false  |
| false | false | false  |

Для `||`:

\| A | B | A || B | |---|---|---| | true | true | true | | true | false | true | | false | true | true | | false | false | false |

***

### 8.11. Вложенные условия

Условие можно вложить внутрь другого условия.

```java
if (money > 1000) {
    if (age >= 18) {
        System.out.println("Можно купить билет");
    }
}
```

Но если вложенности слишком много, код становится трудно читать.

Часто лучше объединить условия:

```java
if (money > 1000 && age >= 18) {
    System.out.println("Можно купить билет");
}
```

***

### 8.12. Проверка диапазона

Пример: число должно быть от 1 до 10.

```java
if (number >= 1 && number <= 10) {
    System.out.println("Число в диапазоне");
}
```

Ошибка новичка:

```java
if (1 <= number <= 10) // так нельзя в Java
```

Нужно разделять условие на две части.

***

### 8.13. Сравнение строк в условиях

Плохо:

```java
if (login == "admin")
```

Правильно:

```java
if (login.equals("admin"))
```

Ещё безопаснее, если переменная может быть `null`:

```java
if ("admin".equals(login))
```

Так не будет `NullPointerException`, если `login == null`.

***

### 8.14. switch

`switch` удобен, когда нужно сравнить одно значение с несколькими вариантами.

```java
int command = 2;

switch (command) {
    case 1:
        System.out.println("Добавить");
        break;
    case 2:
        System.out.println("Показать");
        break;
    case 3:
        System.out.println("Выход");
        break;
    default:
        System.out.println("Неизвестная команда");
}
```

`break` нужен, чтобы выйти из `switch`.

***

### 8.15. switch и меню

Консольное меню часто можно писать через `if else` или `switch`.

Через `if else`:

```java
if (command == 1) {
    System.out.println("Добавить");
} else if (command == 2) {
    System.out.println("Показать");
} else {
    System.out.println("Ошибка");
}
```

Через `switch`:

```java
switch (command) {
    case 1:
        System.out.println("Добавить");
        break;
    case 2:
        System.out.println("Показать");
        break;
    default:
        System.out.println("Ошибка");
}
```

***

### 8.16. Тернарный оператор

Тернарный оператор — короткая форма условия.

```java
String result = age >= 18 ? "Можно" : "Нельзя";
```

Это значит:

```java
if (age >= 18) {
    result = "Можно";
} else {
    result = "Нельзя";
}
```

Новичкам лучше сначала уверенно освоить обычный `if else`. Тернарный оператор полезен, но им легко сделать код нечитаемым. Люди и так сделали достаточно нечитаемого кода, не надо помогать.

***

### 8.17. Условия в Android

В Android условия используются постоянно.

Пример: проверка пустого поля.

```java
String text = input.getText().toString();

if (text.isEmpty()) {
    resultText.setText("Введите значение");
} else {
    resultText.setText("Вы ввели: " + text);
}
```

Пример: проверка возраста.

```java
int age = Integer.parseInt(ageText);

if (age >= 18) {
    resultText.setText("Доступ разрешён");
} else {
    resultText.setText("Доступ запрещён");
}
```

***

### 8.18. Типичные ошибки новичков

#### Ошибка 1. Путать `=` и `==`

```java
if (x = 5) // ошибка
```

Правильно:

```java
if (x == 5)
```

***

#### Ошибка 2. Неправильно проверять диапазон

```java
if (1 <= x <= 10) // ошибка
```

Правильно:

```java
if (x >= 1 && x <= 10)
```

***

#### Ошибка 3. Сравнивать строки через ==

```java
if (name == "Anna")
```

Правильно:

```java
if (name.equals("Anna"))
```

***

#### Ошибка 4. Забыть `break` в switch

```java
switch (command) {
    case 1:
        System.out.println("Один");
    case 2:
        System.out.println("Два");
}
```

Если нет `break`, выполнение может перейти в следующий `case`.

***

#### Ошибка 5. Слишком сложное условие в одной строке

```java
if (a > 0 && b < 10 || c == 5 && !flag)
```

Лучше использовать скобки:

```java
if ((a > 0 && b < 10) || (c == 5 && !flag))
```

***

### 8.19. Как могут спросить на экзамене

#### Вопрос

Для чего нужны условные конструкции?

#### Хороший ответ

> Условные конструкции позволяют выполнять разные части кода в зависимости от выполнения условия. Например, если возраст больше или равен 18, программа может разрешить доступ, иначе запретить.

***

#### Вопрос

Чем отличается `&&` от `||`?

#### Хороший ответ

> `&&` означает логическое “и”: оба условия должны быть истинными. `||` означает логическое “или”: достаточно, чтобы хотя бы одно условие было истинным.

***

#### Вопрос

Когда используется `switch`?

#### Хороший ответ

> `switch` используется, когда нужно сравнить одно значение с несколькими возможными вариантами, например при обработке команд меню.

***

### 8.20. Практические задания

#### Задание 1

Пользователь вводит возраст. Программа выводит:

* `Доступ разрешён`, если возраст 18 или больше;
* `Доступ запрещён`, если меньше 18.

***

#### Задание 2

Пользователь вводит число. Программа определяет, положительное оно, отрицательное или равно нулю.

***

#### Задание 3

Пользователь вводит оценку от 1 до 5. Программа выводит текстовую расшифровку оценки.

***

#### Задание 4

Пользователь вводит логин и пароль. Если логин `admin` и пароль `1234`, вывести `Вход выполнен`. Иначе вывести `Ошибка входа`.

***

#### Задание 5

Пользователь вводит номер команды:

```
1 — добавить
2 — показать
3 — удалить
4 — выход
```

Реализуйте обработку через `switch`.

***

#### Задание 6

Пользователь вводит число. Проверьте, находится ли оно в диапазоне от 10 до 100.

***

#### Задание 7

Пользователь вводит сумму покупки. Если сумма больше 5000, применить скидку 10%. Иначе оставить цену без изменений.

***

#### Задание 8

Пользователь вводит температуру. Программа выводит:

* меньше 0 — холодно;
* от 0 до 20 — прохладно;
* от 21 до 30 — тепло;
* больше 30 — жарко.

***

### 8.21. Вопросы для самопроверки

1. Для чего нужны условия?
2. Что возвращает условие?
3. Чем `if` отличается от `if else`?
4. Когда нужен `else if`?
5. Что делает `&&`?
6. Что делает `||`?
7. Что делает `!`?
8. Как правильно проверить диапазон?
9. Почему строки сравнивают через `.equals()`?
10. Когда удобно использовать `switch`?
11. Для чего нужен `break` в `switch`?
12. Что такое тернарный оператор?
13. Где условия используются в Android?
14. Почему нельзя писать `if (1 <= x <= 10)`?
15. Как проверить пустой ввод в Android?

***

## Итог по главам 5–8

После этих глав вы должны уметь:

* создавать переменные;
* понимать объявление и инициализацию;
* объяснять область видимости;
* использовать основные типы данных;
* выполнять преобразование типов;
* понимать разницу между `int` и `double`;
* сравнивать строки через `.equals()`;
* вводить данные через `Scanner`;
* выводить данные в консоль;
* исправлять проблему `nextInt()` и `nextLine()`;
* писать условия `if`, `else`, `else if`;
* использовать `&&`, `||`, `!`;
* писать простое меню через `switch`;
* понимать, где эти темы применяются в Android.

Следующий блок: циклы, массивы, базовые алгоритмы и первые полноценные задачи на обработку данных.
