Алгоритмы с циклической структурой. Оператор выбора For.

 

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

 

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

Естественно, если заглянуть глубже в каждый из этих процессов, то мы поймём, что эта цикличность нашей жизни и не позволяет нам стоять на месте: каждый раз, совершая ту же последовательность действий, мы можем учиться чему-то новому (яркий пример – учёба в лицее). Кроме этого, мы можем выбрать, чем заняться в каждый конкретный день, учиться чему-то принципиально новому или начать заказывать продукты на дом вместо того, чтобы ходить в магазин. Но поскольку программа является упрощённым описанием как правило какого-то отдельного и конкретного жизненного, научного, политического или другого вида явления и мы не можем в ней предусмотреть всего спектра разнообразия, которое встречаем в нашей реальной жизни, то для создания программы мы можем несколько упростить модель нашей задачи и использовать в ней повторяющиеся циклы. Ни жизнь, ни даже часть жизни ввиду бесконечного разнообразия её вариантов описать в программе невозможно, а вот найти самые общие черты, которые составляются циклы (содержащие внутри себя это разнообразие) или описать явления в науке и неживой природе можно, поэтому компьютеры так прочно входят в нашу жизнь, совершая самые различные расчёты – бухгалтерские и иные экономические, математические, физические, социологические и статистические, чертёжные, геодезические и многие другие виды расчётов.

 

Теперь давайте посмотрим на конкретных примерах, как и когда мы можем организовать циклический процесс.

 

В языке TurboPascal, как и почти в любом языке программирования, для организации циклических структур данных используется 3 вида циклических операторов – операторы For, While do и Repeat Until. Мы познакомимся с первым из них – оператором For.

Циклический оператор For.

 

Оператор For используется в том случае, когда мы заранее знаем, сколько раз нужно выполнить повторяющееся действие. Например, робот за день может собрать 100 одинаковых частей самолёта, в таком случае мы задаём для него число повторений сборки, равное 100 раз, то есть с 1 до 100. Или нам нужно автоматически обработать книгу, которая содержит 526 страниц, и для каждой страницы заменить её номер с обычного машинного шрифта на рукописный. В этом случае нам нужно поставить количество выполнений цикла с 1 по 526, чтобы охватить все страницы нашей книги.

 

Давайте посмотрим, как в программировании описываются циклы на примере простой программы. В этой программе нам нужно вывести количество итераций – сколько раз выполнился наш цикл, выводя каждый раз текущий номер итерации. Фрагмент этой программы представлен ниже:

 

Var i: integer;

 

Begin

 

For i:=1 to 5 do

 

write(i, ‘ ‘);

 

Readln;

 

End.

 

Инструкция цикла выделена здесь жирным курсивом. Как видно из этого фрагмента, сначала нам нужно объявить переменную, которая будет подсчитывать повторения (итерации) в цикле и изменять с каждой итерацией своё значение на 1. Эта переменная называется счётчиком цикла и в программе она обозначена за переменную i. Эта переменная может быть только порядкового типа (например, типа integer), поскольку нам нужно изменять её значение на единицу. После слова For мы указываем, с какого значения и по какое (i:=1 to 5) нужно будет повторять наше действие, которое описано в самом цикле -- write(i, ‘ ‘). Это действие или последовательность действий, если их много, составляет тело цикла.

 

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

 

1 2 3 4 5

 

Как видим, цикл выполнится 5 раз. При этом в самом начале выполнения нашего цикла переменная i принимает значение 1 и при каждом выполнении цикла это значение повышается на 1 и выводится на экран компьютера. Когда значение становится равным 5 (i=5), цикл выполняется последний раз и программа продолжать работать дальше, выполняя следующие операторы.

 

Если мы написали заголовок цикла For i:=3 to 5, то цикл выполнился бы 3 раза (5-3+1) при значениях 3, 4 и 5 и на экран бы вывелось следующее:

 

3 4 5

 

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

 

For i:=5 down to 1 do

 

write(i, ‘ ‘);

 

Получается, что любой цикл состоит из:

заголовка цикла, содержащего операторы, инициализирующие параметры цикла – счётчик и его начальное и конечное значения,

тела цикла – последовательности операторов, которые должны многократно выполняться

конца цикла, которое содержит условие завершения цикла

 

Обратите внимание, что в любом цикле обязательно должно стоять условие его завершения. Если мы организуем бесконечный цикл, наша программа будет выполняться вечно, так и не приводя ни к каким конечным результатам, поэтому iдолжно быть в конечных пределах, соответствующих максимальному диапазону определённого для него типа. Чем больше мы берём итераций (повторений) тела цикла, тем дольше и медленнее будет работать наша программа.

Примеры использования циклической структуры For.

 

Сначала давайте посмотрим, сколько раз выполнятся следующие циклы:

For i:=2 to 2 do

For i:=3 to 0 do

 

В первом случае цикл выполнится 1 раз: сначала iстановится равной 2-м, затем, после выполнения каких-то заложенных в теле цикла действий (тело цикла в фрагменте не показано), переменная iстанет равной 3-м (2+1) и второй раз цикл уже не выполнится. А во втором случае цикл не выполнится ни разу, поэтому такое задание цикла в программе недопустимо.

 

Теперь посмотрим на более хитрую конструкцию цикла, при которой сам пользователь определяет, сколько раз будет выполнен цикл:

 

Vari,k: integer;

 

Begin

 

writeln(‘Введите количество выполнений цикла’);

 

Readln(k);

 

For i:=1 to k do

 

writeln(‘Цикл выполнился ‘,k,’-ый раз’);

 

Readln;

 

End.

 

Это удобно применять в том случае, если мы хотим обрабатывать какую-то последовательность чисел. При этом пользователь сам определяет, сколько в этой последовательности будет чисел (каков размер последовательности). Вот как выглядит фрагмент программы, в которой находится самое минимальное из чисел последовательности, которую вводит пользователь. При каждом следующем выполнении цикла пользователь вводит новое число и если оно оказывается меньше всех предыдущих, то это число считается текущим минимальным числом. В конце, когда пользователь введёт всю последовательность чисел, программа выводит самое маленькое из них:

 

program Pr_17_18;

 

{$APPTYPE CONSOLE}

 

{Программа находит минимальное число из последовательности, которую

 

вводит пользователь, а затем выводит это число на монитор}

 

uses

 

SysUtils;

 

Var i, n: integer; //счётчик цикла и размер последовательности --

 

// количество её элементов

 

r, rmin: integer; //текущее вводимое число и текущее минимальное число

 

Begin

 

Write('Vvedite razmer posledovatelnosti: ');

 

Readln(n);

 

Writeln;

 

Write(‘ Vvedite 1-oe chislo: ‘);

 

Readln(r);

 

rmin:=r; //прежде чем работать с переменной, её нужно определить -- проинициализировать. В данном случае мы принимаем самое первое введённое число за минимальное и начинаем с ним сравнивать другие вводимые числа.

 

Writeln;

 

For i:=2 tondo // поскольку первое число уже введено, цикл начинаем со

 

второгочисла

 

begin

 

Write('Vvedite ',i,'-oe chislo: ');

 

Readln(r);

 

Writeln;

 

If r<rmin then //если введённое число окажется меньше

 

//текущего минимального числа

 

rmin:=r; //то текущее минимальное становится равным этому числу

 

Write('Tekushee minimalnoe chislo: ',rmin);

 

Writeln;

 

Writeln;

 

end;

 

Writeln;

 

Writeln('V itoge minimalnoe chislo poluchilos: ',rmin);

 

Readln;

 

End.