Перейти к содержанию
Educora
Начальный18 мин5 / 18

Циклы и массивы

Повторяй действия с помощью циклов for, while и do-while, храни и обрабатывай много значений в массивах.

Проверь себя
В этом уроке ты узнаешь
  • Писать циклы for, while и do-while и выбирать между ними
  • Управлять циклом с помощью break и continue
  • Создавать массив, читать и изменять его элементы, находить их сумму и максимум

Представь, что нужно напечатать поздравление каждому из 30 учеников класса. Можно 30 раз написать println, но что, если учеников 3000? Компьютеры прекрасно умеют без устали повторять одну и ту же работу — для этого существуют циклы. А чтобы хранить много значений в одном месте, используют массивы.

Циклы for и while

Цикл for удобен, когда число шагов известно заранее. В его заголовке три части: начало (int i = 1), условие (i <= 5) и шаг (i++). Цикл while повторяется, пока условие истинно, — он подходит, когда заранее неизвестно, сколько будет повторений.

Java
public class Main {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            System.out.print(i + " ");
        }
        System.out.println();
        int sum = 0;
        for (int i = 2; i <= 10; i += 2) {
            sum += i;
        }
        System.out.println("Sum of even numbers: " + sum);
        int balance = 100;
        int years = 0;
        while (balance < 200) {
            balance += balance / 10;
            years++;
        }
        System.out.println(years + " years, balance " + balance);
    }
}
Ожидаемый результат
1 2 3 4 5 
Sum of even numbers: 30
8 years, balance 212

В последней части Эльвин кладёт в банк 100 манатов, и каждый год к сумме прибавляется 10%. Мы не знаем, сколько лет придётся ждать, поэтому используем цикл while: он работает, пока баланс не дойдёт до 200. balance / 10 — целочисленное деление, поэтому проценты каждый год округляются вниз до целых манатов.

Интерактив
Загрузка симуляции…
Точная версия того же расчёта: если не отбрасывать дробные части, через 8 лет получится чуть больше 214 манатов. А тип int в программе каждый год отбрасывает гяпики.

do-while, break и continue

Цикл do-while проверяет условие в конце, поэтому его тело выполняется хотя бы один раз, даже если условие ложно. break сразу завершает цикл, а continue пропускает остаток текущего шага и переходит к следующему.

Java
public class Main {
    public static void main(String[] args) {
        int tries = 0;
        do {
            tries++;
            System.out.println("Attempt " + tries);
        } while (tries < 0);
        for (int i = 1; i <= 10; i++) {
            if (i % 3 == 0) {
                continue;
            }
            if (i > 7) {
                break;
            }
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
Ожидаемый результат
Attempt 1
1 2 4 5 7 

Условие tries < 0 ложно с самого начала, но «Attempt 1» всё равно напечаталось. Во втором цикле 3 и 6 пропущены из-за continue, а на 8 break полностью остановил цикл, поэтому 9 и 10 не напечатаны.

Массивы

Определение
Массив

Объект, который хранит по порядку фиксированное количество значений одного типа. К элементам обращаются по индексу, начиная с 0, а длина массива после создания не меняется.

Java
public class Main {
    public static void main(String[] args) {
        int[] scores = {85, 92, 78, 64, 99};
        System.out.println("First: " + scores[0]);
        System.out.println("Count: " + scores.length);
        scores[3] = 70;
        int sum = 0;
        int max = scores[0];
        for (int s : scores) {
            sum += s;
            if (s > max) {
                max = s;
            }
        }
        System.out.println("Average: " + (double) sum / scores.length);
        System.out.println("Max: " + max);
        String[] days = new String[3];
        System.out.println(days[0]);
        double[] temps = new double[2];
        System.out.println(temps[1]);
    }
}
Ожидаемый результат
First: 85
Count: 5
Average: 84.8
Max: 99
null
0.0
  • int[] scores = {85, 92, ...}; создаёт массив с готовыми значениями, а new String[3] — массив из 3 пустых ячеек.
  • scores.length — количество элементов (без скобок: это поле, а не метод).
  • for (int s : scores) — цикл for-each: он по очереди передаёт каждый элемент массива в переменную s.
  • Элементы нового массива заполняются автоматически: числа — 0 или 0.0, boolean — false, а объекты (например, String) — null.

Класс Arrays и двумерные массивы

В классе java.util.Arrays есть готовые инструменты для массивов: Arrays.toString() превращает массив в читаемый текст, а Arrays.sort() упорядочивает элементы по возрастанию. Элементами массива могут быть и другие массивы — такой двумерный массив похож на таблицу: первый индекс — строка, второй — столбец.

Java
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = {42, 7, 19, 3, 25};
        System.out.println(Arrays.toString(nums));
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
        int[][] table = new int[3][4];
        for (int r = 0; r < table.length; r++) {
            for (int c = 0; c < table[r].length; c++) {
                table[r][c] = (r + 1) * (c + 1);
            }
        }
        for (int[] row : table) {
            System.out.println(Arrays.toString(row));
        }
        System.out.println(table[2][3]);
    }
}
Ожидаемый результат
[42, 7, 19, 3, 25]
[3, 7, 19, 25, 42]
[1, 2, 3, 4]
[2, 4, 6, 8]
[3, 6, 9, 12]
12

Главное

  • for (начало; условие; шаг) используют, когда число шагов известно, а while — чтобы повторять, пока выполняется условие.
  • do-while проверяет условие в конце и выполняет тело хотя бы один раз.
  • break завершает цикл, а continue переходит к следующему шагу.
  • Длина массива фиксирована, индексы идут от 0 до length - 1.
  • Arrays.toString() помогает напечатать массив, а Arrays.sort() — отсортировать его.

Проверь себя

Вопросов: 10. Каждый правильный ответ приносит XP.

1 / 10
Сколько раз выполнится цикл for (int i = 0; i < 4; i++)?