Алгоритмы с циклической структурой. Оператор выбора 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.