☕ 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) — управление вложенными циклами