(Java) Циклы. Цикл с параметром (for)


Представим ситуацию, когда нам надо вывести на экран одно и тоже слово, допустим слово "HELLO", 10 раз. Как нам поступить?
Можно взять и 10 раз написать команду cout << "HELLO";

А что если, надо не 10 раз, а 20, 30, 40 раз?, а если 200 раз? В этом случае копирование займет очень много времени. А если, необходимо, чтобы пользователь сам выбирать сколько раз ему вывести на экрна информацию? 

Чтобы справиться стакой задачей, нам поможет специальная конструкция, которая называется ЦИКЛ

Цикл - это алгоритмическая конструкция, в которой некоторая последовательность команд повторяется несколько раз.


В языке программирования Java, есть два вида циклов: цикл с переменной (for) и цикл с условием (while и do...while)

Начнем знакомство с циклами с первого вида.

ЦИКЛ С ПЕРЕМЕННОЙ ИЛИ С ИЗВЕСТНЫМ ЧИСЛОМ ШАГОВ (FOR)

Очень часто бывает, что мы знаем число повторений каких-либо действий или же м можем число повторений вычислить через известные нам данные. В некоторых языках программирования есть команда, которая на русском языке звучит как ПОВТОРИ (число раз) - то есть мы можем указать точное число повторений. 

Интересно проследить как работает этот цикл на машинном уровне:
1. в памяти выделяется определенная ячейка памяти и в нее записывается число повторений,
2. когда программа выполняет тело цикла один раз, содержимое этой ячейки (счетчик) уменьшается на единицу.
3. выполнение цикла заканчивается, когда в этой ячейке будет нуль.

В язывке программирования Java, нет такой конструкции, а есть конструкция for.  

Общая форма записи оператора цикла for выглядит следующим образом:
for (/*выражение1*/; /*выражение2*/; /*выражение3*/ )
{
      /*один оператор или блок операторов - тело цикла*/;
}
Данная конструкция требует, чтобы мы
1. явно выделили ячейку памяти, которая будет являться счетчиком, и задать ей начальное значение
2. прописали условие, при котором тело цикла будет выполняться
3. указали как будет менять значение в данной ячейке.

В практической части мы попробуем вывести на экран слово Hello 10 раз. А в дальнейших задачах разберем данную конструкцию подробнее.

Цикл for представляет собой средство пошагового выполнения повторяющихся действий. Давайте рассмотрим более подробно, как он устроен.

Обычно части цикла for выполняют следующие шаги: 
1. Установка начального значения. 
2. Выполнение проверки условия для продолжения цикла. 
3. Выполнение действий цикла. 
4. Обновление значения (значений), используемых в проверочном условии. 
и далее шаги 2-4 повторяются до тех пор пока условие выполняется. Как только условие становится ложным, цикл прекращаетсвою работу и выполяется оператор следующий за опеоратором цикла for.

Вернемся к общей форме записи оператора цикла и разберем подробнее все части
for (/*выражение1*/; /*выражение2*/; /*выражение3*/ )
{
      /*один оператор или блок операторов - тело цикла*/;
}

Выражение 1

отвечает за установку начального значения переменной цикла (счетчика), заканчивается точкой с запятой
Например :
вариант 1) i=0; //переменной цикла i присваиваем начальное значение равное нулю. При такой записи,
//переменная i должна быть объявлена до цикла

вариант 2) int i=0; //переменная i может быть объявлена сразу в заголовке цкикла, но
//в этом случае после работы цикла сотрется из памяти

вариант 3) ;  //отсутсвует инициализация и объявление переменной цикла вообще,
//в этом случае она может быть объявлена до цикла
Выражение 2
это условие продолжения цикла for, оно проверяется на истинность.

i<=10  // цикл будет выполняться, пока переменная i меньше или равна 10. 
Условие может быть любым
Выражение 3 
изменяет значение переменной-счетчика. Без этого значения цикл будет считаться бесконечным

i<=10  // цикл будет выполняться, пока переменная i меньше или равна 10. 
Условие может быть любым

Потренируемся в записи заголовка цикла for

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

В каждой части заголовка может быть несколько операторов, разделенных запятыми.
Примеры заголовков:
	for ( i = 0; i < 10; i ++ ) { ... }
        //стандартный заголовок
	for ( i = 0, x = 1.; i < 10; i += 2, x *= 0.1 ){ ... }   
        // в данном случае, используем две переменные, которые будут меняться после выполнения тела цикла - это переменные i и x
        // переменная i меняется с шагом 2 - i+=2 - сокращенная запись от  i=i+2
        // переменная x с каждым шагом увеличивается в 0,1 раз x=x*0,1 - сокращенно х*=0.1

Все программы с циклом for, которые мы до этого писали нельзя назвать универсальными. Потому что мы задавали сами число повторений тела цикла. 
А что делать, если количество повторений будет зависеть от какого-либо другого значения? Например, пользователь сам хочет задать количество повторений цикла.
Что делать в этом случае?
Все очень просто. Вместо числовых начальных и конечных значений, мы можем использовать любые переменные, которые могут как вычисляться, так и задаваться пользователем.

Например, нам нужно вывести квадраты чисел от 1 до N, где значение переменной N вводится с клавиатуры пользователем.
Программа будет выглядеть следующим образом:
 
#include <iostream>
using namespace std;
main()
{
 int i, N; // i – переменная цикла, N - максимальное число, у которого вычисляем квадрат
 cin >> N; // ввод N с клавиатуры
 for ( i = 1; i <= N; i ++) // цикл: для всех i от 1 до N  - переменная i будет последовательно принимать значения от 1 до N
 {
  cout << "Kvadrat chisla "<<i<<" raven " <<i*i<<"\n";  // Вывод квадрата числа по определенному формату и переход на новую строку
 }
}
При входе в цикл выполняется оператор i = 1, и затем переменная i с каждым шагом увеличивается на единицу (i ++). Цикл выполняется пока истинно условие i <= N. В теле цикла единственный оператор вывода печатает на экране само число и его квадрат по заданному формату.
Для возведения в квадрат или другую невысокую степень лучше использовать умножение.

Запустите программу и посмотрите результат ее работы при различных значениях переменной N.