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


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

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

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

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


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

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

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

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

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

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

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

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

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

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

Вернемся к общей форме записи оператора цикла и разберем подробнее все части
for *присваивание переменной начального значения* to/downto *конечное значение* do begin
      /*один оператор или блок операторов - тело цикла*/;
end;

Присваивание переменной начального значения

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

- это последнее значение, при котором тело цикла ещё будет выполняться. Например, если мы установим в качестве последнего значение 100, то при 100 наш цикл ещё выполниться, а при 101 уже нет.


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

Заголовок цикла for в Pascal состоит из нескольких частей:
1) само слово for
2) какой пременной и какое значение мы присваиваем. В данной программе это b := 1, т.е. переменной b мы присваиваем значение 1.
3) слово to или downto, которое обозначает шаг, с которым выполняется цикл. Если мы напишем to, то переменная каждую итерацию будет увеличиваться на 1, если же downto, то уменьшаться на 1.
4) конечное значение переменной
5) слово do
6) слово begin (ео мжно не писать, если в теле цикла только одна строчка, иначе его обязательно писать. Если не написать begin, то из всего тела цикла будет выполняться только первая строчка). Не забудем после тела цикла, если мы написали слово begin, написать слово end; !

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

Например, нам нужно вывести квадраты чисел от 1 до n, где значение переменной n вводится с клавиатуры пользователем.
Программа будет выглядеть следующим образом:
 
var i, n :integer; // i – переменная цикла, n - максимальное число, у которого вычисляем квадрат
begin
 read(n); // ввод n с клавиатуры
 for i := 1 to n do // цикл: для всех i от 1 до n  - переменная i будет последовательно принимать значения от 1 до n
  writeln('Kvadrat chisla ', i, ' raven ', i * i);  // Вывод квадрата числа по определенному формату и переход на новую строку
end.

При входе в цикл выполняется оператор i := 1, и затем переменная i с каждым шагом увеличивается на единицу (to). Цикл выполняется пока истинно условие i <= n. В теле цикла единственный оператор вывода печатает на экране само число и его квадрат по заданному формату.
Для возведения в квадрат или другую невысокую степень лучше использовать умножение.

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