gadget59.ru лекции
Условия и циклы · 42 слайда

Условия и циклы в Java

Мы уже знаем типы данных и переменные. Но пока наши программы умеют только «посчитать 2+2». Сегодня научимся принимать решения и повторять действия — без этого не работает ни одна серьёзная программа.

🔀 if / else 🎯 switch 🔄 for ♾️ while ⏹️ break / continue
В конце каждого блока — мини-задача. А в конце лекции — продвинутый блок для тех, кто уже знаком с синтаксисом.

План лекции

  • 1 Зачем нужны условия
  • 2 if, else if, else
  • 3 Логические операторы
  • 4 Тернарный оператор
  • 5 switch — классический и новый
  • 6 Зачем нужны циклы
  • 7 while и do-while
  • 8 for — цикл со счётчиком
  • 9 for-each — перебор коллекций
  • 10 break и continue
  • 11 Типичные ошибки
  • 12 Продвинутый блок: switch-выражения, метки, Stream
  • 13 Практика: игра «Угадай число»

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

Представь, что программа должна:

🎓
Оценка
если балл ≥ 4.5 — «отлично», иначе — «хорошо»
🔐
Пароль
если совпал — пустить, иначе — отказ
💰
Скидка
если сумма > 1000 — скидка 5%
🌡️
Погода
если температура < 0 — надеть шапку
🎮
Игра
если жизней 0 — game over
📝
Форма
если поле пустое — попросить заполнить
Условие — это «развилка» на дороге. Программа смотрит на значение и выбирает, куда идти.

if — простейшее условие

if (если) — выполняет код, только когда условие истинно.

int age = 18; if (age >= 18) { System.out.println("Ты совершеннолетний"); }
Условие
→
true?
→
Выполнить код
  • Условие всегда в круглых скобках ( ).
  • Тело — в фигурных скобках { }.
  • Если условие ложно — тело пропускается, программа идёт дальше.
Если в теле одна строка, фигурные скобки можно не писать. Но лучше писать всегда — меньше ошибок.

if-else — две ветки

else (иначе) — выполняется, когда условие ложно.

int age = 15; if (age >= 18) { System.out.println("Совершеннолетний"); } else { System.out.println("Ещё несовершеннолетний"); }
Условие
→
true → if-блок
/
false → else-блок
Одна из двух веток выполнится всегда. Это удобно, когда есть только два варианта: да/нет, чётное/нечётное, есть/нет.

else if — много веток

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

int score = 78; if (score >= 90) { System.out.println("Отлично"); } else if (score >= 75) { System.out.println("Хорошо"); } else if (score >= 60) { System.out.println("Удовлетворительно"); } else { System.out.println("Не сдал"); }
  • Проверки идут сверху вниз, пока одна не сработает.
  • Как только сработала — остальные пропускаются.
  • else в конце — «на всё остальное».
Порядок важен. Если сначала проверить score >= 60, то 95 тоже попадёт в «Удовлетворительно». Всегда проверяй от большего к меньшему.

Логические операторы

В условиях можно комбинировать несколько проверок.

ОператорЧто значитПример &&И (оба true)age >= 18 && hasPassport ||ИЛИ (хотя бы один true)isStudent || isTeacher !НЕ (инверсия)!isBlocked
int age = 20; boolean hasLicense = true; if (age >= 18 && hasLicense) { System.out.println("Можешь водить"); } if (age < 18 || !hasLicense) { System.out.println("Водить нельзя"); }
Правило: && — «строже», нужно всё. || — «мягче», хватит одного.

Приоритет логических операторов

У операторов есть порядок выполнения. Это важно, когда в одном условии несколько операторов.

ПриоритетОператорЧто значит 1 (высший)!НЕ 2<, >, <=, >=, ==, !=сравнения 3&&И 4||ИЛИ
// Как это читается? if (age >= 18 && hasLicense || isStudent) { // сначала (age >= 18 && hasLicense) // потом || isStudent } // Чтобы было понятнее — ставь скобки if ((age >= 18 && hasLicense) || isStudent) { ... }
Если сомневаешься — ставь скобки. Они не влияют на результат, но делают код понятнее.

Тернарный оператор

Тернарный оператор — короткая форма if-else, которая возвращает значение.

// Обычный if-else String status; if (age >= 18) { status = "взрослый"; } else { status = "ребёнок"; } // То же через тернарный оператор String status = (age >= 18) ? "взрослый" : "ребёнок"; // ↑ условие ↑ если true ↑ если false
Синтаксис: условие ? значение_если_true : значение_если_false.
Тернарный оператор хорош для коротких проверок. Если логика сложная — используй обычный if-else.

switch — выбор из вариантов

switch — когда нужно проверить одно значение на много вариантов.

int day = 3; switch (day) { case 1: System.out.println("Понедельник"); break; case 2: System.out.println("Вторник"); break; case 3: System.out.println("Среда"); break; default: System.out.println("Другой день"); }
  • case — вариант значения.
  • break — выход из switch. Без него выполнение «провалится» в следующий case.
  • default — если ни один case не подошёл.
Забыл break — код «провалится» в следующий case. Это классическая ошибка. Иногда это нужно специально, но чаще — баг.

switch — что можно проверять

В классическом switch можно проверять не всё.

ТипМожно ли в switch int, byte, short, char✅ да String✅ да (Java 7+) enum✅ да long❌ нет double, float❌ нет boolean❌ нет
// switch по строке — работает String lang = "Java"; switch (lang) { case "Java": System.out.println("Отличный выбор!"); break; case "Python": System.out.println("Тоже хорошо"); break; }
Если нужно проверить диапазон (например, «балл от 60 до 74»), switch не подходит. Используй if-else.

Зачем нужны циклы

Представь, что нужно:

1️⃣
Вывести числа от 1 до 100
сто строк println? Нет.
2️⃣
Пройти по всем студентам
для каждого — посчитать средний балл
3️⃣
Ждать, пока пользователь введёт пароль
повторять, пока не совпадёт
4️⃣
Играть музыку, пока не нажата пауза
повторять, пока флаг true
Цикл — это конструкция, которая повторяет код много раз. Вместо 100 строк — 3 строки, которые выполняются 100 раз.
Циклы — сердце программирования. Без них компьютер был бы просто калькулятором.

while — цикл с условием

while (пока) — повторяет код, пока условие истинно.

int i = 1; while (i <= 5) { System.out.println(i); i++; // увеличиваем i, иначе бесконечный цикл } // Выведет: 1 2 3 4 5
Проверить условие
↓ true
Выполнить тело
↓
Вернуться к проверке
Если условие никогда не станет ложным — цикл будет бесконечным. Программа зависнет. Всегда проверяй, что переменная меняется.

do-while — цикл с постусловием

do-while — сначала выполняет тело, потом проверяет условие. Тело выполнится хотя бы один раз.

int i = 10; do { System.out.println(i); i++; } while (i <= 5); // Условие сразу false, но тело выполнится один раз // Выведет: 10
ЦиклКогда проверяется условиеМинимум выполнений whileдо тела0 do-whileпосле тела1
do-while удобен для меню: «показать меню, спросить выбор, повторить, пока не выбрали «выход»».

for — цикл со счётчиком

for — самый частый цикл. В нём сразу три части: инициализация, условие, шаг.

for (int i = 1; i <= 5; i++) { System.out.println(i); } // ↑ ↑ ↑ // старт условие шаг
ЧастьЧто значитПример Инициализацияначальное значениеint i = 1 Условиепока истинно — работатьi <= 5 Шагчто делать после телаi++ (увеличить на 1)
for идеален, когда известно, сколько раз повторять. Например: «10 раз», «до 100», «для каждого элемента массива».

for — варианты

Цикл for можно настраивать по-разному.

// Считаем вниз for (int i = 5; i >= 1; i--) { System.out.println(i); } // Шаг 2 for (int i = 0; i <= 10; i += 2) { System.out.println(i); // 0 2 4 6 8 10 } // Бесконечный (не делай так без break) for (;;) { // ... }
i += 2 — это то же, что i = i + 2. Частая форма записи в циклах.

for-each — для массивов и коллекций

for-each — упрощённый цикл для перебора всех элементов массива или коллекции.

int[] numbers = {10, 20, 30, 40}; // Обычный for for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]); } // for-each — короче и безопаснее for (int n : numbers) { System.out.println(n); }
Что нужноКакой цикл просто пройти по всемfor-each нужен индексобычный for нужно изменить элементобычный for (по индексу) нужно пропустить элементыобычный for + continue
for-each нельзя использовать, если нужно изменить элементы массива или узнать индекс. Тогда — обычный for.

break — выйти из цикла

break — немедленно прерывает цикл. Управление переходит на строку после цикла.

for (int i = 1; i <= 100; i++) { if (i == 5) { break; // выходим, когда дошли до 5 } System.out.println(i); } // Выведет: 1 2 3 4
🚪
break
выйти из цикла
⏭️
continue
перейти к следующей итерации
break используют, когда нашли нужный элемент или когда условие выхода известно только внутри цикла.

continue — пропустить итерацию

continue — пропускает остаток тела и переходит к следующей итерации.

for (int i = 1; i <= 10; i++) { if (i % 2 == 0) { continue; // пропускаем чётные } System.out.println(i); } // Выведет: 1 3 5 7 9
continue — «пропустить это, перейти к следующему». Удобно для фильтрации: «вывести всех, кроме заблокированных».
Не путай: break — выйти совсем, continue — пропустить итерацию.

Мини-задачи

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

  1. Проверь, является ли число чётным. Выведи «чётное» или «нечётное».
  2. Найди максимум из двух чисел через if-else.
  3. Найди максимум из трёх чисел.
  4. Выведи все числа от 1 до 10 через for.
  5. Выведи все чётные числа от 1 до 20 через for и if.
  6. Посчитай сумму чисел от 1 до 100.
  7. Выведи таблицу умножения на 7 (7×1, 7×2, … 7×10).
  8. Найди факториал числа 5 (5! = 1×2×3×4×5).
Если задача кажется сложной — разбей её на части. Например, «найти максимум из трёх» — это «сравнить первые два, потом результат с третьим».

Типичные ошибки

1. = вместо ==
if (x = 5) — ошибка компиляции. Нужно if (x == 5).
2. Забыл break в switch
Код «провалится» в следующий case. Иногда это нужно, но чаще — баг.
3. Точка с запятой после if
if (x > 5); — тело пустое, дальше выполняется всегда.
4. Бесконечный цикл
while (i < 5) без изменения i — программа зависнет.
5. Выход за границы массива
i <= array.length — ошибка. Нужно i < array.length.
6. Забыл фигурные скобки
В теле цикла несколько строк, а скобок нет — выполнится только первая.

Проверь себя

  • 1 Чем if отличается от else if?
  • 2 Что делает else?
  • 3 Чем && отличается от ||?
  • 4 Как работает тернарный оператор?
  • 5 Зачем нужен break в switch?
  • 6 Чем while отличается от do-while?
  • 7 Когда лучше for, а когда for-each?
  • 8 Чем break отличается от continue?
  • 9 Что произойдёт, если забыть изменить переменную в while?
  • 10 Почему i <= array.length — ошибка?
Если затрудняешься — вернись к слайду. Это нормально.

⭐ Продвинутый блок

Всё, что дальше — для тех, кто уже уверенно пишет if и for и хочет узнать больше. Если пока сложно — пропусти этот блок и вернись позже.

switch-выражения
→
метки
→
Stream API
Эти приёмы не нужны в начале. Но в реальном коде они встречаются постоянно, и понимать их полезно.

Switch-выражения (Java 14+)

Современная Java позволяет использовать switch как выражение — он возвращает значение.

// Старый switch String result; switch (day) { case 1: result = "Пн"; break; case 2: result = "Вт"; break; default: result = "?"; } // Новый switch-выражение String result = switch (day) { case 1 -> "Пн"; case 2 -> "Вт"; default -> "?"; };
ОсобенностьСтарый switchНовый switch breakнуженне нужен Возвращает значениенетда Стрелка ->нетда Несколько значенийчерез case 1: case 2:case 1, 2 ->
switch-выражения короче и безопаснее: не нужно помнить про break.

Метки в циклах

Если циклы вложены друг в друга, break выходит только из внутреннего. Чтобы выйти из обоих, используют метки.

outer: for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == 1 && j == 1) { break outer; // выйти из ОБОИХ циклов } System.out.println(i + "," + j); } }
  • outer: — метка, имя для внешнего цикла.
  • break outer; — выйти из цикла с этой меткой.
  • Метки работают и с continue.
Метки — мощный, но редкий приём. Если код требует метки, возможно, стоит вынести логику в отдельный метод.

Stream API вместо циклов

В современной Java многие циклы заменяются на Stream API — функциональный стиль обработки коллекций.

List<Integer> numbers = List.of(1, 2, 3, 4, 5); // Обычный цикл: найти сумму чётных, умноженных на 2 int sum = 0; for (int n : numbers) { if (n % 2 == 0) { sum += n * 2; } } // Stream API int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(n -> n * 2) .sum();
Stream API мы разбирали в лекции по ООП. Он не заменяет циклы полностью, но для обработки коллекций часто короче и понятнее.
Начинающим лучше сначала освоить обычные циклы. Stream — это следующий уровень.

Практика: игра «Угадай число»

Соберём игру, которая использует всё, что мы прошли.

Правила:
  • Компьютер загадывает число от 1 до 100.
  • Пользователь вводит свои догадки.
  • Программа подсказывает: «больше» или «меньше».
  • Игра идёт, пока не угадают или не кончатся попытки.
import java.util.Scanner; import java.util.Random; public class GuessNumber { public static void main(String[] args) { Random random = new Random(); int secret = random.nextInt(100) + 1; Scanner sc = new Scanner(System.in); int attempts = 7; System.out.println("Я загадал число от 1 до 100"); while (attempts > 0) { System.out.print("Твоя догадка: "); int guess = sc.nextInt(); if (guess == secret) { System.out.println("Угадал!"); return; } else if (guess < secret) { System.out.println("Больше"); } else { System.out.println("Меньше"); } attempts--; System.out.println("Осталось попыток: " + attempts); } System.out.println("Попытки кончились. Было число: " + secret); } }
Здесь есть Random, Scanner, while, if-else, return, счётчик попыток. Идеальный пример.

Что дальше

Мы разобрали условия и циклы. Теперь можно двигаться дальше.

🧩
Методы
как разбивать код на части
📚
Массивы
как хранить много значений
🏗️
Классы и объекты
основы ООП
🎮
Игры и приложения
когда всё это соединяется
Условия и циклы — это «мускулы» программирования. Без них код статичен, с ними — живой.

Итоги

  • ✅ if — выполнить код при условии.
  • ✅ else — альтернатива, если условие ложно.
  • ✅ else if — цепочка проверок.
  • ✅ &&, ||, ! — логические операторы.
  • ✅ ?: — тернарный оператор, короткая замена if-else.
  • ✅ switch — выбор из вариантов.
  • ✅ while — цикл с проверкой до тела.
  • ✅ do-while — цикл с проверкой после тела.
  • ✅ for — цикл со счётчиком.
  • ✅ for-each — перебор всех элементов.
  • ✅ break — выйти из цикла.
  • ✅ continue — пропустить итерацию.
Этого достаточно, чтобы писать программы, которые принимают решения и повторяют действия. Это уже настоящий код.

Домашнее задание

  1. Программа, которая проверяет, является ли число простым.
  2. Программа, которая выводит все числа Фибоначчи до 100.
  3. Программа, которая считает сумму цифр числа (например, 123 → 1+2+3=6).
  4. Программа, которая выводит таблицу умножения от 1 до 9.
  5. Программа «Угадай число» с уровнями сложности: лёгкий (10 попыток), средний (5), сложный (3).
  6. Программа, которая проверяет, является ли строка палиндромом.
Первые два — обязательные. Остальные — для тренировки. Если что-то не получается — пиши в комментариях к коду, что именно не понял.

Спасибо за внимание!

🔀

Условия и циклы — это «мускулы» кода

Теперь твои программы умеют думать и повторять. Это уже серьёзный уровень.

🔀 if / else 🎯 switch 🔄 for ♾️ while 🚀 практика