Оператор цикла с предусловием является выражение

Урок из серии: «Язык программирования Паскаль»
На предыдущем уроке было показано, как использовать оператор цикла с параметром For.
В этом уроке Вы познакомитесь с операторами цикла с условием.
Операторы цикла с условием используются тогда, когда число повторений тела цикла заранее неизвестно, а задано лишь условие повторения (или окончания) цикла.
Оператор цикла с условием содержит две части: условие и тело цикла. В зависимости от их взаимного расположения, различают две разновидности циклов с условием: циклы с предусловием и циклы с постусловием.
В языке программирования Паскаль для организации циклов с условием используются операторы While и Repeat.
Оператор цикла с предусловием While
Оператор while (пока) называют оператором цикла с предусловием за то, что проверка условия выполнения тела цикла производится в самом начале оператора, до операторов тела цикла. Если условие изначально не выполнится, то операторы тела цикла не выполнятся ни разу.
Формат оператора:
begin
<тело цикла>;
end;
Здесь:
<условие выполнения цикла> – булевское выражение;
<тело цикла> – операторы, которые будут повторяться.
На русском языке это звучит примерно так:
пока выполняется условие делай
начало
<тело цикла>
конец
Алгоритм выполнения оператора:
- Проверяется условие выполнения цикла (вычисляется булевское выражение).
- Если условие выполняется (значение выражения равно true), то выполняются операторы, составляющие тело цикла.
- Если условие не выполняется (значение выражения равно false), то происходит выход из цикла и переход к первому после while оператора.
При использовании цикла с предусловием надо помнить следующее:
- Начальное значение переменной цикла нужно присвоить до начала выполнения цикла.
- Условие продолжения цикла должно зависеть от значения переменной цикла.
- Переменная цикла должна изменяться при каждом новом выполнении цикла, иначе цикл будет повторяться бесконечное число раз.
Пример. Составить программу для нахождения суммы 10 произвольных чисел, введенных с клавиатуры.
var
k: byte;
x, sum:real;
begin
k:=0; {Счетчик чисел}
sum := 0; {Сумма чисел}
while (k < 10) do {Условие выполнения цикла}
begin
k:= k+1;
write(‘Введите ‘,k , ‘-е число: ‘);
readln(x); {Ввод очередного числа с клавиатуры}
sum := sum + x;
end;
writeln(‘Сумма введенных чисел равна ‘, sum);
end.
В данном примере перед циклом обнуляются значение счетчика введенных чисел k и их суммы sum.
В начале оператора while проверяется условие k < 10.
Если условие верно, то выполняется составной оператор в теле цикла. В этом операторе вводится значение очередного числа, и на это значение увеличивается значение суммы. После этого управление в программе вновь передается оператору цикла while, опять проверяется условие k < 10.
Как только значение станет равно 10, выполнение цикла завершиться, а управление будет передано на оператор, находящийся за словом end, т. е. первый оператор за границей while.
Оператор цикла с постусловием repeat
Оператор цикла repeat аналогичен оператору while, но отличается от него, во-первых, тем, что условие проверяется после очередного выполнения тела цикла (за это и называется циклом с постусловием) и таким образом гарантируется хотя бы однократное выполнение цикла, а во-вторых, тем, что выполнение условия (равенство булевского выражения константе true) является критерием не повторения, а прекращения цикла.
Формат оператора:
<оператор 1> ;
<оператор 2> ;
. . .
<оператор n>;
Until <условие окончания цикла>;
где Repeat (повторять), until (до тех пор).
Обратите внимание на то, что данный оператор цикла предполагает несколько операторов в теле цикла, поэтому операторные скобки begin и end не нужны.
Алгоритм выполнения:
- Выполняется тело цикла (операторы, заключенные между словами repeat / until).
- Проверяется условие выхода из цикла.
- Если условие выполняется, то происходит выход из цикла к первому после repeat оператору.
- Если условие не выполняется, то алгоритм повторяется с пункта 1.
Пример. Составить программу, которая будет вводить и суммировать любое количество чисел. Если будет введено число 999, на экран вывести результат суммирования.
Для решения этой задачи сначало нужно ввести число, а потом проверить его значение (проверить условие выхода из цикла). Для этого нужен цикл с постусловием.
Формат оператора:
var
x, sum:real;
begin
sum := 0; {Сумма чисел}
x:=0; {Очередное число}
repeat {Повторять}
sum := sum + x;
write(‘Введите очередное число: ‘);
readln(x);
until x=999; {Условие окончания цикла}
writeln(‘Сумма введенных чисел равна ‘, sum);
end.
Коротко о главном
1. Операторы While Repeat используют в тех случаях, когда заранее неизвестно число повторений тела цикла или шаг отличен от 1.
2. При организации циклов с проверкой условия обязательно нужно указать:
- начальное значение параметра цикла;
- условие, при котором действия должны выполняться;
- приращение параметра цикла.
На следующем уроке рассмотрим применение циклов в задачах на целочисленную арифметику.
Проверь себя!
Следующий урок: Циклы и целочисленная арифметика.
Источник
Repeat
Оператор цикла с постусловием
Оператор цикла с параметром
Оператор цикла с параметром имеет два формата:
for<Параметр>:= <Выражение1> to<Выражение2> do<0ператор>;
и
for<Параметр>:= <Выражение1> downto<Выражение2> do<0ператор>;
Параметр цикла представляет собой переменную порядкового типа, которая должна быть определена в том же блоке, где находится оператор цикла; выражение1 и выражение2 являются, соответственно, начальным и конечным значениями параметра цикла и должны иметь тип, совместимый с типом параметра цикла.
Оператор цикла обеспечивает выполнение тела цикла, которым является оператор, расположенный после слова do, до полного перебора всех значений параметра цикла от начального до конечного с соответствующим шагом. Шаг параметра всегда равен 1 для первого формата цикла и -1 – для второго формата. То есть значение параметра последовательно увеличивается или уменьшается на единицу при каждом повторении цикла.
Цикл может не выполниться ни разу, если для цикла for … toзначение начального выражения больше конечного, а для цикла for …downtoзначение начального выражения меньше конечного.
Примеры. var i, j: integer; ch: char;
begin
for i:=10 to 14 do write(i:4); writeln;
for j:=14 downto 10 do write(j:4); writeln;
for ch:=’a’ to ‘e’ do write(ch:3);
end;
Результат: 10 11 12 13 14
14 13 12 11 10
a b c d e
Оператор цикла с постусловием целесообразно использовать в тех случаях, когда тело цикла необходимо выполнить не менее одного раза и заранее неизвестно общее количество повторений цикла. Формат оператора:
<0ператор1>;
. . .
<0ператор N >;
until<условие>;
Условие – это выражение логического типа. Операторы, заключенные между словами repeatи until, составляют тело цикла и выполняются до тех пор, пока логическое выражение не примет значение true. То есть тело цикла повторяется при значении логического выражения, равном false. Поскольку условие проверяется в конце цикла, то операторы тела цикла выполняются, как минимум, один раз.
В теле цикла может находиться произвольное число операторов без операторных скобок beginи end. По крайней мере, один из операторов тела цикла должен влиять на значение условия, в противном случае произойдет зацикливание.
Примеры.
а ) d:=1; s:=0; б ) d:=1; s:=0;
repeat repeat
s:=s+d s:=s+d;
until ( d >100); d := d +1;
//бесконечный цикл until ( d >100);
Оператор цикла с предусловием целесообразно использовать в случаях, когда число повторений тела цикла заранее неизвестно и тело цикла может не выполняться. Во многом этот оператор аналогичен оператору repeat… until, но проверка условия выполняется в начале оператора. Формат оператора цикла с предусловием:
While<условие> do<0ператор>;
Оператор тела цикла выполняется до тех пор, пока логическое выражение не примет значение false, то есть, в отличие от цикла с постусловием, цикл выполняется при значении логического выраженияtrue.
Пример. i:=30;
While (i<40) do i:=i+1; // если (i>40) ? – ни разу
Write(i); // если (i>10) ? – бесконеч .
Если перед первым выполнением цикла условие не выполняется (значение логического выражения равно false), то тело цикла вообще не выполняется и происходит переход на оператор, следующий за оператором цикла.
Источник
Операторы цикла
Операторы цикла используются для организации многократно повторяющихся вычислений. К операторам цикла относятся: цикл с предусловием while, цикл с постусловием do while, цикл с параметром for и цикл перебора foreach..
Цикл с предусловием while
Оператор цикла while организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Формат цикла while:
где B – выражение, истинность которого проверяется (условие завершения цикла); S – тело цикла – оператор (простой или составной).
Перед каждым выполнением тела цикла анализируется значение выражения В: если оно истинно, то выполняется тело цикла, и управление передается на повторную проверку условия В ; если значение В ложно – цикл завершается и управление передается на оператор, следующий за оператором S.
Если результат выражения B окажется ложным при первой проверке, то тело цикла не выполнится ни разу. Отметим, что если условие B во время работы цикла не будет изменяться, то возможна ситуация зацикливания, то есть невозможность выхода из цикла. Поэтому внутри тела должны находиться операторы, приводящие к изменению значения выражения B так, чтобы цикл мог корректно завершиться.
В качестве иллюстрации выполнения цикла while рассмотрим программу вывода на экран целых чисел из интервала от 1 до n.
{
Console.Write(“N= “);
int n=int.Parse(Console.ReadLine());
int i = 1;
while (i <= n) //пока i меньше или равно n
Console.Write(” “+ i++ ); //выводим i на экран, затем увеличиваем его на 1
}
Результаты работы программы:
10 1 2 3 4 5 6 7 8 9 10
Задание. Измените программу так, чтобы:
- числа выводились в обратном порядке;
- выводились только нечетные числа.
Цикл с постусловием do while
Оператор цикла do while также организует выполнение одного оператора (простого или составного) неизвестное заранее число раз. Однако в отличие от цикла while условие завершения цикла проверяется после выполнения тела цикла. Формат цикла do while:
где В – выражение, истинность которого проверяется (условие завершения цикла); S – тело цикла – оператор (простой или блок).
Сначала выполняется оператор S, а затем анализируется значение выражения В: если оно истинно, то управление передается оператору S, если ложно – цикл завершается, и управление передается на оператор, следующий за условием B. Так как условие В проверяется после выполнения тела цикла, то в любом случае тело цикла выполнится хотя бы один раз.
В операторе do while, так же как и в операторе while, возможна ситуация зацикливания в случае, если условие В всегда будет оставаться истинным.
В качестве иллюстрации выполнения цикла do while рассмотрим программу вывода на экран целых чисел из интервала от 1 до n.
{
Console.Write(“N= “);
int n=int.Parse(Console.ReadLine());
int i = 1;
do
Console.Write(” ” + i++);
//выводим i на экран, затем увеличиваем его на 1
while (i <= n); //пока i меньше или равно n
}
Задание. Измените программу так, чтобы:
- числа выводились в обратном порядке;
- выводились только четные числа.
Цикл с параметром for
Цикл с параметром имеет следующую структуру:
Инициализация используется для объявления и/или присвоения начальных значений величинам, используемым в цикле в качестве параметров (счетчиков). В этой части можно записать несколько операторов, разделенных запятой. Областью действия переменных, объявленных в части инициализации цикла, является цикл и вложенные блоки. Инициализация выполняется один раз в начале исполнения цикла.
Выражение определяет условие выполнения цикла: если его результат истинен, цикл выполняется. Истинность выражения проверяется перед каждым выполнением тела цикла, таким образом, цикл с параметром реализован как цикл с предусловием. В блоке выражение через запятую можно записать несколько логических выражений, тогда запятая равносильна операции логическое И ( && ).
Модификация выполняется после каждой итерации цикла и служит обычно для изменения параметров цикла. В части модификация можно записать несколько операторов через запятую.
Оператор (простой или составной) представляет собой тело цикла.
Любая из частей оператора for (инициализация, выражение, модификация, оператор) может отсутствовать, но точку с запятой, определяющую позицию пропускаемой части, надо оставить.
{
Console.Write(“N= “);
int n=int.Parse(Console.ReadLine());
for (int i=1; i<=n;) //блок модификации пустой
Console.Write(” ” + i++);
}
Задание. Измените программу так, чтобы:
- числа выводились в обратном порядке;
- выводились квадраты чисел.
Замечание. Цикл перебора foreach будет рассмотрен позже.
Вложенные циклы
Циклы могут быть простые или вложенные (кратные, циклы в цикле). Вложенными могут быть циклы любых типов: while, do while, for. Каждый внутренний цикл должен быть полностью вложен во все внешние циклы. “Пересечения” циклов не допускаются.
Рассмотрим пример использования вложенных циклов, который позволит вывести на экран числа следующим образом:
2 | 2 | 2 | 2 | 2 |
2 | 2 | 2 | 2 | 2 |
2 | 2 | 2 | 2 | 2 |
2 | 2 | 2 | 2 | 2 |
{
for (int i = 1; i <= 4; ++i, Console.WriteLine()) //1
for (int j=1; j<=5; ++j)
Console.Write(” ” + 2);
}
Замечание. В строке 1 в блоке модификации содержится два оператора ++i и Console.WriteLine(). В данном случае после каждого увеличения параметра i на 1 курсор будет переводиться на новую строку.
Задание. Измените программу так, чтобы таблица содержала n и m столбцов (значения n и m вводятся с клавиатуры).
Операторы безусловного перехода
В С# есть несколько операторов, изменяющих естественный порядок выполнения команд: оператор безусловного перехода goto, оператор выхода break, оператор перехода к следующей итерации цикла continue, оператор возврата из метода return и оператор генерации исключения throw.
Оператор безусловного перехода goto
Оператор безусловного перехода goto имеет формат:
В теле той же функции должна присутствовать ровно одна конструкция вида:
Оператор goto передает управление на помеченный меткой оператор. Рассмотрим пример использования оператора goto:
{
float x;
metka: Console.WriteLine(“x=”); //оператор, помеченный меткой
x = float.Parse(Console.ReadLine());
if (x!=0) Console.WriteLine(“y({0})={1}”, x, 1 / x );
else
{
Console.WriteLine(“функция не определена”);
goto metka; // передача управление метке
}
}
Следует учитывать, что использование оператора goto затрудняет чтение больших по объему программ, поэтому использовать метки нужно только в крайних случаях, например, в операторе switch.
Оператор выхода break
Оператор break используется внутри операторов ветвления и цикла для обеспечения перехода в точку программы, находящуюся непосредственно за оператором, внутри которого находится break.
Мы уже применяли оператор break для выхода из оператора switch, аналогичным образом он может применяться для выхода из других операторов.
Оператор перехода к следующей итерации цикла continue
Оператор перехода к следующей итерации цикла continue пропускает все операторы, оставшиеся до конца тела цикла, и передает управление на начало следующей итерации (повторение тела цикла). Рассмотрим оператор continue на примере.
{
Console.WriteLine(“n=”);
int n = int.Parse(Console.ReadLine());
for (int i = 1; i <= n; i++)
{
if (i % 2 == 0) continue;
Console.Write(” ” + i);
}
}
Замечание.Операторы return и throw будут рассмотрены позже.
Источник
3.5 Операторы цикла
Циклический процесс, или просто цикл — это повторение одних и тех же действий. Последовательность действий, которые повторяются в цикле, называют телом цикла. Один проход цикла называют шагом, или
итерацией9. Переменные, которые изменяются внутри цикла и влияют на его окончание, называются параметрами цикла.
При написании циклических алгоритмов следует помнить следующее. Во-первых, чтобы цикл имел шанс когда-нибудь закончиться, содержимое его тела должно обязательно влиять на условие цикла. Во-вторых, условие должно состоять из корректных выражений и значений, определённых ещё до первого выполнения тела цикла.
В языке Free Pascal для удобства программиста предусмотрены три оператора, реализующих циклический процесс: while, repeat..until и for.
3.5.1 Оператор цикла с предусловием while..do
На рис. 3.24 изображена блок-схема алгоритма цикла с предусловием.
Оператор, реализующий этот алгоритм, в языке Free Pascal имеет вид:
while выражение do оператор;
Выражение должно быть логической константой, переменной или логическим выражением.
Работает оператор while следующим образом. Вычисляется значение выражения.
Если оно истинно (True), выполняется оператор. Выполнение цикла заканчивается, если условие ложно, после этого управление передается оператору, следующему за телом цикла. Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение ложно (False), цикл не выполнится ни разу.
Если в цикле надо выполнить более одного оператора, необходимо использовать составной оператор:
begin
оператор_1;
оператор_2;
…
оператор_n;
end;
Рассмотрим пример. Пусть необходимо вывести на экран значения функции на отрезке с шагом 0.1.
Применим цикл с предусловием :
begin
{Присваивание параметру цикла стартового значения.}
x : = 0;
{Цикл с предусловием.}
while x<=pi do {Пока параметр цикла не превышает}
{конечное значение, выполнять тело цикла.}
begin
{Вычислить значение y.}
y:=exp ( sin ( x ) ) * cos ( x );
{Вывод на экран пары х и y.}
writeln ( ’ x= ’, x, ’ y= ’, y );
{Изменение параметра цикла – переход к следующему значению x.}
x:=x + 0.1;
end; {Конец цикла.}
end.
В результате работы данного фрагмента программы на экран последовательно будут выводиться сообщения со значениями переменных x и y:
x= 0.1; y =1.0995
…
x= 3.1; y= -1.0415
3.5.2 Оператор цикла с постусловием repeat..until
Если в цикле с предусловием проверка условия осуществляется до тела цикла, то в цикле с постусловием условие проверяется после тела цикла (см. рис. 3.25). Сначала выполняются операторы, являющиеся телом цикла, после чего проверятся условие, если последнее ложно, то цикл повторяется. Выполнение цикла прекратится, если условие станет истинным.
В языке Free Pascal цикл с постусловием реализован конструкцией
оператор;
until выражение;
или, если тело цикла состоит более чем из одного оператора
оператор_1;
оператор_2;
…
оператор_N;
until выражение;
Выражение должно быть логическим.
Работает цикл следующим образом. В начале выполняется оператор, представляющий собой тело цикла. Затем вычисляется значение выражения. Если оно ложно (False), оператор тела цикла выполняется ещё раз. В противном случае цикл завершается, и управление передается оператору, следующему за циклом.
Таким образом, нетрудно заметить, что цикл с постусловием всегда будет выполнен хотя бы один раз, в отличие от цикла с предусловием, который может не выполниться ни разу.
Если применить цикл с постусловием для создания подпрограммы, которая выводит значения функции на отрезке с шагом 0.1, получим:
begin
{Присваивание параметру цикла стартового значения.}
x : = 0;
{Цикл с постусловием.}
repeat {Начало цикла}
y:=exp ( sin ( x ) ) * cos ( x );
writeln ( ’ x= ’, x, ’ y= ’, y );
x:=x + 0.1; {Изменение значения параметра цикла.}
until x > pi; {Закончить работу цикла,}
{когда параметр превысит конечное значение.}
end.
Источник