> 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-9.-cikly-povtorenie-deistvii.md).

# Глава 9. Циклы: повторение действий

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

Представьте, что нужно вывести числа от 1 до 5.

Можно написать так:

```java
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
```

Для пяти чисел это терпимо.

А если нужно вывести числа от 1 до 1000?

Писать тысячу строк вручную — это не программирование, а наказание за неуважение к автоматизации.

Циклы нужны для повторения действий.

С помощью цикла можно сказать программе:

```
Повторяй это действие, пока выполняется условие.
```

***

### 9.2. Что такое цикл

Цикл — управляющая конструкция, которая выполняет блок кода несколько раз.

Пример:

```java
for (int i = 1; i <= 5; i++) {
    System.out.println(i);
}
```

Результат:

```
1
2
3
4
5
```

Вместо пяти строк вывода мы написали один цикл.

***

### 9.3. Цикл for

Цикл `for` обычно используется, когда заранее известно количество повторений.

Общий вид:

```java
for (начало; условие; изменение) {
    // тело цикла
}
```

Пример:

```java
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
```

Разберём:

```java
int i = 0
```

Создаётся счётчик цикла.

```java
i < 5
```

Условие продолжения цикла.

```java
i++
```

Изменение счётчика после каждой итерации.

***

### 9.4. Что такое итерация

Итерация — одно выполнение тела цикла.

Пример:

```java
for (int i = 0; i < 3; i++) {
    System.out.println("Привет");
}
```

Тело цикла выполнится три раза.

Значит, будет три итерации.

Результат:

```
Привет
Привет
Привет
```

***

### 9.5. Пошаговый разбор for

Код:

```java
for (int i = 0; i < 3; i++) {
    System.out.println(i);
}
```

Пошагово:

```
1. i = 0
2. Проверка: i < 3 → true
3. Вывод: 0
4. i++ → i = 1

5. Проверка: i < 3 → true
6. Вывод: 1
7. i++ → i = 2

8. Проверка: i < 3 → true
9. Вывод: 2
10. i++ → i = 3

11. Проверка: i < 3 → false
12. Цикл завершён
```

Результат:

```
0
1
2
```

***

### 9.6. Почему часто начинают с 0

В программировании часто счёт начинают с 0, потому что индексы массивов начинаются с 0.

Пример массива:

```java
int[] numbers = {10, 20, 30};
```

Индексы:

```
numbers[0] → 10
numbers[1] → 20
numbers[2] → 30
```

Поэтому цикл для массива обычно выглядит так:

```java
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}
```

***

### 9.7. Условие `i < 5` и `i <= 5`

Код:

```java
for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
```

Выведет:

```
0
1
2
3
4
```

Код:

```java
for (int i = 0; i <= 5; i++) {
    System.out.println(i);
}
```

Выведет:

```
0
1
2
3
4
5
```

Разница в том, включается ли последнее значение.

Для массивов почти всегда используют:

```java
i < array.length
```

а не:

```java
i <= array.length
```

Потому что последний индекс массива — `length - 1`.

***

### 9.8. Цикл в обратную сторону

```java
for (int i = 5; i >= 1; i--) {
    System.out.println(i);
}
```

Результат:

```
5
4
3
2
1
```

Здесь счётчик уменьшается через `i--`.

***

### 9.9. Шаг больше единицы

Можно увеличивать счётчик не на 1, а на другое значение.

```java
for (int i = 0; i <= 10; i += 2) {
    System.out.println(i);
}
```

Результат:

```
0
2
4
6
8
10
```

Так удобно выводить чётные числа.

***

### 9.10. Цикл while

Цикл `while` используется, когда заранее неизвестно, сколько раз нужно повторять действие.

Общий вид:

```java
while (условие) {
    // тело цикла
}
```

Пример:

```java
int count = 0;

while (count < 3) {
    System.out.println(count);
    count++;
}
```

Результат:

```
0
1
2
```

***

### 9.11. Когда использовать for, а когда while

`for` удобен, когда известно количество повторений.

Пример:

```java
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}
```

`while` удобен, когда повторение зависит от условия.

Пример меню:

```java
while (true) {
    System.out.println("1 — продолжить");
    System.out.println("2 — выйти");

    int command = scanner.nextInt();

    if (command == 2) {
        break;
    }
}
```

***

### 9.12. Бесконечный цикл

Бесконечный цикл — цикл, который не заканчивается.

```java
while (true) {
    System.out.println("Работаю");
}
```

Иногда это ошибка, иногда — нормальная конструкция.

Например, меню программы может работать бесконечно, пока пользователь не выберет выход.

```java
while (true) {
    System.out.println("1 — добавить");
    System.out.println("2 — выйти");

    int command = scanner.nextInt();

    if (command == 2) {
        break;
    }
}
```

***

### 9.13. break

`break` завершает цикл.

Пример:

```java
for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;
    }

    System.out.println(i);
}
```

Результат:

```
1
2
3
4
```

Когда `i` стало равно 5, цикл завершился.

***

### 9.14. continue

`continue` пропускает текущую итерацию.

Пример:

```java
for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue;
    }

    System.out.println(i);
}
```

Результат:

```
1
2
4
5
```

Число 3 пропущено.

***

### 9.15. Накопление суммы

Одна из самых частых задач с циклами — сумма.

Задача: найти сумму чисел от 1 до 5.

```java
int sum = 0;

for (int i = 1; i <= 5; i++) {
    sum += i;
}

System.out.println(sum);
```

Пошагово:

```
sum = 0
i = 1 → sum = 1
i = 2 → sum = 3
i = 3 → sum = 6
i = 4 → sum = 10
i = 5 → sum = 15
```

Результат:

```
15
```

***

### 9.16. Подсчёт количества

Пример: посчитать количество чётных чисел от 1 до 10.

```java
int count = 0;

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        count++;
    }
}

System.out.println(count);
```

Результат:

```
5
```

***

### 9.17. Вложенные циклы

Цикл может находиться внутри другого цикла.

Пример:

```java
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        System.out.println(i + " " + j);
    }
}
```

Результат:

```
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
```

Вложенные циклы нужны для:

* таблиц;
* двумерных массивов;
* перебора пар элементов;
* простых алгоритмов сортировки.

***

### 9.18. Таблица умножения

```java
for (int i = 1; i <= 10; i++) {
    for (int j = 1; j <= 10; j++) {
        System.out.println(i + " * " + j + " = " + (i * j));
    }
}
```

Здесь внешний цикл отвечает за первое число, внутренний — за второе.

***

### 9.19. Циклы в Android

В Android циклы тоже используются, но не для ожидания нажатия кнопки.

Плохо:

```java
while (true) {
    // ждать нажатия кнопки
}
```

Так делать нельзя. Приложение зависнет.

В Android действия пользователя обрабатываются через события:

```java
button.setOnClickListener(v -> {
    // код выполнится при нажатии
});
```

Но циклы нужны для обработки списков:

```java
for (Student student : students) {
    // обработка студента
}
```

Например, можно посчитать средний балл студентов или найти товар с максимальной ценой.

***

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

#### Ошибка 1. Бесконечный цикл

```java
int i = 0;

while (i < 10) {
    System.out.println(i);
}
```

Переменная `i` не меняется. Условие всегда true.

Правильно:

```java
int i = 0;

while (i < 10) {
    System.out.println(i);
    i++;
}
```

***

#### Ошибка 2. Неверное условие в for

```java
for (int i = 0; i <= array.length; i++)
```

Для массива это ошибка. Последний индекс — `array.length - 1`.

Правильно:

```java
for (int i = 0; i < array.length; i++)
```

***

#### Ошибка 3. Сброс суммы внутри цикла

Плохо:

```java
for (int i = 1; i <= 5; i++) {
    int sum = 0;
    sum += i;
}
```

`sum` каждый раз создаётся заново.

Правильно:

```java
int sum = 0;

for (int i = 1; i <= 5; i++) {
    sum += i;
}
```

***

#### Ошибка 4. Не понимать, сколько раз выполнится цикл

```java
for (int i = 0; i < 5; i++)
```

Выполнится 5 раз: при `i = 0, 1, 2, 3, 4`.

***

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

#### Вопрос

Для чего нужны циклы?

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

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

***

#### Вопрос

Чем отличается `for` от `while`?

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

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

***

#### Вопрос

Что делает `break`?

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

> `break` немедленно завершает выполнение цикла или блока `switch`.

***

#### Вопрос

Что делает `continue`?

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

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

***

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

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

Выведите числа от 1 до 100.

***

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

Выведите все чётные числа от 1 до 50.

***

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

Найдите сумму чисел от 1 до N. Значение N вводит пользователь.

***

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

Пользователь вводит 5 чисел. Найдите их сумму.

***

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

Пользователь вводит 10 чисел. Посчитайте, сколько среди них положительных.

***

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

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

***

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

Реализуйте меню:

```
1 — сказать привет
2 — показать число 100
3 — выйти
```

Меню должно работать, пока пользователь не выберет выход.

***

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

1. Что такое цикл?
2. Что такое итерация?
3. Из каких частей состоит цикл `for`?
4. Когда лучше использовать `for`?
5. Когда лучше использовать `while`?
6. Что такое бесконечный цикл?
7. Для чего нужен `break`?
8. Для чего нужен `continue`?
9. Почему в циклах для массивов используют `i < array.length`?
10. Где циклы применяются в Android?
