Azotirovanie.ru

Инженерные системы и решения
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Циклические алгоритмы

Тема: Циклические алгоритмы. Цикл с предусловием.

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

Определение. Цикл – это последовательность операторов, которая может выполняться более одного раза.

Определение. Циклический алгоритм – это алгоритм, содержащий один или несколько циклов.

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

Исходными данными в этом случае являются переменная N — количество чисел и сами эти числа. Значение очередного числа обозначим переменной Х. Результатом работы алгоритма станет сумма этих чисел, которую обозначим переменной S.

Допустимые значения переменной N должны удовлетворять условию n>0, так как количество слагаемых не может быть числом отрицательным.

Как же мы должны решать эту задачу? Сначала нужно запросить, сколько чисел нужно будет сложить и считать это число в переменную N. Затем нужно так организовать операторы, чтобы программа запрашивала очередное число и каждый раз складывала его с предыдущими; и повторяла эту группу операторов N раз.

На предыдущих занятиях при изучении оператора безусловного перехода мы знакомились с решением подобных задач. Но в языке Паскаль существуют более удобные конструкции для организации циклов:

  • цикл с предусловием;
  • цикл с постусловием;
  • цикл со счетчиком.

Познакомимся с первым из них – оператором цикла с предусловием while.

Циклы с предусловием используются тогда, когда выполнение цикла связано с некоторым логическим условием. Оператор цикла с предусловием имеет две части: условие выполнения цикла и тело цикла.

При выполнении оператора while определенная группа операторов выполняется до тех пор, пока определенное в операторе while булево условие истинно. Если условие сразу ложно, то оператор не выполнится ни разу.

Общая форма записи следующая

while <булево выражение> do
begin
группа операторов
end;

На русском языке это звучит примерно так:

пока выполняется это условие делай
от начала
группа операторов
до конца;

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

При использовании цикла с предусловием надо помнить следующее:

    значение условия выполнения цикла должно быть определено до начала цикла;

Вернемся к нашей задаче вычисления суммы чисел. При вычислении суммы используем следующий прием: вначале, когда еще не задано ни одно слагаемое, сумму полагают равной нулю (S:=0), а затем, получая очередное слагаемое, прибавляют его к сумме (S:=S+x) (см. программу ниже).

Очень важное значение в операторе цикла имеет так называемая переменная цикла. В нашей программе она называется i. С ее помощью мы обращаемся к пользователю за очередным числом (write (‘Введите ‘,i,’-ое число ’)) и считаем количество уже введенных чисел (i:=i+1), чтобы не запросить лишнее. Одновременно переменная цикла участвует в булевом выражении (i<=N).

Рассмотрите внимательно программу, решающую нашу задачу.

Program Summa;
Uses
Crt;
Var
i,
N : integer;
x, S : real;
Begin
ClrScr;
write (‘Сколько чисел для сложения? ‘);
readln (N);
S:=0;
i:=1;
while i<=N do
begin
write (‘Введите ‘,i,’-е число ’);
readln (x);
S:=S+x;
i:=i+1;
end;
write (‘Сумма введенных чисел равна ‘,s:5:2);
readln;
End.

Хотелось бы, чтобы Вы смогли представить работу этой программы. Давайте попробуем вместе.

Пусть нам требуется сложить следующие числа: 5, 7, -4, 0, 8, 20. Посчитаем, сколько их всего – шесть. Это число мы введем, когда программа задаст вопрос: Сколько чисел для сложения? Теперь наша программа запросит ввести 1-ое число, т. к. на первом шаге переменная i равна 1. Мы введем число 5. Программа считает его в переменную х. Теперь число 5 сложим с числом 0 и результат присвоим переменной S (оператор S:=S+x). В этот момент S становится равной 5. Чтобы перейти к следующему числу, увеличим значение переменной i на 1 (оператор i:=i+1). Выполнение операторов тела цикла закончено. Теперь программа переходит опять к анализу условия вхождения в цикл (i<=N). Переменная цикла i=2, переменная N=6, поэтому значение логического условия 2<=6 равно True. Значит снова выполняется тело цикла:

while i<=N do <2<=6>
begin
write (‘Введите ‘,i,’-ое число ’); <Введите 2-е число>
readln (x); <Считали число 7>
S:=S+x;
i:=i+1;
end;

Итак, мы сложили два числа и переходим опять к проверке условия. Ответим на вопрос: 3<=6? Да. Поэтому снова начинаю работать операторы тела цикла и мы переходим к третьему числу:

while i<=N do <3<=6>
begin
write (‘Введите ‘,i,’-ое число ’); <Введите 3-е число>
readln (x); <Считали число -4>
S:=S+x;
i:=i+1;
end;

Аналогично, мы сложим и остальные числа. Но когда же операторы цикла выполнятся последний раз и остановится работа цикла? Когда сложим последнее число. Проверим это.

while i<=N do <6<=6>
begin
write (‘Введите ‘,i,’-ое число ’); <Введите 6-е число>
readln (x); <Считали число 20>
S:=S+x;
i:=i+1;
end;

Проверяется опять условие 7<=6. Значение этого условия равно False, а значит тело цикла выполняться не будет. Цикл закончил свою работу. А мы получили результат: посчитали сумму всех шести чисел S=32.

В этом примере известно заранее количество повторений — N раз. Но чаще всего этот вид цикла используется тогда, когда количество повторений заранее не известно и зависит от выполнения какого-либо условия. Рассмотрим еще один пример.

Отвлечемся от цифр и вспомним окружающую жизнь. Сколько циклических алгоритмов можно увидеть вокруг, если внимательно посмотреть на события: чередование времен года, посещения магазинов, школы или секции, получение за контрольные оценок и др. Попробуем записать их.

Например, рассмотрите следующие циклические алгоритмы

а) Пока не сдал выпускные экзамены делай
начало
готовь уроки;
посещай школу;
конец;

б) Пока есть желание, возможность и здоровье делай
посещай занятия спортом

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

    “Репка”. “Дед тянет-потянет, вытянуть не может. Позвал бабку. Бабка за дедку , дедка за репку, тянут потянут, вытянуть не могут. Позвала бабка внучку. И вытянули репку”.

Цикл с предусловием.

Продолжим изучение цикла с предусловием на примере решения следующей задачи.

Задача. Найти сумму чисел в непустой последовательности.

Рассмотрим алгоритм решения. Пусть нам дана такая последовательность чисел:

3, -4, 0, 5, 19, -20, 6, 2

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

1 2 3 4 5 6 7 8

3, -4, 0, 5, 19, -20, 6, 2

Получилось, что всего у нас чисел восемь, на первом месте стоит число 3, на втором — число (-4), на третьем — число 0 и т.д. Тогда переменная цикла i будет пробегать числа от 1 до 8, становясь на каждом шаге больше на 1 и запрашивая каждый раз очередное число. Поэтому общая схема цикла будет выглядеть так:

i:=1;
while i<=N do
begin
write (‘Введите ‘,i,’-ое число’);
readln (x);
. . .
i:=i+1;
end;

Здесь N — количество чисел последовательности (в нашем случае 8), х — член последовательности, i — порядковый номер очередного члена последовательности. Просмотрим, как будет работать этот цикл.

i:=1;
while i<=N do <Проверяется условие 1<=8? Да. Значит выполняем тело цикла>
begin
write (‘Введите ‘,i,’-ое число’);<Вывод на экран “Введите 1-ое число”>
readln (x); <Считываем число 3 в переменную х>
. . .
i:=i+1; <Переходим к следующему по порядку числу: i=2>
end;
i:=1;
while i<=N do <Проверяется условие 2<=8? Да. Значит выполняем тело цикла>
begin
write (‘Введите ‘,i,’-ое число’);<Вывод на экран “Введите 2-ое число”>
readln (x); <Считываем число (-4) в переменную х>
. . .
i:=i+1; <Переходим к следующему по порядку числу: i=3>
end;
i:=1;
while i<=N do <Проверяется условие 3<=8? Да. Значит выполняем тело цикла>
begin
write (‘Введите ‘,i,’-ое число’);<Вывод на экран “Введите 3-ое число”>
readln (x); <Считываем число 0 в переменную х>
. . .
i:=i+1; <Переходим к следующему по порядку числу: i=4>
end;
i:=1;
while i<=N do <Проверяется условие 8<=8? Да. Значит выполняем тело цикла>
begin
write (‘Введите ‘,i,’-ое число’);<Вывод на экран “Введите 8-ое число”>
readln (x); <Считываем число 2 в переменную х>
. . .
i:=i+1; <Переходим к следующему по порядку числу: i=9>
end;

Итак, у нас уже организован цикл считывания чисел. Осталось только вписать в тело цикла оператор, который бы суммировал все эти числа. Для этого опишем переменную Summa в разделе описания переменных и присвоим ей нулевое значение перед выполнением цикла. Тогда при каждом шаге нашего цикла значение этой переменной должно быть изменено на х. Это произойдет при выполнении оператора

Если Вам не совсем понятно, что происходит при выполнении этого оператора, Вам нужно вспомнить, как происходит присваивание значение переменной: сначала вычисляется значение выражения в правой части (в нашем случае Summa+x, т.е, значение переменной Summa увеличиваем на х), а затем присваиваем это значение переменной с именем, записанным в левой части (Summa). Таким образом, в переменной Summa собирается сумма всех считанных чисел.

Задание. Напишите полный текст программы, находящей сумму N чисел последовательности. Дополните программу нахождением среднего арифметического этих чисел.

Примечание. Средним арифметическим чисел называется сумма этих чисел, деленная на их количество.

Задачи для самостоятельного решения:

  1. Построить и записать в виде программы алгоритм вычисления суммы квадратов десяти произвольных чисел, водимых с клавиатуры в процессе выполнения программы.

ОПЕРАТОРЫ ЦИКЛА (ПОВТОРЕНИЙ)

Рассмотренные раньше простые типы данных позволяют использовать в программе одиночные объекты-числа, символы, строки.

В ТР могут использоваться так же объекты, содержащие множество однотипных элементов. Это массивы– формальное объединение нескольких однотипных объектов (чисел, символов и т.п.), рассматриваемое как единое целое. Для описаний массива необходимо указать:

2)общее число входящих в массив элементов;

3) тип этих элементов.

В общем виде массив задаётся так:

VAR <Имя>:ARRAY[размерность] OF <тип>;

При описаний массива используется зарезервированные слова —ARRAY и OF (массив, из). За словом ARRAY в квадратных скобках указывается диапазон, с помощью которого, компилятор определяет общее число элементов массива. Диапазон задаётся левой и правой границами изменения индекса массива, между которыми ставится строго две точки.

Var A: array [1..10] of real;

B: array [0..50] of char;

C: array [-3..4] of Boolean;

Массив A состоит из 10 элементов, массив B из 51, a массив C из 8 элементов. За словом OF указывается тип элементов, образующих массив.

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

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

Массивы – структурированный тип данных.До сих пор мы рассматривали задачи, в которых использовалось небольшое количество данных. Однако часто приходиться работать с большим количеством однотипных данных.

Массив – совокупность однотипных данных, хранящиеся в последовательных ячейках памяти и имеющих общее имя. Ячейки называются элементами массива. Все элементы пронумерованы по порядку, и этот номер называется индексом элемента массива.

Все элементы массива имеют один и тот же тип. Сам массив имеет имя – одно для всех элементов. Для обращения к конкретному элементу массива необходимо указать имя массива и в квадратных скобках индекс элемента.

Простейший вид массива – одномерный массив.

Описание массива

<Имя массива>: array[<тип индекса>] of <тип компонентов>;

<Тип компонентов> – это тип данных, который имеет каждый элемент массива, <тип индекса> – границы изменения индекса. Например,

Var A:array[1..10] of integer;

Пример описания размерности массива через константу.

Var A:array[1..N] of integer;

Любое действие с массивами должно содержать в себе цикл, в котором перебираются элементы массива. Если вы пишете программу с массивом и не написали оператор цикла (for, while или repeat) – значит, вы ошиблись.

Оператор цикла for. В операторе цикла for указывается его начальное и конечное значения. Каждый раз перед выполнением тела цикла текущее значение сравнивается с конечным. После каждого выполнения тела цикла переменная N увеличивается на 1. Как только N превысит конечное значение, выполнение цикла прекращается. Счетчик цикла всегда имеет порядковый тип.

For N:=1 to 10 do

Writeln(sqr(N));

ОПЕРАТОРЫ ЦИКЛА (ПОВТОРЕНИЙ)

В языке TP имеются 3 различных оператора, с помощью которых, можно запрограммировать повторяющиеся фрагменты программ.

I. Оператор FOR имеет такую структуру:

FOR <параметр цикла>:=<начальное значение> TO <конечное значение> DO <оператор>;

Здесь FOR, TO, DO – Зарезервированные слова (для, до, выполнить).

<параметр цикла> — переменная цикла типа BYTE или INTEGER;

<начальное значение> — начальное значение того же типа;

<конечное значение> — конечное значение того же типа;

<оператор>— произвольный оператор TP (тело цикла). Если тело цикла состоит из нескольких операторов, то они заключаются в операторные скобки BEGIN … END;

В качестве иллюстраций применения оператора FOR рассмотрим программу, осуществляющую ввод с клавиатуры произвольного целого числа N и вычисление суммы всех целых чисел от 1 до N.

Блок-схема для программы Summa.

Начальное значение S=0

Первый цикл I = 1

Второй цикл I = 2

Четвертый цикл I=4

Шаг наращивания параметра равен (+1).

Существует другая форма оператора:

FOR <параметр цикла>:=<начальное значение> DOWNTO <конечное значение> DO <оператор>;

Замена зарезервированного слова TO на DOWNTO означает, что шаг наращивания параметра цикла равен (-1).

Например, вывод элементов массива с 10 на 5:

FOR I:=10 DOWNTO 5 DO WRITE (MAS[I]);

II. Оператор цикла WHILE с предпроверкой условия:

WHILE <условие> DO <оператор>;

Здесь WHILE, DO – зарезервированные слова (пока [выполняется условие], делать);

<условие> — выражение логического типа.

<оператор> — произвольный оператор TP.

Алгоритм: если выражение <условие> имеет значение TRUE, то выполняется <оператор>, если <условие> имеет значение FALSE, оператор WHILE прекращает свою работу.

III. Оператор цикла REPEAT. UNTIL с постпроверкой условия:

REPEAT <тело цикла> UNTIL <условие>;

Здесь REPEAT, UNTIL – зарезервированные слова (повторять до тех пор, пока не будет выполнено условие);

<тело цикла> — произвольная последовательность операторов TP;

<условие>— выражение логического типа. Перед UNTIL ; не ставится.

Алгоритм: операторы <тело цикла> выполняются хотя бы один раз, после чего вычисляется выражение <условие>: если его значение есть FALSE, операторы <тело цикла> повторяются, в противном случае, если истинно TRUE, оператор REPEAT. UNTIL завершают свою работу.

Циклы с условием.

Цикл со счетчиком for отлично выполняет свои функции, когда число повторений тела цикла известно или известны начальное и конечное значения счетчика. Однако такая радужная картина встречается в программировании далеко не всегда. Часто приходится решать задачи, когда число повторений цикла неизвестно и определяется лишь постепенно, после некоторого количества повторений тела цикла. В этом случае применяют другую разновидность цикла – цикл с условием. В языке Паскаль циклов с условием предусмотрено два: условие цикла может проверяться перед телом цикла или после него.

1. Цикл с предусловием. Цикл будет повторяться до тех пор, пока проверка этого условия будет давать результат «истина». Если условие сразу оказывается ложным, цикл не будет выполнено ни разу.

While <логическое условие> do <оператор-тела_цикла>

Если в теле цикла нужно выполнить несколько операторов, оно оформляется как блок beginend

Цикл с постусловием. Проверяет условие после выполнения тела цикла. Цикл будет повторяться до тех пор, пока проверка этого условия будет давать результат «ложь», то есть пока условие не выполнено. Даже если условие сразу окажется истинным, цикл выполняется хотя бы один раз.

Repeat

Until <Логическое условие>

Обращение к каждому элементу массива идет по имени массива и по индексу (номеру) элемента в массиве.

Оператор inc(k) увеличивает значение указанной переменной на единицу. То есть оператор inc(k) аналогичен оператору k:=k+1. По аналогии с inc, в Turbo Pascal имеется еще оператор dec. Он уменьшает значение указанной переменной на единицу. dec(k) аналогичен k:=k-1.

Пример №1.

Дан массив, состоящий из 10 элементов. Найти сумму этих элементов.

Правило: как только в программе появляется массив, сразу же появляется оператор цикла.

Цикл (программирование)

Цикл — последовательность из нескольких (0 и больше) операторов, которая указывается в тексте программы один раз, но может выполняться несколько (0 и более) раз подряд, от первого до последнего, после последнего снова выполняется первый.

Содержание

Тело цикла

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

Виды циклов

Условные циклы

Условные циклы выполняются или перестают выполняться в зависимости от заданного условия, проверяемого при каждом проходе цикла. Проверка может происходить перед выполнением тела цикла, после него или внутри тела цикла.

Цикл с предусловием

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

Цикл с постусловием

Цикл с постусловием — цикл, в котором условие проверяется после выполнения тела цикла. Отсюда следует, что тело всегда выполняется хотя бы один раз. В языке Паскаль этот цикл реализует оператор repeat..until; в Си — do…while.

Цикл с выходом из середины

Цикл с выходом из середины — наиболее общая форма условного цикла. Синтаксически такой цикл оформляется с помощью трёх конструкций: начала цикла, конца цикла и команды выхода из цикла. Конструкция начала маркирует точку программы, в которой начинается тело цикла, конструкция конца — точку, где тело заканчивается. Внутри тела должна присутствовать команда выхода из цикла, при выполнении которой цикл заканчивается и управление передаётся на оператор, следующий за конструкцией конца цикла. Естественно, чтобы цикл выполнился более одного раза, команда выхода должна вызываться не безусловно, а только при выполнении условия выхода из цикла.

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

Легко видеть, что с помощью цикла с выходом из середины можно легко смоделировать и цикл с предусловием (разместив команду выхода в начале тела цикла), и цикл с постусловием (разместив команду выхода в конце тела цикла).

Часть языков программирования содержат специальные конструкции для организации цикла с выходом из середины. Так, в языке Ада для этого используется конструкция LOOP…END LOOP и команда выхода EXIT или EXIT WHEN. В тех языках, где подобных конструкций не предусмотрено, цикл с выходом из середины может быть смоделирован с помощью любого условного цикла и оператора досрочного выхода из цикла (такого, как break в Си), либо оператора безусловного перехода goto.

Цикл cо счётчиком

Цикл со счётчиком — цикл, в котором некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом. В большинстве процедурных языков программирования реализуется оператором for, в котором указывается счётчик (так называемая «переменная цикла»), требуемое количество проходов (или граничное значение счётчика) и, возможно, шаг, с которым изменяется счётчик.

Неоднозначен вопрос о значении переменной по завершении цикла, в котором эта переменная использовалась как счётчик. Например, если в программе на языке Паскаль встретится конструкция вида:

возникает вопрос: какое значение будет в итоге присвоено переменной k: 9, 10, 100, может быть, какое-то другое? А если цикл завершится досрочно? Ответы зависят от того, увеличивается ли значение счётчика после последней итерации и не изменяет ли транслятор это значение дополнительно. Ещё один вопрос: что будет, если внутри цикла счётчику будет явно присвоено новое значение? Различные языки программирования решают данные вопросы по-разному. В некоторых поведение счётчика чётко регламентировано. В других, например, в том же Паскале, стандарт языка не определяет ни конечного значения счётчика, ни последствий его явного изменения в цикле, но не рекомендует изменять счётчик явно и использовать его по завершении цикла без повторной инициализации. Радикально решён вопрос в языке Ада: счётчик считается описанным в заголовке цикла, и вне его просто не существует. Даже если имя счётчика в программе уже используется, внутри цикла в качестве счётчика используется отдельная переменная. Счётчику запрещено явно присваивать какие бы то ни было значения, он может меняться только внутренним механизмом оператора цикла. В результате конструкция

внешне аналогичная вышеприведённому циклу на Паскале, трактуется однозначно: переменной k будет присвоено значение 100, поскольку переменная i, используемая вне данного цикла, не имеет никакого отношения к счётчику i, который создаётся и изменяется внутри цикла. Считается, что подобное обособление счётчика наиболее удобно и безопасно: не требуется отдельное описание для него и минимальна вероятность случайных ошибок, связанных со случайным разрушением внешних по отношению к циклу переменных.

Цикл со счётчиком всегда можно записать как условный цикл, перед началом которого счётчику присваивается начальное значение, а условием выхода является достижение счётчиком конечного значения; к телу цикла при этом добавляется оператор изменения счётчика на заданный шаг. Однако специальные операторы цикла со счётчиком могут эффективнее транслироваться, так как формализованный вид такого цикла позволяет использовать специальные процессорные команды организации циклов.

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

Цикл по коллекции

Некоторые языки (C#, Java, JavaScript, Perl, PHP, LISP, Tcl и др.) позволяют выполнять циклы по всем элементам заданной коллекции объектов. Для определения такого цикла не нужно ни указывать какой-либо счётчик, ни задавать условия выхода из цикла. Достаточно задать коллекцию и переменную, которой будут по очереди присваиваться значения всех объектов, находящихся в коллекции, или ссылки на них. Такие циклы реализуются операторами foreach, for…in и т. п.

Цикл (программирование)

Цикл — последовательность из нескольких (0 и больше) операторов, которая указывается в тексте программы один раз, но может выполняться несколько (0 и более) раз подряд, от первого до последнего, после последнего снова выполняется первый.

Содержание

[править] Тело цикла

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

[править] Виды циклов

[править] Условные циклы

Условные циклы выполняются или перестают выполняться в зависимости от заданного условия, проверяемого при каждом проходе цикла. Проверка может происходить перед выполнением тела цикла, после него или внутри тела цикла.

[править] Цикл с предусловием

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

[править] Цикл с постусловием

Цикл с постусловием — цикл, в котором условие проверяется после выполнения тела цикла. Отсюда следует, что тело всегда выполняется хотя бы один раз. В языке Паскаль этот цикл реализует оператор repeat..until; в Си — do…while.

[править] Цикл с выходом из середины

Цикл с выходом из середины — наиболее общая форма условного цикла. Синтаксически такой цикл оформляется с помощью трёх конструкций: начала цикла, конца цикла и команды выхода из цикла. Конструкция начала маркирует точку программы, в которой начинается тело цикла, конструкция конца — точку, где тело заканчивается. Внутри тела должна присутствовать команда выхода из цикла, при выполнении которой цикл заканчивается и управление передаётся на оператор, следующий за конструкцией конца цикла. Естественно, чтобы цикл выполнился более одного раза, команда выхода должна вызываться не безусловно, а только при выполнении условия выхода из цикла.

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

Легко видеть, что с помощью цикла с выходом из середины можно легко смоделировать и цикл с предусловием (разместив команду выхода в начале тела цикла), и цикл с постусловием (разместив команду выхода в конце тела цикла).

Часть языков программирования содержат специальные конструкции для организации цикла с выходом из середины. Так, в языке Ада для этого используется конструкция LOOP…END LOOP и команда выхода EXIT или EXIT WHEN. В тех языках, где подобных конструкций не предусмотрено, цикл с выходом из середины может быть смоделирован с помощью любого условного цикла и оператора досрочного выхода из цикла (такого, как break в Си), либо оператора безусловного перехода goto.

[править] Цикл cо счётчиком

Цикл со счётчиком — цикл, в котором некоторая переменная изменяет своё значение от заданного начального значения до конечного значения с некоторым шагом. В большинстве процедурных языков программирования реализуется оператором for, в котором указывается счётчик (так называемая «переменная цикла»), требуемое количество проходов (или граничное значение счётчика) и, возможно, шаг, с которым изменяется счётчик.

Неоднозначен вопрос о значении переменной по завершении цикла, в котором эта переменная использовалась как счётчик. Например, если в программе на языке Паскаль встретится конструкция вида:

возникает вопрос: какое значение будет в итоге присвоено переменной k: 9, 10, 100, может быть, какое-то другое? А если цикл завершится досрочно? Ответы зависят от того, увеличивается ли значение счётчика после последней итерации и не изменяет ли транслятор это значение дополнительно. Ещё один вопрос: что будет, если внутри цикла счётчику будет явно присвоено новое значение? Различные языки программирования решают данные вопросы по-разному. В некоторых поведение счётчика чётко регламентировано. В других, например, в том же Паскале, стандарт языка не определяет ни конечного значения счётчика, ни последствий его явного изменения в цикле, но не рекомендует изменять счётчик явно и использовать его по завершении цикла без повторной инициализации. Радикально решён вопрос в языке Ада: счётчик считается описанным в заголовке цикла, и вне его просто не существует. Даже если имя счётчика в программе уже используется, внутри цикла в качестве счётчика используется отдельная переменная. Счётчику запрещено явно присваивать какие бы то ни было значения, он может меняться только внутренним механизмом оператора цикла. В результате конструкция

внешне аналогичная вышеприведённому циклу на Паскале, трактуется однозначно: переменной k будет присвоено значение 100, поскольку переменная i, используемая вне данного цикла, не имеет никакого отношения к счётчику i, который создаётся и изменяется внутри цикла. Считается, что подобное обособление счётчика наиболее удобно и безопасно: не требуется отдельное описание для него и минимальна вероятность случайных ошибок, связанных со случайным разрушением внешних по отношению к циклу переменных.

Цикл со счётчиком всегда можно записать как условный цикл, перед началом которого счётчику присваивается начальное значение, а условием выхода является достижение счётчиком конечного значения; к телу цикла при этом добавляется оператор изменения счётчика на заданный шаг. Однако специальные операторы цикла со счётчиком могут эффективнее транслироваться, так как формализованный вид такого цикла позволяет использовать специальные процессорные команды организации циклов.

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

[править] Цикл по коллекции

Некоторые языки (C#, Java, JavaScript, Perl, PHP, LISP, Tcl и др.) позволяют выполнять циклы по всем элементам заданной коллекции объектов. Для определения такого цикла не нужно ни указывать какой-либо счётчик, ни задавать условия выхода из цикла. Достаточно задать коллекцию и переменную, которой будут по очереди присваиваться значения всех объектов, находящихся в коллекции, или ссылки на них. Такие циклы реализуются операторами foreach, for…in и т. п.

голоса
Рейтинг статьи
Читайте так же:
Что такое эффективность счетчика
Ссылка на основную публикацию
Adblock
detector