Урок 8. Циклы: for, while и do while


В этой статье из моего бесплатного курса уроков Java я буду обсуждать использование циклов в Java. Циклы позволяют программе выполнять повторяющиеся задачи или быстро перебирать большие объемы данных.

Введение

Представьте, что я хочу отправить электронное письмо каждому подписчику моей рассылки. Теперь, если бы мне пришлось вручную отправлять электронную почту каждому подписчику, я был бы занят в течение нескольких дней. Вместо этого я хочу написать программу, которая поможет мне сделать это. Поэтому я пишу такую программу:

sendEmail(Игорь);
sendEmail(Иван);

sendEmail(Григорий);

[…]

sendEmail(Julia); // 99,999 
Для каждого нового абонента мне придется расширить свой код и добавить новый вызов “sendEmail". Это не намного лучше, чем мой ручной подход раньше. Чтобы исправить это, я хочу сгруппировать всех моих подписчиков в список, а затем сказать моему компьютеру, чтобы равномерно отправить электронное письмо каждому подписчику в моем списке. Вот где циклы вступают в игру. Это способ выразить "например: я хочу выполнить этот код 99 999 раз".

Цикл for

Первый цикл, который я буду обсуждать, - это "for". Он называется циклом for, потому что он говорит программе: "выполните этот цикл определенное количество раз". Наш передний контур имеет три секции.

Первый раздел присваивает и определяет переменную, такую как "int i = 0". Он использует эту переменную для итерации.

Примечание: как правило, вы можете использовать любое имя переменной, но в этом контексте обычно используются однобуквенные имена переменных. Это, на первый взгляд, может показаться нелогичным и противоречащим рекомендации использовать описательные имена переменных. "i" в этом контексте подходит, потому что однобуквенные переменные, такие как "i" или "j", обычно используются для встречных переменных в циклах for.

Буква "i" используется специально, потому что она обозначает слово "индекс". "j" используется в тех случаях, когда вам нужны два разных индекса – просто потому, что “j" является следующей буквой в алфавите после "i". Наконец, длина имени переменной должна быть связана с длиной блока кода, в котором она видна. Если у вас есть большой блок кода, и вы не можете непосредственно увидеть, где была определена эта переменная, она должна иметь описательное имя. Однако циклы for предпочтительно короткие – в лучшем случае просто охватывающие более 3 строк кода – так что "i" как переменная индекса на самом деле должна быть очень описательной в этом случае, и любое другое имя, кроме "i" или "j" для простой переменной индекса цикла for, может даже запутать других разработчиков.

Второй раздел определяет, сколько раз мы хотим выполнить код внутри цикла for. В Примере ниже мы используем "i < 4". Важно помнить, что в программировании принято начинать значения индекса с 0, а не с 1. Поскольку мы хотим, чтобы наш код повторялся четыре раза, мы говорим "i < 4", что означает, что код будет выполняться, когда наше значение "i" равно 0, 1, 2 или 3.

Последний раздел определяет приращение нашей переменной. Он может либо увеличить значение, либо уменьшить его. В нашем примере мы увеличиваем его на 1, используя "i++", что увеличивает наше значение "i" на 1. Это происходит после завершения блока кода внутри цикла for. Если бы мы напечатали наши значения "i" внутри кода нашего цикла for, он бы напечатал "0,1,2,3", а не 4. "i" увеличится до 4 после того, как наш код будет выполнен в четвертый раз, но так как это не удовлетворяет условию в средней части нашего цикла for, код внутри цикла перестает выполняться.

public void shouldReturnNumberOfPersonsInLoop() {

Person person1;

for (int i = 0; i < 4; i++) {

person1 = new Person();

}

assertEquals(4, Person.numberOfPersons());

}
Чтобы переформулировать логику цикла for, первоначально "i" присваивается значение 0. После выполнения нашего кода внутри цикла, "i" теперь увеличивается на 1, так что теперь он имеет значение 1. Условие, которое мы написали в середине раздела, гласит, что "i < 4" для выполнения нашего кода. Поскольку это оценивается как истина, код выполняется снова, увеличивает i на 1 и продолжает повторяться. Первый раз условие принимает значение false, когда "i" имеет значение 4. На этом этапе цикл завершается, и мы выполним наш код 4 раза.

Вы также можете увеличить число больше 1. Предположим, что мы увеличили предыдущий пример, используя "i = i + 2", вы создадите только два объекта person. Это потому, что теперь мы проходим через цикл только дважды, когда i = 0 и i = 2.

Одна из вещей, которую вы должны остерегаться при создании циклов, - это возможность бесконечного цикла. Например, если наше условие в примере выше - "i < 1", и вы постоянно уменьшаете значение "i", используя "i–", цикл будет продолжаться вечно, создавать множество объектов и в конечном итоге, вероятно, приведет к сбою вашего компьютера. Каждая из трех секций цикла for является необязательной. Технически можно даже оставить все три раздела пустыми и поставить только две точки с запятой. Однако будьте осторожны, потому что таким образом вы создадите цикл, который никогда не завершится ("бесконечный цикл").

Цикл while

Наш второй цикл является циклом. Цикл while позволяет коду повторно выполняться при выполнении логического условия. Базовый синтаксис для цикла while показан ниже:

while (условие) {

    // Код, который выполняется, если условие истинно

}
Цикл while полезен, когда у вас есть условие, которое вычисляется динамически. Мы могли бы создать объект person внутри цикла while, динамически изменяя значение переменной "i".

public void shouldReturnNumberOfPersonsInLoop() {

    Person person1;

    int i = 0;

    while (i < 4) {
        person1 = new Person();
        i++;
    }
    assertEquals(4, Person.numberOfPersons());
}
В примере ниже мы снова создаем четыре объекта person. Опять же, мы начинаем с "i", равным 0, и увеличиваем его на 1, пока "i<4". Когда это условие становится ложным и значение i равно 4, цикл завершается.

Цикл do-while

Третий тип цикла, который мы рассмотрим в этой статье - цикл do-while. Цикл do-while выполняет код по крайней мере один раз, а затем повторно выполняет блок на основе логического условия. Он функционирует как цикл времени после первой итерации, что происходит автоматически. В примере ниже мы создаем четыре объекта Person с помощью цикла do-while.

@Test
    public void shouldReturnNumberOfPersonsInLoop() {
        Person person1;
        int i = 0;
        do {
            person1 = new Person();
            i++;
        } while (i < 4);
        assertEquals(4, Person.numberOfPersons());
}
Существует также четвертый тип цикла, для каждого цикла. Цикл, который вы должны выбрать, зависит от необходимой вам логики. Все четыре цикла эквивалентны с точки зрения функциональности, но каждый цикл выражает логику в другом стиле. Вы всегда должны стараться использовать цикл, который легче всего понять тому, кто читает ваш код, и который имеет наибольший смысл в контексте.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, уроки по java, java, циклы




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Учимся парсить сайты на C#: часть 1
Урок 1. Установка Laravel, php, миграции
Урок 6. Немного роутинга и вывод из БД Laravel