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


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

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

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

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

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

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

Цикл с переменной или с известным числом шагов (for).

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

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

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

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

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

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

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

{
      /* один оператор или блок операторов - тело цикла */;
}

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

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

Выражение 3 изменяет значение переменной-счетчика. Без этого значения цикл будет считаться бесконечным. Например,

i++;  // при каждом завершении выполнения операций тела цикла, i увеличивается на 1.

 

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

for ( int i = 0; i < 10; i ++ ) { ... } - стандартный заголовок

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

Повторить N раз

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

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

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