Java Курс

Java: условия и циклы

Самоучитель Python 3, собранный из материалов данного сайта.Предназначен в основном для тех, кто хочет изучить язык программирования Python с нуля.

Введение: Почему компьютеры такие "умные"?

Привет, юный программист! 👋 Сегодня мы раскроем один из главных секретов программирования. Задумывался ли ты, как компьютер принимает решения? Как игра понимает, что ты нажал на кнопку "Старт", а не "Выход"? Или как робот-пылесос понимает, что перед ним стена, и нужно повернуть?

Всё это работает благодаря двум мощным инструментам: условиям и циклам. Представь, что программа — это рецепт пиццы. Условия — это проверки: "Если сыр закончился, пойди в магазин". Циклы — это повторения: "Меси тесто, пока оно не станет эластичным". Без них рецепт был бы просто списком действий, которые выполняются один раз и без выбора.

Сегодня ты научишься:

  • Заставлять программу выбирать (как в игре "камень-ножницы-бумага")
  • Заставлять её повторять действия (как робот, который красит забор)
  • Писать код, который реагирует на разные ситуации

Поехали! 🚀

Часть 1: Условия — "Если ... то ..."

Что такое условие в жизни?

Каждый день мы принимаем решения. Посмотри на эти примеры:

  • Если идёт дождь, то беру зонт
  • Если получил пятёрку, то мама радуется
  • Если голоден, то иду на кухню

В Java это выглядит так же просто! Конструкция if проверяет условие и выполняет код только если оно истинно (правда).

Первая программа с условием

public class ConditionExample1 {
    public static void main(String[] args) {
        int temperature = 25; // Температура на улице
        
        // Проверяем: если температура больше 20, то жарко
        if (temperature > 20) {
            System.out.println("На улице жарко! Идём купаться!");
        }
        
        System.out.println("Программа завершена.");
    }
}

Результат: На улице жарко! Идём купаться! Программа завершена.

А если температура будет 15? Тогда условие temperature > 20 — ложь, и сообщение не появится. Попробуй изменить значение!

if-else: Два пути

В жизни не всегда всё однозначно. Если дождь — беру зонт, иначе (else) — иду без зонта. В Java для этого есть else:

public class ConditionExample2 {
    public static void main(String[] args) {
        int age = 15; // Твой возраст
        
        if (age >= 18) {
            System.out.println("Ты взрослый! Можешь голосовать.");
        } else {
            System.out.println("Ты ещё ребёнок. Но программировать можешь уже сейчас!");
        }
        
        // Ещё пример: проверка чётности числа
        int number = 7;
        if (number % 2 == 0) { // % - остаток от деления
            System.out.println(number + " - чётное число");
        } else {
            System.out.println(number + " - нечётное число");
        }
    }
}

Обрати внимание на % — оператор остатка от деления. Если число делится на 2 без остатка, оно чётное.

else if: Много вариантов

А если вариантов больше двух? Например, оценка в школе: 5 — отлично, 4 — хорошо, 3 — удовлетворительно, 2 — плохо. Тут поможет else if:

public class GradeChecker {
    public static void main(String[] args) {
        int grade = 4; // Оценка
        
        if (grade == 5) {
            System.out.println("Отлично! Ты молодец!");
        } else if (grade == 4) {
            System.out.println("Хорошо! Но можно и лучше.");
        } else if (grade == 3) {
            System.out.println("Удовлетворительно. Нужно подтянуть знания.");
        } else if (grade == 2) {
            System.out.println("Плохо. Садись, два!");
        } else {
            System.out.println("Такой оценки не бывает!");
        }
    }
}

Важно: Java проверяет условия по порядку. Как только найдёт истинное, остальные пропускаются.

Логические операторы: И, ИЛИ, НЕ

Иногда нужно проверить несколько условий сразу. Например: "Если на улице солнечно И температура выше 25, идём на пляж". Для этого есть логические операторы:

  • && (И) — истина, когда оба условия истинны
  • || (ИЛИ) — истина, когда хотя бы одно условие истинно
  • ! (НЕ) — меняет истину на ложь и наоборот
public class LogicalOperators {
    public static void main(String[] args) {
        boolean isSunny = true;
        int temperature = 30;
        boolean hasUmbrella = false;
        
        // И: солнце И тепло
        if (isSunny && temperature > 25) {
            System.out.println("Идём на пляж! 🏖️");
        }
        
        // ИЛИ: дождь ИЛИ снег
        boolean isRainy = false;
        boolean isSnowy = true;
        if (isRainy || isSnowy) {
            System.out.println("Остаёмся дома.");
        }
        
        // НЕ: если нет зонта
        if (!hasUmbrella) {
            System.out.println("Зонт не нужен, но на всякий случай возьми.");
        }
        
        // Сложное условие
        int age = 16;
        boolean withParents = true;
        
        // Можно войти в кино, если возраст >= 18 ИЛИ есть родители
        if (age >= 18 || withParents) {
            System.out.println("Проходите в кино!");
        } else {
            System.out.println("Извините, вам нельзя.");
        }
    }
}

Тернарный оператор: короткая запись

Для простых условий есть короткая запись — тернарный оператор ? :. Это как if-else в одной строке:

public class TernaryExample {
    public static void main(String[] args) {
        int score = 85;
        // Если score >= 60, то "Сдал", иначе "Не сдал"
        String result = (score >= 60) ? "Сдал" : "Не сдал";
        System.out.println("Результат: " + result);
        
        // Можно даже вкладывать, но не злоупотребляй!
        int age = 20;
        String status = (age < 13) ? "Ребёнок" : 
                       (age < 18) ? "Подросток" : "Взрослый";
        System.out.println("Статус: " + status);
    }
}

Часть 2: Циклы — "Повторяй, пока..."

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

Представь, что тебе нужно написать "Я люблю программировать!" 100 раз. Писать 100 строк кода — скучно и долго. Циклы решают эту проблему. Они позволяют выполнять один и тот же блок кода много раз.

В Java есть три вида циклов:

  • while — "пока условие истинно, делай"
  • do-while — "сделай хотя бы раз, потом проверяй"
  • for — "для каждого значения от ... до ..."

Цикл while: "Проверяй сначала"

Цикл while работает как охранник в клубе: сначала проверяет условие, потом пускает внутрь. Если условие ложно сразу — код не выполнится ни разу.

public class WhileExample {
    public static void main(String[] args) {
        int count = 1; // Счётчик
        
        // Пока счётчик меньше или равен 5, печатаем сообщение
        while (count <= 5) {
            System.out.println("Строка номер " + count);
            count++; // Увеличиваем счётчик на 1 (count = count + 1)
        }
        
        System.out.println("Цикл завершён! count = " + count);
        
        // Пример: обратный отсчёт
        int seconds = 10;
        System.out.println("Обратный отсчёт:");
        while (seconds > 0) {
            System.out.println(seconds + "...");
            seconds--;
        }
        System.out.println("ПУСК! 🚀");
    }
}

Важно! Если забыть увеличивать счётчик, цикл станет бесконечным. Компьютер зависнет или программа уйдёт в бесконечный цикл. Всегда проверяй, что условие когда-нибудь станет ложным.

Цикл do-while: "Сделай хотя бы раз"

Этот цикл похож на while, но с одним отличием: он сначала выполняет код, а потом проверяет условие. Гарантирует хотя бы одно выполнение. Как зубной врач: сначала смотрит, потом спрашивает "больно?"

public class DoWhileExample {
    public static void main(String[] args) {
        int number = 100;
        
        do {
            System.out.println("Число: " + number);
            number++;
        } while (number < 5); // Условие ложно, но код выполнился один раз!
        
        System.out.println("После цикла number = " + number);
        
        // Практичный пример: игра "Угадай число"
        // Представь, что у нас есть генератор случайных чисел
        java.util.Scanner scanner = new java.util.Scanner(System.in);
        int secretNumber = 7;
        int guess;
        
        do {
            System.out.print("Угадай число от 1 до 10: ");
            guess = scanner.nextInt();
            if (guess < secretNumber) {
                System.out.println("Слишком мало!");
            } else if (guess > secretNumber) {
                System.out.println("Слишком много!");
            }
        } while (guess != secretNumber);
        
        System.out.println("Поздравляю! Ты угадал!");
    }
}

Цикл for: "Для каждого..."

Цикл for — самый популярный. Он компактно объединяет инициализацию, условие и изменение счётчика в одной строке. Идеален, когда знаешь точное количество повторений.

public class ForExample {
    public static void main(String[] args) {
        // Структура: for (начало; условие; шаг) { тело }
        // Выведем числа от 1 до 10
        for (int i = 1; i <= 10; i++) {
            System.out.print(i + " ");
        }
        System.out.println(); // Переход на новую строку
        
        // Обратный порядок: от 10 до 1
        for (int i = 10; i >= 1; i--) {
            System.out.print(i + " ");
        }
        System.out.println();
        
        // Чётные числа от 2 до 20
        for (int i = 2; i <= 20; i += 2) {
            System.out.print(i + " ");
        }
        System.out.println();
        
        // Таблица умножения на 3
        System.out.println("Таблица умножения на 3:");
        for (int i = 1; i <= 10; i++) {
            System.out.println("3 × " + i + " = " + (3 * i));
        }
    }
}

Вложенные циклы: "Цикл в цикле"

Иногда нужно выполнить цикл внутри другого цикла. Например, нарисовать прямоугольник из звёздочек или таблицу умножения.

public class NestedLoops {
    public static void main(String[] args) {
        // Рисуем прямоугольник 5×7 из звёздочек
        System.out.println("Прямоугольник 5×7:");
        for (int row = 1; row <= 5; row++) { // Внешний цикл - строки
            for (int col = 1; col <= 7; col++) { // Внутренний - столбцы
                System.out.print("* ");
            }
            System.out.println(); // Переход на новую строку
        }
        
        // Таблица умножения от 1 до 5
        System.out.println("\nТаблица умножения:");
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5; j++) {
                System.out.print((i * j) + "\t"); // \t - табуляция
            }
            System.out.println();
        }
        
        // Треугольник из звёздочек
        System.out.println("\nТреугольник:");
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("* ");
            }
            System.out.println();
        }
    }
}

Управление циклами: break и continue

Иногда нужно прервать цикл досрочно (break) или пропустить итерацию (continue).

public class BreakContinue {
    public static void main(String[] args) {
        // break: прерывает цикл полностью
        System.out.println("Поиск числа 7:");
        for (int i = 1; i <= 10; i++) {
            if (i == 7) {
                System.out.println("Нашли число 7! Останавливаемся.");
                break; // Выходим из цикла
            }
            System.out.println("Проверяем: " + i);
        }
        
        // continue: пропускает текущую итерацию
        System.out.println("\nЧисла от 1 до 10, кроме 5:");
        for (int i = 1; i <= 10; i++) {
            if (i == 5) {
                continue; // Пропускаем 5
            }
            System.out.print(i + " ");
        }
        System.out.println();
        
        // Пример: выводим только чётные числа
        System.out.println("\nЧётные числа от 1 до 10:");
        for (int i = 1; i <= 10; i++) {
            if (i % 2 != 0) { // Если нечётное
                continue; // Пропускаем
            }
            System.out.print(i + " ");
        }
    }
}

Часть 3: Комбинируем условия и циклы

Теперь самое интересное! Условия и циклы работают вместе, как шестерёнки в часах. Вот несколько примеров:

Пример 1: Поиск делителей числа

public class FindDivisors {
    public static void main(String[] args) {
        int number = 28;
        System.out.print("Делители числа " + number + ": ");
        
        for (int i = 1; i <= number; i++) {
            if (number % i == 0) { // Если i делит number без остатка
                System.out.print(i + " ");
            }
        }
        System.out.println();
        
        // Проверка на простое число
        number = 17;
        boolean isPrime = true;
        
        if (number < 2) {
            isPrime = false;
        } else {
            for (int i = 2; i < number; i++) {
                if (number % i == 0) {
                    isPrime = false;
                    break; // Нашли делитель - число не простое
                }
            }
        }
        
        if (isPrime) {
            System.out.println(number + " - простое число");
        } else {
            System.out.println(number + " - составное число");
        }
    }
}

Пример 2: Игра "Угадай число" с подсказками

import java.util.Scanner;

public class GuessGame {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int secretNumber = 42; // Загаданное число
        int guess;
        int attempts = 0;
        
        System.out.println("Я загадал число от 1 до 100. Угадай его!");
        
        while (true) { // Бесконечный цикл, пока не угадаем
            System.out.print("Твой вариант: ");
            guess = scanner.nextInt();
            attempts++;
            
            if (guess < secretNumber) {
                System.out.println("Слишком мало! Попробуй ещё.");
            } else if (guess > secretNumber) {
                System.out.println("Слишком много! Попробуй ещё.");
            } else {
                System.out.println("Поздравляю! Ты угадал с " + attempts + " попытки!");
                break; // Выходим из цикла
            }
            
            // Подсказка после 5 попыток
            if (attempts == 5) {
                System.out.println("Подсказка: число двузначное.");
            }
        }
        
        scanner.close();
    }
}

Пример 3: Вывод чисел Фибоначчи

public class Fibonacci {
    public static void main(String[] args) {
        int n = 10; // Сколько чисел вывести
        int first = 0;
        int second = 1;
        
        System.out.println("Первые " + n + " чисел Фибоначчи:");
        
        for (int i = 1; i <= n; i++) {
            System.out.print(first + " ");
            
            // Вычисляем следующее число
            int next = first + second;
            first = second;
            second = next;
        }
        System.out.println();
        
        // Альтернатива с while
        System.out.println("\nЕщё раз, но через while:");
        first = 0;
        second = 1;
        int count = 0;
        
        while (count < n) {
            System.out.print(first + " ");
            int next = first + second;
            first = second;
            second = next;
            count++;
        }
    }
}

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

Теперь твоя очередь! Попробуй решить эти задачи. Не бойся ошибаться — ошибки помогают учиться.

Задание 1: Калькулятор оценок

Напиши программу, которая:

  1. Спрашивает у пользователя его оценку (число от 1 до 5)
  2. Выводит текстовое описание:
    • 5 — "Отлично! Ты гений!"
    • 4 — "Хорошо, но можно лучше"
    • 3 — "Удовлетворительно, старайся"
    • 2 — "Плохо, нужно заниматься"
    • 1 — "Ужасно! Срочно за учебники!"
    • Любое другое число — "Некорректная оценка"
  3. Используй if-else if-else

Задание 2: Таблица умножения для любого числа

Напиши программу, которая:

  1. Спрашивает у пользователя число
  2. Выводит таблицу умножения для этого числа от 1 до 10
  3. Используй цикл for
  4. Пример: пользователь вводит 7, программа выводит:
    7 × 1 = 7
    7 × 2 = 14
    7 × 3 = 21
    ...
    7 × 10 = 70

Задание 3: Угадай число (сложный уровень)

Напиши программу, которая:

  1. Загадывает случайное число от 1 до 50 (используй int secret = (int)(Math.random() * 50) + 1;)
  2. Даёт пользователю 7 попыток угадать
  3. После каждой попытки говорит "больше" или "меньше"
  4. Если пользователь угадал — поздравляет и показывает количество попыток
  5. Если попытки закончились — показывает загаданное число
  6. Используй цикл с условием и break

Подсказка для задания 3:

int secret = (int)(Math.random() * 50) + 1;
int maxAttempts = 7;
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
    // твой код
}

Удачи! 🎉 Помни: программирование — это как спорт. Чем больше тренируешься, тем лучше получается!