Цикл. Программирование циклов на Паскале

 

Цикл - это повторение некоторой группы действий по условию.
Различают два типа циклов: циклы с заданным числом повторений и итеративные циклы.

Цикл с заданным числом повторений (с параметром).

Для программирования циклов с заданным числом повторений при постоянном шаге изменения параметра цикла в Паскале существует цикл с параметром.

1) for i:=<выражение 1> to <выражение 2> do <оператор>
2) for i:=<выражение 2> downto <выражение 1> do <оператор>

Здесь, переменная i является счетчиком, поэтому должна быть целочисленной.

Выполнение оператора for в 1-м случае происходит по следующей схеме:

1) Вычисляются значения <выражения 1> и <выражения 2>. Это делается один раз, при входе в цикл.
2) Параметру i присваивается значение выражения 1.
3) Значение параметра цикла сравнивается со значением выражения 2. Если параметр цикла меньше или равен этому значению, то выполняется тело цикла. Иначе, выполнение цикла заканчивается.
4) Значение параметра цикла изменяется на следующее значение в его типе (для целых чисел - увеличивается на 1). Происходит возврат к п.3.

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

Правила:
1) параметр цикла не может иметь вещественный тип;
2) в теле цикла нельзя менять переменную - параметр цикла;
3) при выходе из цикла значение параметра является неопределенным.

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

Например
, чтобы получить на экране десятичные коды букв латинского алфавита можно написать следующую программу:

for c:='a' to 'z' do begin
write(c,' - ', ord(c)); end;

Переменная с в этом случае имеет тип char.

Вопрос: как вывести кодировку букв латинского алфавита в обратном порядке?

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

Цикл - пока:
while (логическое выражение) do <оператор>;

 

<оператор> - тело цикла. Цикл повторяет повторение, пока истинно логическое выражение.


Цикл - до:
Repeat <оператор> until (логическое выражение);

 

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


Задача.

Составить программу для вычисления суммы заданного количества слагаемых n.

Два варианта решения задачи. В первом случае - цикл с предусловием, во втором - с постусловием.

И тот и другой цикл повторится N раз. Переменная i является не только знаменателем дроби но и счетчиком числа повторений цикла. Такие переменные называют параметрами цикла.

 

21. Программирование циклов с условиями.

Виды циклов

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

Иногда в программах используются циклы, выход из которых не предусмотрен логикой программы. Такие циклы называются безусловными, или бесконечными. Специальных синтаксических средств для создания бесконечных циклов, ввиду их нетипичности, языки программирования не предусматривают, поэтому такие циклы создаются с помощью конструкций, предназначенных для создания обычных (или условных) циклов. Для обеспечения бесконечного повторения проверка условия в таком цикле либо отсутствует (если позволяет синтаксис, как, например, в цикле LOOP…END LOOP языка Ада), либо заменяется константным значением (while true do … в Паскале). В языке С используется цикл for(;;) с незаполненными секциями.

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

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

while <условие> dobegin <тело цикла> end;

На языке Си:

while(<условие>){ <тело цикла>}

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

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

repeat <тело цикла> until <условие выхода>

На языке Си:

do{ <тело цикла>}while(<условие продолжения цикла>)


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

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

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

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

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

Часть языков программирования содержат специальные конструкции для организации цикла с выходом из середины. Так, в языке Ада для этого используется конструкция LOOP…END LOOP и команда выхода EXIT или EXIT WHEN:

LOOP... Часть тела цикла EXIT WHEN <условие выхода>;... Часть тела цикла IF <условие выхода> THEN EXIT; END;... Часть тела циклаEND LOOP:

Здесь внутри цикла может быть любое количество команд выхода обоих типов. Сами команды выхода принципиально не различаются, обычно EXIT WHEN применяют, когда проверяется только условие выхода, а просто EXIT — когда выход из цикла производится в одном из вариантов сложного условного оператора.

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

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

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

FOR v:= b TO e BY s DO... тело цикла END

(здесь v — счётчик, b — начальное значение счётчика, e — граничное значение счётчика, s — шаг).

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

i:= 100; for i:= 0 to 9 dobegin... тело цикла end;k:= i;

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

Радикально решён вопрос в языке Ада: счётчик считается описанным в заголовке цикла, и вне его просто не существует. Даже если имя счётчика в программе уже используется, внутри цикла в качестве счётчика используется отдельная переменная. Счётчику запрещено явно присваивать какие бы то ни было значения, он может меняться только внутренним механизмом оператора цикла. В результате конструкция

i:= 100;for i in (0..9) loop... тело циклаend loop;k:= i;

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

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

В некоторых языках, например, Си и других, произошедших от него, цикл for, несмотря на синтаксическую форму цикла со счётчиком, в действительности является циклом с предусловием. То есть в Си конструкция цикла:

for (i = 0; i < 10; ++i){... тело цикла }

фактически представляет собой другую форму записи конструкции[1]:

i = 0;while (i < 10){... тело цикла ++i;}

То есть в конструкции for сначала пишется произвольное предложение инициализации цикла, затем — условие продолжения и, наконец, выполняемая после каждого тела цикла некоторая операция (это не обязательно должно быть изменение счётчика; это может быть правка указателя или какая-нибудь совершенно посторонняя операция). Для языков такого вида вышеописанная проблема решается очень просто: переменная-счётчик ведёт себя совершенно предсказуемо и по завершении цикла сохраняет своё последнее значение.

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

Ещё одним вариантом цикла является цикл, задающий выполнение некоторой операции для объектов из заданного множества, без явного указания порядка перечисления этих объектов. Такие циклы называются совместными (а также циклами по коллекции, циклами просмотра) и представляют собой формальную запись инструкции вида: «Выполнить операцию X для всех элементов, входящих во множество M». Совместный цикл, теоретически, никак не определяет, в каком порядке операция будет применяться к элементам множества, хотя конкретные языки программирования, разумеется, могут задавать конкретный порядок перебора элементов. Произвольность даёт возможность оптимизации исполнения цикла за счёт организации доступа не в заданном программистом, а в наиболее выгодном порядке. При наличии возможности параллельного выполнения нескольких операций возможно даже распараллеливание выполнения совместного цикла, когда одна и та же операция одновременно выполняется на разных вычислительных модулях для разных объектов, при том что логически программа остаётся последовательной.

Совместные циклы имеются в некоторых языках программирования (C#, Eiffel, Java, JavaScript, Perl, Python, PHP, LISP, Tcl и др.) — они позволяют выполнять цикл по всем элементам заданной коллекции объектов. В определении такого цикла требуется указать только коллекцию объектов и переменную, которой в теле цикла будет присвоено значение обрабатываемого в данный момент объекта (или ссылка на него). В различных языках программирования синтаксис оператора различен:

C++:

for (type &item: set) //поддерживается, начиная со стандарта C++11{ //использование item}

C#:

foreach (type item in set) { //использование item }

 

Delphi:

for item in [1..100] dobegin //Использование item (Работоспособность кода проверялась в Delphi 2010) end;

Perl (строгий порядок "от первого до последнего"):

foreach (@set) { #использование $_ } # или for (@set) { #использование $_ } # или foreach $item (@set) { #использование $item }

 

Eiffel:

across set as cursor loop -- использование cursor.item end

 

Java:

for (type item: set) { //использование item }

 

JavaScript:

for (txtProperty in objObject) { /* использование: objObject [txtProperty] */ }

 

PHP:

foreach ($arr as $item) { /* использование $item*/ } //или foreach ($arr as $key=>$value) { /* использование значений индекса $key и его значения $value*/ }

 

Visual Basic.NET:

For Each item As type In set 'использование item Next item


Windows PowerShell:

foreach ($item in $set) { # операции с $item}

или

$set | ForEach-Object { # операции с $_}

Python

for item in iterator_instance: # использование item

 

22. Программирование задач с множественным выбором.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: