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

Повторяемый блок вычислений называют телом цикла. В теле цикла должно быть обеспеченоизменение значения счетчика , чтобы он мог завершиться. Если тело цикла состоит более, чем из одного оператора, онозаключается в операторные скобки 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, как и в большинстве языков программирования, существует три типа циклических конструкций.

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

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

Задача 1. Вывести все числа от 1 до числа, введенного с клавиатуры.

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

Как вы, наверное, уже поняли из названия, while — это цикл, в котором условие стоит перед телом. Причем тело цикла выполняется тогда и только тогда, когда условие true ; как только условие становится false

While имеет формат:

while < условие> do <оператор 1>; {Пока … делай ….}

Данный цикл подходит только для одного оператора, если же вы хотите использовать несколько операторов в своем коде, вам следует заключить их в операторные скобки — begin и end; .

Решение задачи.

Program example_while; var i, N: integer; { объявляем переменные } begin i:= 1; { Присваиваем i значение 1 } readln(N); { Считываем последнее число } while i <= N do {Как только i станет больше N, цикл прекратится (можно было бы написать просто <, но пришлось бы добавлять 1 к N) } begin {Открываем операторные скобки} write(i, " "); {Выводим i} Inc(i); {увеличиваем i на один.} end; { закрываем скобки } end.

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

Repeat — полная противоположность while . Repeat — это цикл, в котором условие стоит после тела. Причем оно выполняется тогда и только тогда, когда результат условия false ;как только логическое выражение становится true , выполнение цикла прекращается.

Repeat имеет формат:

repeat { повторяй … }
<оператор 1>;
< оператор 2>;

until {до…} <условие>

Begin и end не требуются.

Решение задачи.

Program example_repeat; var i, N: integer;{ объявляем переменные } begin i:= 1; { Присваиваем i значение 1 } readln(N); { Считываем последнее число } repeat {после repeat не требуется begin и end } write(i, " "); {Выводим i} Inc(i); {увеличиваем i на один.} until i = N + 1; {Например, i = 11, а N = 10. Цикл прекратится, так условие стало true.} end.

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

For — это цикл, в котором тело выполняется заданное количество раз.

Существует две формы записи этого цикла:

Первая форма

for <счетчик1> := <значение1> to <конечное_значение> do <оператор1>;

<счетчик1> будет увеличиваться на 1.

<значение1> — это начальное значение счетчика. Это может быть переменная или число.
<конечное_значение> : как только значение <счетчик1> станет больше <конечное_значение>

Если требуется написать несколько операторов в теле цикла, используем begin и end .

И <счетчик1>, и <конечное_значение>, и <значение1> — переменные целого типа.

Чаще всего в качестве счетчика используется переменная i.

Вторая форма

for <счетчик2> := <значение2> downto <конечное_значение> do <оператор1>;

После каждой итерации значение <счетчик2> будет уменьшатся на 1.

<значение2> — это начальное значение счетчика.
<конечное_значение> : как только значение <счетчик2> станет меньше <конечное_значение>, выполнение цикла прекратится.

Два важных примечания:

  1. Цикл повторяется, пока значение значение счетчика лежит в отрезке [значение; конечное_значение].
  2. Изменять значение счетчика внутри тела нельзя ! Вот что выводит компилятор:

Решение задачи:

Program example_for; var i, N: integer; begin read(N); {предположим, что мы ввели 10} for i:= 1 to N do write(i, " "); {количество итераций - 10 - 1 + 1 = 10} end.

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

Давайте решим пару задач.

For1 . Даны целые числа K и N (N > 0). Вывести N раз число K.

Организовываем простой цикл от 1 до требуемого числа.

Program for1; var K, N, i: integer; begin read(K, N); for i:= 1 to N do write(K, " "); {Пишем К через пробел } end.

For2 . < B). Вывести в порядке возрастания все целые числа, расположенные между A и B (включая сами числа A и B), а также количество N этих чисел.

Так как A < B, то цикл должен будет выводить все числа от А до B. Чтобы сосчитать количество чисел, используем формулу: <конечное_значение> — <начальное_значение> + 1.

Program for2; var A, B, i, count: integer; begin read(A, B); for i:= A to B do write(i, " "); {выписываем числа от меньшего к большему} count:= B - A + 1; {считаем количество чисел} writeln; write("Количество чисел - ", count); end.

For9 . Даны два целых числа A и B (A < B). Найти сумму квадратов всех целых чисел от A до B включительно.

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

Program for9; var A, B, i, S: integer; begin read(A, B); S:= 0; {PascalABC делает это автоматически, но если у вас другой компилятор советуем обнулять переменные вручную} for i:= A to B do S:= S + Sqr(i); {складываем все квадраты} writeln; write("Сумма квадратов - ", S); end.

For13° . Дано целое число N (> 0). Найти значение выражения 1.1 – 1.2 + 1.3 – … (N слагаемых, знаки чередуются). Условный оператор не использовать.

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

Program for13; var N, A, i: integer; S: real; begin Write("N = "); readln(N); S:= 1.1; A:= 1; {Сначала положительное} for i:= 2 to N do {первую итерацию цикла мы уже произвели, поэтому начинаем отсчет с 2} begin A:= -A; {Теперь отрицательное} S:= S + A * (1 + i / 10); {Складываем} end; Writeln(S:5:1); {Отдадим под дробную часть одно знакоместо} end.

While1° . Даны положительные числа A и B (A > B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти длину незанятой части отрезка A.

Каждый раз вычитаем B из А, пока А — В >= 0.

Program while1; var A, B: integer; begin readln(A, B); while (A - B) >= 0 do A:= A - B; {Пока разница положительная, вычитаем. Необходимо предусмотреть вариант с кратностью А и B, поэтому >=} write(A); end.

While4° . Дано целое число N (> 0). Если оно является степенью числа 3, то вывести True, если не является - вывести False.

Действуем следующим образом: пока N делится нацело на три, делим N нацело. Затем, если N = 1 — число является степенью тройки; если N <> 1, тогда число — не степень тройки. Для того чтобы решить эту задачу, требуется знать, что такое , и как работают .

Program while4; var N: integer; begin readln(N); while N mod 3 = 0 do N:= N div 3; {Пока остаток от деления на три равен нулю, делим N нацело } writeln(N = 1); {логическое выражение} end.

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

Как мы уже говорили, в паскале существуют 3 способа организации цикла (типа):

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

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

Цикл В данной статье рассмотрим второй тип цикла — цикл с предусловием (цикл WHILE) . Если цикл со счетчиком мы используем в случаях, когда необходимо организовать цикл с известным числом повторений, то цикл с предусловием используется, когда число повторений неизвестно.

WHILE условие DO действие; // тело цикла

Тело цикла выполняется пока условие ИСТИННО.

Если в теле цикла действий несколько — используются операторные скобки begin … end ;

WHILE условие do begin действие_1; действие_2; действие_3; ... end;

Рассмотрим пример, аналогичный рассмотренному в теме «Цикл со счетчиком», но реализуем его с помощью цикла WHILE .

Требуется на экране вывести:

Привет
Привет
Привет
Привет

Для реализации данного примера с помощью цикла с предусловием нам потребуется переменная n :

WHILE n<4 do writeln("Привет");

Данный цикл будет выполнять команду writeln(‘Привет’) бесконечное число раз. Почему? Потому что переменная n не изменяется и всегда будет меньше 4. Поэтому необходимо в цикле добавить код, изменяющий переменную n. Например: n:=n+1.

WHILE n<4 do begin writeln("Привет"); n:=n+1; end;

Теперь переменная n будет изменяться с каждым выполнением команд тела цикла (с каждой итерацией).

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

Рассмотрим несколько задач, где число повторений в цикле явно не известно.

Решение данной задачи основывается на использовании цикла WHILE, т.к. мы не знаем, когда будет введен ноль и мы перестанем вводить числа.

var a,s:integer; begin s:=0; writeln("Введите число"); readln(a); while(a<>0) do begin s:=s+a; //подсчет суммы S writeln("Введите число"); readln(a); end; writeln(s); end.

Зачем два раза используем ввод числа а (readln(a);)? Первый раз вводим число а для того, чтобы войти в цикл с некоторым значением переменной a, которое будет использоваться в условии цикла WHILE. Второй раз команда readln(a) используется внутри цикла — вводим числа до тех пор, пока не введем ноль.

Задача 2.

Даны два отрезка А и B (A>B). Не используя операции умножения и деления, определить, сколько отрезков В уместится в отрезке А.

Рассмотрим изображение:

Т.е. из рисунка видно, что нам нужно складывать длины отрезка A до тех пор, пока сумма не станет больше длины отрезка В . В этом нам поможет цикл с предусловием — цикл while .

var a,b,s,k:integer; begin writeln("Введите длину отрезка А"); readln(a); writeln("Введите длину отрезка B"); readln(b); k:=0; S:=a; while s k:=k+1; //переменная k считает количество выполнения тела цикла s:=s+a; //суммирует длину отрезка А end; writeln("В отрезке В содержится ",k," отрезков А"); end.

Рассмотрим работу программы на примере: А=5 , В=21 . Рассуждения запишем в таблицу:

Задача 3.

Используя алгоритм Евклида, найти НОД двух чисел.

Рассмотрим блок-схему алгоритма Евклида:

Запишем данной алгоритм с помощью Паскаля, опираясь на данную блок-схему. Как видим, у нас имеется цикл с предусловием (M>N) . Внутри цикла еще одно условие (M>N) , т.е. оператор IF… THEN .

var M, N: integer; begin writeln("Введите М и N"); readln(M, N); while M<>N do begin if M>N then M:=M-N else N:=N-M end; write("Н0Д = ",М) end.

Аналогично задаче 2 можно проверить данный алгоритм, записав рассуждения в таблицу.

Оператор цикла 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 . Каждый внутренний цикл должен быть полностью вложен во все внешние циклы. «Пересечения» циклов не допускаются.

В общих чертах, сегодня узнаем о каждом из циклов в паскале поподробней и увидим как они задаются. Будем разбирать цикл while с предусловием , цикл for с параметром и цикл repeat - until с постусловием .

1. Цикл с параметром в Паскале - FOR

Цикл FOR задаёт определённое условие по которому программа будет работать до его выполнения, допустим нужно нам 5 (или n) раз зациклить программу, то это легко сделать с помощью данного цикла. У цикла FOR есть характерная черта - счетчик который обычно обозначается буквой i или j.

Внешний вид цикла с параметром в паскале:

for i:= 1 to n do // присваиваем i сначала одному, потом двум, трем, ..., n

После 1-го прохода переменной i присваиваем 1, после второго присваиваем 2 и так до тех пор, пока не дойдем до n. to - это до.. в порядке возрастания, также есть downto - до.. в порядке убывания.

Блок - схема цикла с параметром:

2. Цикл с предусловием в Паскале - WHILE

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

Структура цикла с предусловием:

WHILE DO begin end;

Логическое выражение, истинность которого проверяется вначале выполнения циклического оператора;

Любые выполняемые операторы языка.

Порядок выполнения цикла:

Пока условие истинно выполняется тело цикла. Как только условие становится ложно выполнение цикла прекращается.

Блок - схема цикла с предусловием:


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

Пример:

Задача: вычислить сумму ряда 1+1.5+2+2.5+3+3.5+ .. + 30

program example-while;

Var sum:real; n:real; BEGIN sum:=0; n:=1; while n

3. Цикл с постусловием - Repeat - until.

Этот оператор аналогичен оператору цикла с предусловием, но отличается от него тем, что проверка условия производится после выполнения тела (действий) цикла. Это обеспечивает его выполнение хотя бы один раз в отличие от ранее разобранных циклов.

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

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

Блок - схема цикла с постусловием:

Формат записи, структура цикла:
REPEAT UNTIL ;

Пример:

Program test2; Var b:Real; Begin b:=100; Repeat b:=b/2; Until b

Выводы:

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

2. Цикл с предусловием выполняется до тех пор, пока условие выполнения не станет ложным, и продолжается, если условие истинно.

3. Цикл с постусловием выполняется до тех пор, пока условие не станет истинно, если условие ложно, цикл продолжается.