☕ Java

Die for-Schleife in Java 17: Eine ausführliche Anleitung

Условия и циклы в Java: if, switch, for, while с примерами

Программы без управления потоком были бы бесполезны — они выполняли бы одни и те же действия при любых обстоятельствах. Реальные программы принимают решения и повторяют действия. Именно для этого нужны операторы управления.

Условный оператор if/else

Аналогия: Светофор на перекрёстке. Если (if) горит зелёный — идёшь. Иначе (else) — стоишь. Оператор if/else — это светофор в коде.

public class IfElse {
    public static void main(String[] args) {
        // Простой if (else необязателен)
        int temp = 22;
        if (temp > 20) {
            System.out.println("Тепло! Можно гулять.");
        }
        
        // if-else: два варианта
        int age = 16;
        if (age >= 18) {
            System.out.println("Вход разрешён.");
        } else {
            System.out.println("Только с 18 лет. Тебе ещё " + (18-age) + " лет.");
        }
        
        // if-else if-else: несколько вариантов
        int score = 75;
        if      (score >= 90) System.out.println("Отлично (A)");
        else if (score >= 80) System.out.println("Хорошо (B)");
        else if (score >= 70) System.out.println("Удовлетворительно (C)");
        else if (score >= 60) System.out.println("Посредственно (D)");
        else                  System.out.println("Неудовлетворительно (F)");
        // Выполнится только ОДИН блок!
        
        // Логические операторы в условиях
        boolean hasTicket = true, hasID = true;
        if (age >= 18 && hasTicket && hasID) {
            System.out.println("Добро пожаловать!");
        } else if (age < 18) {
            System.out.println("Мероприятие 18+.");
        } else if (!hasTicket) {
            System.out.println("Нет билета.");
        } else {
            System.out.println("Нет удостоверения.");
        }
    }
}

Тернарный оператор: if/else в одну строку

// Синтаксис: условие ? значение_если_true : значение_если_false
int a = 15, b = 28;
int max = (a > b) ? a : b;              // 28
String parity = (a%2==0) ? "чётное" : "нечётное"; // "нечётное"

// Абсолютное значение
int num = -7;
int abs = (num >= 0) ? num : -num;     // 7

// Удобно в выводе
for (int i = 1; i <= 5; i++) {
    System.out.println(i + " — " + (i%2==0 ? "чётное" : "нечётное"));
}

// Вложенный тернарный (читается сложнее)
int s = 85;
String grade = s>=90 ? "A" : s>=80 ? "B" : s>=70 ? "C" : "F"; // B

Оператор switch

// Классический switch — нужен break!
int day = 3;
String dayName;
switch (day) {
    case 1: dayName = "Понедельник"; break;
    case 2: dayName = "Вторник";     break;
    case 3: dayName = "Среда";       break;
    case 4: dayName = "Четверг";     break;
    case 5: dayName = "Пятница";     break;
    case 6: dayName = "Суббота";     break;
    case 7: dayName = "Воскресенье"; break;
    default: dayName = "Неверный номер";
}
System.out.println(dayName); // Среда

// Несколько case в одном блоке
int month = 4;
int daysCount;
switch (month) {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12: daysCount=31; break;
    case 4: case 6: case 9: case 11:                           daysCount=30; break;
    case 2:                                                     daysCount=28; break;
    default: daysCount=-1;
}
System.out.println("Дней: " + daysCount); // 30

Switch Expression — Java 14+

// Новый синтаксис: нет break, нет fall-through — намного удобнее!
String name = switch (day) {
    case 1 -> "Понедельник";
    case 2 -> "Вторник";
    case 3 -> "Среда";
    case 4 -> "Четверг";
    case 5 -> "Пятница";
    case 6 -> "Суббота";
    case 7 -> "Воскресенье";
    default -> "Неверный день";
};

// Несколько значений в case
String season = switch (month) {
    case 12, 1, 2  -> "Зима";
    case 3, 4, 5   -> "Весна";
    case 6, 7, 8   -> "Лето";
    case 9, 10, 11 -> "Осень";
    default -> "Неизвестно";
};

// Со строками
String cmd = "start";
switch (cmd) {
    case "start" -> System.out.println("Запуск...");
    case "stop"  -> System.out.println("Остановка...");
    default      -> System.out.println("Неизвестная команда");
}

// Блок с yield
int sc2 = 45;
String res = switch (sc2/10) {
    case 10,9 -> "A"; case 8 -> "B"; case 7 -> "C"; case 6 -> "D";
    default -> {
        System.out.println("Балл ниже 60!");
        yield "F";
    }
};

Цикл for

Аналогия: Конвейер на заводе. Берёт деталь, обрабатывает, берёт следующую — ровно N раз.

// Синтаксис: for (начало; условие; шаг)
for (int i = 0; i < 5; i++) System.out.print(i + " "); // 0 1 2 3 4
System.out.println();

// Обратный отсчёт
for (int i = 10; i >= 1; i--) System.out.print(i + " "); // 10 9 8 .. 1
System.out.println("ПУСК!");

// Только чётные
for (int i = 0; i <= 10; i += 2) System.out.print(i + " "); // 0 2 4 6 8 10
System.out.println();

// Сумма 1..100 = 5050 (Гаусс)
int sum = 0;
for (int i = 1; i <= 100; i++) sum += i;
System.out.println("Сумма 1..100 = " + sum); // 5050

// Числа Фибоначчи
int fa=0, fb=1;
System.out.print("Фибоначчи: ");
for (int i=0; i<10; i++) {
    System.out.print(fa+" "); int tmp=fa+fb; fa=fb; fb=tmp;
}
// 0 1 1 2 3 5 8 13 21 34

Цикл while

// while: проверяет условие ДО тела
int n = 1;
while (n <= 5) { System.out.println("n = " + n); n++; }

// Найти первое n где n² > 1000
n = 1;
while (n*n <= 1000) n++;
System.out.println("n=" + n + " (n²=" + n*n + ")"); // n=32 (n²=1024)

// Разобрать число на цифры
int number = 12345;
System.out.print("Цифры: ");
while (number > 0) {
    System.out.print(number%10 + " "); // последняя цифра
    number /= 10;                       // убрать последнюю цифру
}
// 5 4 3 2 1

// Бесконечный цикл + break
while (true) {
    // ... ждём события ...
    break; // когда нужно выйти
}

Цикл do-while

// do-while: СНАЧАЛА выполняет, ПОТОМ проверяет условие
// Гарантирует хотя бы ОДНО выполнение!
int i = 0;
do {
    System.out.println("i = " + i);
    i++;
} while (i < 3);

// Классический пример: валидация ввода
java.util.Scanner sc = new java.util.Scanner(System.in);
int userAge;
do {
    System.out.print("Введите возраст (1-120): ");
    userAge = sc.nextInt();
    if (userAge < 1 || userAge > 120) System.out.println("Ошибка! Повторите.");
} while (userAge < 1 || userAge > 120);
System.out.println("Принятый возраст: " + userAge);

For-each: перебор коллекций

import java.util.ArrayList;

// Перебор массива
String[] fruits = {"яблоко","груша","банан","апельсин"};

// Обычный for (если нужен индекс)
for (int i=0; i cities = new ArrayList<>();
cities.add("Москва"); cities.add("Питер"); cities.add("Новосибирск");
for (String c : cities) System.out.println("Город: " + c);

break и continue

// break: немедленно выйти из цикла
for (int i=0; i<10; i++) {
    if (i==5) { System.out.println("Нашли 5!"); break; }
    System.out.print(i+" "); // 0 1 2 3 4
}

// continue: пропустить итерацию, перейти к следующей
for (int i=0; i<10; i++) {
    if (i%2==0) continue;    // пропускаем чётные
    System.out.print(i+" "); // 1 3 5 7 9
}

// Метки: выход из вложенного цикла
outer:
for (int i=0; i<3; i++) {
    for (int j=0; j<3; j++) {
        if (i+j==3) {
            System.out.println("Нашли i="+i+", j="+j);
            break outer; // Выходим из ВНЕШНЕГО цикла!
        }
    }
}

Практические примеры

// Таблица умножения
for (int i=1; i<=9; i++) {
    for (int j=1; j<=9; j++) System.out.printf("%4d", i*j);
    System.out.println();
}

// Треугольник из звёздочек
for (int row=1; row<=5; row++) {
    for (int col=1; col<=row; col++) System.out.print("* ");
    System.out.println();
}

// Простые числа до 50
System.out.print("Простые: ");
for (int num=2; num<=50; num++) {
    boolean prime = true;
    for (int d=2; d<=Math.sqrt(num); d++)
        if (num%d==0) { prime=false; break; }
    if (prime) System.out.print(num+" ");
}

// FizzBuzz
for (int i=1; i<=20; i++) {
    if      (i%15==0) System.out.println("FizzBuzz");
    else if (i%3==0)  System.out.println("Fizz");
    else if (i%5==0)  System.out.println("Buzz");
    else              System.out.println(i);
}

Итого: что мы узнали

  • ✅ if / else if / else — ветвление; выполняется только один блок
  • ✅ Тернарный оператор ? : — компактная форма if/else
  • ✅ switch (классический): нужен break, иначе fall-through
  • ✅ Switch Expression (Java 14+): ->, без break, современный синтаксис
  • ✅ for — цикл с известным числом итераций
  • ✅ while — условие проверяется ДО тела
  • ✅ do-while — условие проверяется ПОСЛЕ тела (минимум 1 выполнение)
  • ✅ for-each — элегантный перебор массивов и коллекций
  • ✅ break — выход из цикла; continue — пропуск итерации
  • ✅ Метки (labels) — управление вложенными циклами