Циклы. Цикл с постусловием и цикл с предусловием В цикле с предусловием тело цикла

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

Выполнение оператора цикла while начинается с проверки условия. Если оно истинно, то выполняются операторы тела цикла, затем вновь проверятся условие и т. д. Как только на очередном шаге окажется, что условие ложное, то выполнение цикла завершится. Цикл while может ни разу не выполниться, если условие в самом начале ложное.

В блок-схеме цикл while изображается так, как показано на рис. 5.3.

Рис. 5.3. Блок-схема цикла while

Ввод оператора цикла while осуществляется аналогично вводу цикла for, после нажатия кнопки while панели Программирование на экране появляются элементы, показанные на рис. 5.4. В первое поле введите условие выполнения цикла, и в нижнее поле операторы тела цикла. Если в теле цикла более одного оператора, то нужно воспользоваться кнопкой Add Line для добавления дополнительных операторов в тело цикла.

Рис. 5.4. Вставка оператора цикла while

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

Пример 5.4. Найти первый отрицательный член последовательности

Блок-схема алгоритма решения примера:

Пример 5.5. Вычислить значения функции при изменении аргумента х от -1 до 3 с шагом 0.5 и сформировать из этих значений вектор y .

Эта задача уже была рассмотрена, но с использованием цикла For , решим ее с циклом While .

Описание и вызов программы-функции:

Пример 5.6. Найти количество и сумму цифр заданного натурального числа.Описание и вызов программы-функции:


В данной программе используются две функции:

· mod – выдаёт остаток при делении x на y .

· trunc – выдает целую часть z , удаляя дробную часть.

Пример 5.7. Составить программу для вычисления суммы членов бесконечного ряда с точностью до члена ряда .

При этом вычисление текущего члена ряда выполнить по формуле: -текущий член ряда, - предыдущий член ряда.

Итерационным называется вычислительный процесс, в котором для определения последующего значения переменной используется её предыдущее значение. При использовании итерационных процессов реализуется метод последовательных приближений. Циклом управляет заданная погрешность вычислений e . Если на очередной итерации погрешность ≥e, то цикл продолжается для вычисления последующего приближённого значения результата, иначе происходит выход из цикла.

Описание и вызов программы-функции:



Вложенные циклы

Если телом цикла является циклическая структура, то такой цикл называется вложенным или сложным. Алгоритм со структурой вложенных циклов – это алгоритм, содержащий цикл, внутри которого размещены один или несколько других циклов.

Простейший случай вложенных циклов – двойной. В этом случае один цикл помещается внутри другого. Различные варианты вложенных циклов:

Пример 6.1. Вычислить .

Описание и вызов программы-функции:

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

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

Повторяемый блок вычислений называют телом цикла. В теле цикла должно быть обеспеченоизменение значения счетчика , чтобы он мог завершиться. Если тело цикла состоит более, чем из одного оператора, онозаключается в операторные скобки begin ... end;. Однократное выполнение тела цикла называют егошагом .

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

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

Цикл с постусловием : сначала выполняется тело цикла, затем управление передается на проверку условия. В зависимости от истинности или ложности условия, тело цикла выполняется повторно или же происходит переход к оператору, следующему за телом цикла. Всё, сказанное о возможном зацикливании для цикла с предусловием, справедливо и для цикла с постусловием.

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

В языке Паскаль реализованы оба вида циклов. Цикл с предусловием имеет следующий общий вид:

while логическое_выражение do begin

{операторы тела цикла}

Работу цикла можно описать словами: "пока логическое выражение истинно, повторяется тело цикла ".

Логическое выражение строится по правилам, изученным в главе 7. Тело цикла могут образовывать любые операторы Паскаля. Если в теле цикла всего один оператор, операторные скобки можно и не писать.

Общая запись цикла с постусловием следующая:

{операторы тела цикла}

until логическое_выражение;

Работает цикл с постусловием следующим образом: "тело цикла повторяется до тех пор, пока логическое выражение не станет истинным ". Обратите внимание, что, в отличие отwhile, циклrepeatв Паскале работает, пока условиеложно . Это отличие подчеркивается использованием ключевого словаuntil("до тех пор, покане ") вместоwhile("до тех пор, пока"). Кроме того, в виде исключения, тело циклаrepeat, даже если оно состоит из нескольких операторов, можноне заключать в операторные скобки.

Довольно часто циклы взаимозаменяемы. Представим, например, что для каждого из значений переменной x=1,2,…,20, нужно выполнить некоторый расчет (математически этот закон измененияxможно записать как
или
). Покажем общий вид цикловwhileиrepeat:

while x<=20 do begin

{операторы расчета}

{операторы расчета}

Как видно из листинга, управляющей переменной xв обоих случаях присвоено начальное значение1, оба цикла изменяют значениеxи, соответственно, условие цикла, операторомx:=x+1;, но для циклаrepeatусловие "перевернуто" ("покаxне станет больше20"), а тело не заключено в операторные скобки.

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

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

цикл с параметром;

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

цикл с постусловием.

Их алгоритмы выполнения различны, но есть и общее: после выполнения тела цикла, проверяется условие, и в зависимости от него работа цикла заканчивается, либо снова выполняется тело.

For - цикл с параметром

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

  1. For <счетчик>:=< начальное значение> To <конечное значение> Do <тело цикла>;
  2. For <счетчик>:=<начальное значение> Downto <конечное значение> Do <тело цикла>;

Счетчик – это переменная порядкового типа. Начальное и конечное значение должны быть того же типа, что и счетчик. Тело выполняется до тех пор пока условие истинно.

Формы записи, представленные выше, отличаются словами To и Downto . Если Вы используете цикл с To, то значение счетчика с каждым шагом будет увеличиваться на единицу, а если с Downto, то уменьшаться. Из этого следует, что в первом варианте начальное значение не должно превышать конечное, во втором - верно противоположное. В программе ниже, указанное пользователем количество раз, будут выводиться символы.

1
2
3
4
5
6
7
8
9
10

program for_primer;
uses crt;
var i, x: integer ;
begin
write (‘X=’ ) ;
readln (x) ;
for i:= 1 to x do
write (#3 , #6 ) ;
readkey;
end .

Здесь тело цикла не заключено в Begin-End, так как оператор всего один. Но если их будет больше, то операторные скобки обязательны. Стоит также отметить, что счетчик по выходу из цикла не будет иметь определенного значения, но если цикл закончиться раньше положенного, то счетчик сохранит последнее, записанное в него значение.

While – цикл с предусловием

Оператор While – начинает описание цикла с предусловием. Такой вид цикла нужен, в тех алгоритмах, где число повторений неизвестно заранее. В общем виде он выглядит так:

While <выражение> Do <тело цикла>;

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

Пример программы написанный с использованием цикла While:

В данном коде использовался составной оператор Begin-End, так как операторов в теле цикла несколько.

Repeat – цикл с постусловием

Главной особенностью цикла с постусловием (часто встречается название: цикл-ДО) является выполнение его тела минимум один раз. Это связано с тем, что условие записывается в конце и соответственно вначале выполнится тело, а затем провериться условие. Формально он выглядит так:

<тело цикла>

Until <условие>

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

1
2
3
4
5
6
7
8
9
10
11
12

Оператор цикла while организует выполнение одного оператора (простого или составного) неизвестное заранее число раз.

Формат цикла while : while (B) S;

где B

S – тело цикла - оператор (простой или составной).

Перед каждым выполнением тела цикла анализируется значение выражения В: если оно истинно, то выполняется тело цикла, и управление передается на повторную проверку условия В; если значение В ложно – цикл завершается и управление передается на оператор, следующий за оператором S.

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

Пример:

n.

static void Main()

Console.Write("N= ");

while (i <= n) //пока i меньше или равно n

//выводим i на экран, затем увеличиваем его на 1

Console.Write(" "+ i++);

Результат:

1 2 3 4 5 6 7 8 9 10

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

Оператор цикла do while также организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Однако в отличие от цикла while условие завершения цикла проверяется после выполнения тела цикла.

Формат цикла do while : do S while (B);

где В – выражение, истинность которого проверяется (условие завершения цикла);

S – тело цикла - оператор (простой или блок).

Сначала выполняется оператор S, а затем анализируется значение выражения В: если оно истинно, то управление передается оператору S, если ложно - цикл завершается, и управление передается на оператор, следующий за условием B. Так как условие В проверяется после выполнения тела цикла, то в любом случае тело цикла выполнится хотя бы один раз.

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

Пример:

Вывод на экран целых чисел из интервала от 1 до n.

static void Main()

Console.Write("N= "); int n=int.Parse(Console.ReadLine());

do Console.Write(" " + i++);

while (i <= n); //пока i меньше или равно n

Цикл с параметром

Цикл с параметром имеет следующую структуру:

for (<инициализация>; <выражение>; <модификация>) <оператор>;

Инициализация используется для объявления и/или присвоения начальных значений величинам, используемым в цикле в качестве параметров (счетчиков). В этой части можно записать несколько опе­раторов, разделенных запятой. Областью действия переменных, объявленных в части инициализации цикла, является цикл и вложенные блоки. Инициализация выполняется один раз в начале исполнения цикла.

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

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

Оператор (простой или составной) представляет собой тело цикла.

Любая из частей оператора for (инициализация, выражение, модификация, оператор) может отсутствовать, но точку с запя­той, определяющую позицию пропускаемой части, надо оставить.

static void Main()

Console.Write("N= ");

int n=int.Parse(Console.ReadLine());

for (int i=1; i<=n;) //блок модификации пустой

Console.Write(" " + i++);

Вложенные циклы

Циклы могут быть простые или вложенные (кратные, циклы в цикле). Вложенными могут быть циклы любых типов: while, do while, for . Каждый внутренний цикл должен быть полностью вложен во все внешние циклы. «Пересечения» циклов не допускаются.

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

Важность циклов в программировании

Чем же является цикл? Зачем он необходим и какие преимущества получает программист при его использовании? Цикл является важной структурной составляющей программирования, которая позволяет автоматизировать выполнение определённого ряда действий, при условии что соблюдаются установленные параметры. Так, самый простой пример работы цикла - это поднесение определённого числа в степень. Нет нужды прописывать рядки до тех пор, пока не будет достаточно, ведь техника может всё сделать автоматически с его помощью. При практической реализации циклы также позволяют сэкономить много времени и труда, так как при использовании цикла нет необходимости каждый раз и на все действия прописывать программный код. Достаточно ввести заменяемые переменные и запустить реализацию. Но как построена схема цикла? Или даже нескольких? Самих вариантов реализации цикла довольно много - информации на целую книжку про программирование, "Паскаль" мы будем рассматривать или "Ассемблер". Поэтому в чисто ознакомительных целях предлагаем разобрать теоретическую схему работы двух самых популярных в использовании:

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

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

while «условие» do «программный код»

Общетеоретическая база цикла с постусловием

Это форма написания программного кода, когда оператор цикла с постусловием выполнения стоит после тела. С первого взгляда может показаться странным: действительно, зачем ставить обстоятельство выполнения после программного кода? Но ничего здесь странного нет: особенность такой формы в том, что код будет выполнен независимо от того, соблюдены условия выполнения или нет. Но только 1 раз. Затем будут следовать проверки, соответствует ли всё тому, как должно быть, или нет. И при отсутствии надлежащих условий тело цикла будет игнорироваться. Это очень важная и полезная особенность, которую имеет цикл с постусловием. На примере чего было это рассказано и где можно увидеть практическую реализацию расписанного здесь? Вот пример цикла с постусловием:

«Программный код»

until «Условие»

Общетеоретическая база цикла с предусловием

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

Практическая реализация в различных языках программирования

Пару слов о практической эффективности циклов. Следует отметить в первую очередь экономию времени, причем как пользователя, так и программиста. О втором уже говорилось, почему так, поэтому следует пару слов сказать о клиенте. Дело в том, что разбивка на отдельные части позволяет программному обеспечению быстрее загружаться и работать, и, соответственно, сам пользователь будет только рад использовать такое ПО. Причем такой подход, когда код хранится в цикле или отдельном классе (которые зачастую вызываются именно из тела), и позволяет обеспечить эффективность работы. Кроме этого, следует занести быстроту записи в отдельные ячейки памяти. Так, если бы всё пришлось делать вручную, то нужно было бы обходить каждую и в ней же делать соответствующую запись. А цикл позволяет в разы или даже десятки сократить необходимость делать всё самому. И он убирает человеческий фактор, который может привести к необходимости часами искать проблемный код.

Заключение

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




Top