1. Циклы в нашей жизни

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

  • Положить первую страницу на сканер
  • Нажать кнопку сканировать
  • Положить следующую страницу

Вручную это делать сложно. Было бы хорошо, если бы этот процесс можно было как-то автоматизировать.

Или еще пример: я хочу пометить все непрочитанные письма в почтовом ящике как спам. Когда-то их нужно было выделять по одному и помечать как спам.

Но программисты народ ленивый, поэтому эту функцию уже давно автоматизировали: вы просто выделяете любой список писем и нажимаете кнопку «пометить как спам», а ваш почтовый клиент сам проходится по этому списку и переносит каждое письмо в папку спам.

Что тут сказать? Удобно, когда компьютер или программа могут сделать сотни и тысячи рутинных операций за один клик. Сейчас этому научитесь и вы.


2. Цикл while

Оператор if-else существенно расширил наши возможности программирования: теперь можно писать программы, которые выполняют разные действия в разных ситуациях. Но есть еще одна вещь, которая сделает наши программы на порядок мощнее — это циклы.

В Java есть 4 вида циклов: while, for, for-each и do-while. Сейчас мы разберем самый первый из них.

Оператор цикла while очень простой и состоит всего из двух частей: условие и тело цикла. Тело цикла выполняется снова и снова, пока условие равно true. Общий вид цикла while такой:

while (условие)
   команда;
Запись цикла while с одной командой
while (условие)
{
   блок команд
}
Запись цикла while с блоком команд

Все очень просто. Команда или блок команд выполняются снова и снова, пока условие цикла истинно — равно true.

Это работает так: сначала проверяется условие, и если оно истинно, выполняется тело цикла (команда или блок команд), затем снова проверяется условие и снова выполняется тело цикла. И так до тех пор, пока условие не станет ложным.

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

Если же в самый первый раз условие было ложно, тело цикла не выполнится ни разу.


3. Примеры циклов

Вот несколько практических примеров использования циклов.

Код Пояснение
int  n = 5;
while (n > 0)
{
   System.out.println(n);
   n--;
}
На экран будут выведены 5 строк:
5
4
3
2
1
Код Пояснение
int  n = 0;
while (n < 10)
{
   System.out.println(n);
   n++;
}
На экран будут выведены 10 строк:
0
1
...
8
9
Код Пояснение
Scanner console = new Scanner(System.in);
while(console.hasNextInt())
{
   int x = console.nextInt();
} 
Программа считывает с клавиатуры числа до тех пор, пока вводят именно числа.
Код Пояснение
while (true)
   System.out.println("C");
Программа будет бесконечно печатать на экран букву С.
Код Пояснение
Scanner console = new Scanner(System.in);
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
Программа будет вводить строки с клавиатуры,

пока не будет введена строка exit.

Функция equals() в предыдущем примере используется для сравнения строк. Если строки равны, функция вернет результат — true, если строки не равны, то вернет false.



4. Цикл в цикле

Во время знакомства с условным оператором вы увидели, что с его помощью можно реализовывать сложную логику, если комбинировать несколько условных операторов. Другими словами, использовать if внутри if-а.

С циклами тоже так можно. Чтобы написать цикл в цикле, нужно в теле первого цикла написать второй. Выглядеть это будет примерно так:

while (условие внешнего цикла)
{
   while (условие внутреннего цикла)
   {
     блок команд
   }
}
Цикл whileблоком команд) внутри другого цикла while

Разберем три задачи.

Задача 1. Допустим, мы хотим написать программу, которая бы выводила на экран 4 раза слово Мама. Цикл — это именно то, что нам нужно. И примерно так выглядел бы наш код:

Код Пояснение
int  n = 0;
while (n < 4)
{
   System.out.println("Мама");
   n++;
}
На экран будут выведены 4 строки:
Мама
Мама
Мама
Мама

Задача 2. Мы хотим написать программу, которая бы выводила в одну строку 5 букв А. Для этого нам опять нужен цикл. Вот как будет выглядеть этот код

Код Пояснение
int n = 0;
while (n < 5)
{
   System.out.print("A");
   n++;
}
Вместо println пишем print, иначе каждая буква A будет в отдельной строке.

На экран будет выведено:
AAAAA

Задача 3. Мы хотим вывести на экран прямоугольник из букв А размером в 4 строки и 5 столбцов. А вот для этого нам уже нужны вложенные циклы. Просто возьмем первый пример, где мы выводим 4 строки и заменим код по выводу одной строки на код из второго примера.

Код Пояснение
int n = 0;

while (n < 4) { int m = 0;
while (m < 5) { System.out.print("А"); m++; }
System.out.println(); n++; }
 
Внешний цикл обозначен фиолетовым цветом, он использует переменную n для подсчета количества витков цикла.

Внутренний цикл обозначен зеленым цветом. Для подсчета количества витков цикла он использует переменную m.

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

На экран будет выведено:
ААААА
ААААА
ААААА
ААААА

Внешний и внутренний циклы должны использовать разные переменные для подсчета количества уже сделанных витков. Также пришлось добавить команду System.out.println() после внутреннего цикла, т.к он печатает буквы А в одну строку, и после вывода всех букв кто-то должен перенести курсор на новую строчку.



5. Сравнение циклов: Java vs Pascal

Многие из вас изучали в школе Паскаль, поэтому чтобы облегчить вам понимание материала, приведем сравнение циклов while в языке Pascal и в Java. Если вы не знаете Pascal, просто пропустите этот материал.

Pascal Java
i := 3;
While i >= 0 Do
   Begin
      WriteLn(i);
      i := i - 1;
   End;
int i = 3;
while (i >= 0)
{
   System.out.println(i);
   i--;
}
i := 0;
While i < 3 Do
   Begin
      WriteLn(i);
      i := i + 1;
   End;
int i = 0;
while (i < 3)
{
   System.out.println(i);
   i++;
}
IsExit := False;
While Not isExit Do
   Begin
      ReadLn(s);
      isExit :=  (s = 'exit');
   End;
boolean isExit = false;
while (!isExit)
{
   String s = console.nextLine();
   isExit = s.equals("exit");
}
While True Do
   WriteLn('C');
while (true)
   System.out.println("C");
While True Do
   Begin
     ReadLn(s);
     If s = 'exit' Then
       Break;
   End;
while (true)
{
   String s = console.nextLine();
   if (s.equals("exit"))
     break;
}