Циклические операторы в паскале a b. Операторы цикла в паскале. Оператор цикла с постусловием

С помощью этого оператора переменные в Турбо Паскале могут получать свои значения программным путем (то есть не с клавиатуры). Формат:

<идентификатор (имя) переменной>:= <выражение>

Система сначала вычисляет значение выражения, затем присваивает его переменной.

    Составной оператор.

Составной оператор – это последовательность любых операторов Турбо Паскаля, заключенная в операторные скобки begin и end. Например:

begin a:=5; write (‘a=’,a); end;

Среди операторов составного оператора могут быть другие составные операторы, то есть допускается любая глубина их вложения. Например:

    Операторы условного перехода.

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

    Полный условный оператор

Реализует алгоритмическую конструкцию «полная развилка»:

Его формат:

if <логическое выражение> then <оператор 1> else <оператор 2>

If, then, else – служебные слова «если», «тогда», «иначе». Перед словом else точка с запятой не ставится. Оператор 1 и оператор 2 могут быть как простыми операторами, так и составными. Составной оператор следует заключать в операторные скобки begin и end.

Действия условного оператора: если логическое выражение имеет значение true, то выполняется оператор 1, если логическое выражение имеет значение false, то выполняется оператор 2.

    Неполный условный оператор

Реализует алгоритмическую конструкцию «неполная развилка»

Его формат:

if <логическое выражение> then <оператор >

If, then – служебные слова «если», «тогда». Оператор может быть как простыми оператором, так и составным.

Действия условного оператора: если логическое выражение имеет значение true, то выполняется оператор, если логическое выражение имеет значение false, то условный оператор пропускается и выполняется оператор, следующий за ним.

Условные операторы (полный и неполный) могут иметь вложенную конструкцию, то есть после слов THEN или ELSE опять используется условный оператор. Служебное слово ELSE всегда относится к ближайшему слева слову THEN.

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

Замечание: после слова THEN не может сразу записываться новый условный оператор, а после ELSE – может. Например:

В тех случаях, когда требуется проверить несколько условий, применяются сложные условные операторы. В них используются логические операции and, not, or. Например:

if ((x>3) and (y>3) and (z>3)) then ...

    Операторы организации цикла.

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

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

Этот оператор реализует блок-схему цикла с предусловием:

Его формат:

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

While («пока»), Do («делать») - служебные слова.

Действия оператора: пока логическое выражение имеет значение true, выполняется тело цикла; как только логическое выражение принимает значение false, действие оператора заканчивается и выполняется оператор, следующий за ним. Значение логического выражения проверяется перед телом цикла. Если логическое выражение ложно с самого начала, то тело цикла сразу опускается.

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

Если же тело цикла - один оператор (не составной), то операторных скобок не требуется. Тогда транслятор считает, что тело цикла заканчивается на ближайшем знаке «;». В Паскале нет специальных слов для обозначения начала цикла и конца цикла. На все случаи есть универсальные слова Begin и End.

    Оператор цикла с постусловием

Этот оператор реализует блок-схему цикла с постусловием:

Его формат:

Repeat <тело цикла> Until <логическое выражение>

Repeat («повторять»), Until («до тех пор») - служебные слова.

Тело цикла может быть как одиночным, так и составным оператором, однако употребления Begin и End не требуется, поскольку сами слова Repeat и Until выполняют роль операторных скобок.

Действия оператора: выполняется тело цикла, затем проверяется значение логического выражения. Если логическое выражение имеет значение false, то опять выполняется тело цикла. Так продолжается до тех пор, пока логическое выражение не примет значение true. То есть тело цикла повторяет свое выполнение, если условие ложно. Повторение кончается, когда условие станет истинным. Действие оператора заканчивается и выполняется оператор, следующий за ним. Значение логического выражения проверяется после тела цикла.

Замечания:

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

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

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

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

Этот оператор реализует блок-схему цикла со счетчиком. Его формат:

for <параметр цикла>:= <арифметическое выражение 1> to <арифметическое выражение 2> do <тело цикла>

for < параметр цикла >:= < арифметическое выражение 1> downto < арифметическое выражение 2> do <тело цикла>

Параметр цикла – это переменная любого типа, кроме real.

Арифметические выражения 1 и 2 должны иметь тот же тип, что и параметр цикла. Тело цикла – любой оператор Паскаля (простой, сложный, составной).

Действия оператора: параметру цикла присваивается значение арифметического выражения 1. Если оно меньше (для for - to - do ) или больше (для for - downto - do ) значения арифметического выражения 2, то выполняется тело цикла. Затем параметр цикла увеличивается (уменьшается) на величину, указанную в теле цикла. Потом он снова сравнивается с арифметическим выражением 2. И так до тех пор, пока параметр цикла не станет больше (меньше) значения арифметического выражения 2. Далее оператор цикла заканчивает работу и выполняется следующий за ним оператор.

Если параметр цикла имеет тип integer, то при слове to шаг изменения параметра равен единице (при downto шаг равен -1).

Этот оператор имеет ограниченное применение, то есть его можно использовать только в тех случаях, когда известно число повторений тела цикла

Оператор цикла с параметром (цикл FOR)

Общий вид:

for <пар .>:=<n1 > to <n2 > do <оп .> ;

<пар .> – параметр цикла, переменная дискретно-упорядоченного типа , как правило типа integer,

<n1 > – выражение того же типа, начальное значение параметра, присваиваемое ему на входе в цикл,

<n2 > – выражение того же типа, конечное значение параметра,

<оп. > – оператор, выполнение которого повторяется до тех пор, пока параметр цикла, увеличиваясь после каждого шага на единицу, не превысит <n2 >.

Иными словами, цикл for действует следующим образом: вначале вычисляется параметр <n1 > и осуществляется присваивание <пар .>:=<n1 >. После этого циклически повторяется (для параметра целого типа):

1) проверка условия <пар .>¹+1, если условие не выполняется (т.е. <пар .>=+1) , то цикл завершается;

2) выполнение оператора <оп .>;

3) увеличение переменной <пар .> на единицу.

Замечание 1: Переменная <пар .>, а также выражения <n1 > и <n2 > не могут быть типа real , так как он не является дискретно-упорядоченным.

Замечание 2: В качестве <оп .> может присутствовать только один оператор . В случае, если повторяться должны сразу несколько операторов, то их надо сформировать в блок с помощью операторных скобок begin и end.

Блок-схема: цикла FOR :


Другая форма оператора FOR:

for <пар .>:=<n2 > downto <n1 > do <оп .> ;

В этом случае оператор <оп .> повторяется при уменьшении параметра цикла на единицу. Цикл завершается при достижении условия <пар .>=<n1 >–1.


Блок-схема:



Оператор цикла с предусловием (цикл WHILE)

Общий вид:

while <условие > do <оп.> end;

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

<оп .> – оператор.

Действие . Циклически повторяется:

1) проверка выражения <условие >. Если результат есть false (т.е. <условие > ложно), то цикл завершается;

2) в случае, если <условие > истинно, выполняется оператор <оп .>.





Замечание: Как и в цикле FOR, в качестве <оп .> может присутствовать только один оператора. Если операторов, которые должны повторяться, больше одного, то они должны быть сформированы в блок с помощью операторных скобок begin и end.

Оператор цикла с постусловием (цикл REPEAT)

Общий вид :

<оп.1 >;

<оп.2 >;

…………

<оп.N >;

until <условие >;

<оп.1 >, <оп.2 > ,…, <оп.N > – операторы,

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

Действие. Последовательность операторов <оп.1 >, <оп.2 > ,…, <оп.N > выполняется хотя бы один раз, после чего проверяется <условие >. Если результат есть true, то цикл завершается. В противном случае опять выполняется последовательность операторов, <оп.2 > ,…, <оп.N > , затем снова проверяется условие и так далее.

Блок-схема:


Замечание 1. Конструкция repeat … until позволяет повторять сразу несколько операторов, поэтому здесь не требуется (как в случае FOR и WHILE) формировать операторы в блок.

Замечание 2 . <условие > в цикле WHILE и <условие > в цикле REPEAT имеют противоположный смысл: в цикле WHILE <условие > есть условие продолжения цикла, а в цикле REPEAT <условие > есть условие окончания цикла.

Пример 1. Дано целое n . Вычислить сумму

Решение. Для обозначения суммы вводится переменная s , которой изначально присваивается значение 0. Затем организуется цикл, на каждом шаге которого к s прибавляется очередное слагаемое. Поскольку известны границы изменения k (от 0 до n ), то в качестве оператора цикла удобнее всего взять цикл FOR с параметром k и границами 1 и n.

Программа:

var k,n:integer; s:real;

writeln(¢введите n¢);

for k:=1 to n do

s:=s+k/(1+k*k*k);

writeln(¢s=¢,s)

Пример 2 . Сумма тех же слагаемых, что и в примере 1, только вместо n даётся вещественное число (степень точности). Требуется суммировать до тех пор, пока очередное слагаемое не станет меньше .

Решение. В этом случае число слагаемых заранее не известно, зато известно условие, при котором следует закончить суммирование. Поэтому удобнее использовать цикл с выходом по условию, например REPEAT. Для обозначения очередного слагаемого удобно ввести переменную а .

Программа:

var k,eps,s,a:real;

writeln(¢введите eps¢);

until abs(a)

writeln(¢s=¢,s)

Пример3. Даны n, m. Вычислить сумму

Решение. Считается сумма по двум параметрам, следовательно используется конструкция «цикл в цикле». Внутренний цикл считает сумму по j при фиксированном i, внешний – сумму по i.

Программа:

var i,j,m,n:integer;

writeln(¢введите m,n¢);

for i:=2 to m do

for j:=1 to n do s:=s+1/(i*i+j*j*j);

writeln(¢s=¢,s)

Пример 4 . Даны х,n. Вычислить сумму

Решение: Здесь слагаемое имеет более сложную структуру – оно содержит факториал k !=1*2*3*…*k , вычисление которого есть само по себе цикл, степень , операции для вычисления которой в данной версии паскаля нет, и «мигалку»

Операторы цикла заставляют выполнять входящие в их состав операторы

несколько раз.

В Паскале существует три вида операторов цикла: оператор цикла с параметром, оператор цикла с предусловием, оператор цикла с постусловием.

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

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

for V:=E1 to E2 do S

где V - переменная порядкоавого типа, Е1, Е2 - выражения того же типа, S - оператор, называемый телом цикла. Выражения Е1 и Е2 вычисляются один раз при входе в цикл. Параметр V принимает сначала значение Е1 затем непос редственно следующее за ним (SUCC(V)) и т.д. до достижения Е2. При каждом значении V выполняется оператор S. Если в теле цикла необходимо выполнить несколько операторов, то их объединяют в один с помощью составного оператора. Если конечное значение Е2 меньше начального Е1, то оператор S не выполняется ни разу.

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

for V:=Е1 downto E2 do S

В отличии от первого случая V изменяется от Е1 до Е2, переходя от V к pred(V).

Отметим, что если V, Е1, Е2 типа INTEGER, то в первом случае это цикл с шагом +1, а во втором с шагом -1.

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

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

где B - логическое выражение, S - оператор. Оператор S будет выполняться пока условие B будет истинно. Выполнение оператора цикла завершится когда выражение B впервые примет значение false.

Оператор цикла с постусловием

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

repeat S until B

где B - логическое выражение, S - оператор. Оператор S выполняется до тех пор, пока B не станет истинным. Оператор REPEAT выполняется по крайней мере один раз, так как проверка истинности условия B осуществляется после выполнения оператора S.

Служебные слова REPEAT и UNTIL уже играют роль скобок, поэтому операторные скобки BEGIN и END являются необязательными.

Примеры программ

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

Программа 2.1.1. Цикл с параметром (шаг +1)

PROGRAM FACTORIAL1;

VAR I,N:INTEGER;

WRITE("ВВЕДИТЕ N");

READLN(N); F:=1;

FOR I:=1 TO N DO F:=F*I;

Программа 2.1.2. Цикл с параметром (шаг -1)

PROGRAM FACTORIAL2;

VAR I,N:INTEGER;

WRITE("ВВЕДИТЕ N");

READLN(N); F:=1;

FOR I:=N DOWNTO 1 DO F:=F*I;

WRITELN ("ФАКТОРИАЛ ОТ ",N," РАВЕН ",F)

Программа 2.2. Цикл с предусловием

PROGRAM FACTORIAL3;

VAR I,N:INTEGER;

WRITE("ВВЕДИТЕ N");

READLN(N); F:=1; I:=1;

WHILE I<=N DO

WRITELN ("ФАКТОРИАЛ ОТ ",N," РАВЕН ",F)

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

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

Цикл for

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

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

Цикл for существует в двух формах:

for счетчик: = значение to конечное_значение do тело_цикла;

for счетчик: = значение downto конечное_значение do тело_цикла;

Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to , то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto , то значение параметра будет уменьшаться на единицу.

Количество итераций цикла for известно именно до его выполнения, но не до выполнения всей программы. Так в примере ниже, количество выполнений цикла определяется пользователем. Значение присваивается переменной, а затем используется в заголовке цикла. Но когда оно используется, циклу уже точно известно, сколько раз надо выполниться.

"Количество знаков: " ) ; readln (n) ; for i : = 1 to n do write ("(*) " ) ; readln end .

Цикл while

Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true , то тело цикла выполняется, если false – то нет.

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

var i, n: integer ; begin write ("Количество знаков: " ) ; readln (n) ; i : = 1 ; while i <= n do begin write ("(*) " ) ; i : = i + 1 end ; readln end .

Цикл repeat

Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false . Однако такая ситуация не всегда может быть приемлемой. Бывает, что тело цикла должно выполниться хотя бы один раз, не зависимо оттого, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.

В цикле repeat логическое выражение стоит после тела цикла. Причем, в отличие от цикла while , здесь всё наоборот: в случае true происходит выход из цикла, в случае false – его повторение.

В большинстве программ встречается необходимость многократного выполнения некоторого оператора (или блока операторов). Для организации подобного рода конструкций могут использоваться операторы цикла. В языке программирования Паскаль используются следующие виды операторов цикла: for, while, repeat (в PascalABC.NET используется также оператор цикла foreach ).

Блок операторов, который необходимо выполнить многократно называется телом цикла.

Оператор for в Паскаль

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

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

В зависимости от направления изменения параметра цикла (возрастание - to или убывание - downto ) в языке Паскаль оператор цикла for может быть записан в одной из двух форм:

  • for параметр := нач_знач to кон_знач do
  • оператор;
  • for параметр := нач_знач downto кон_знач do
  • оператор;

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

Рассмотрим работу цикла for .

Перед началом выполнения оператора цикла вычисляются начальное значение, присваиваемое переменной-параметру, и конечное значение. Затем, циклически выполняются следующие операции:

  1. Сравнивается текущее значение параметра с конечным значением.
  2. Если условие параметр кон_знач истинно, то выполняется тело цикла, в противном случае оператор for завершает работу и управление передается оператору, следующему за циклом.

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

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

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

{Фрагмент кода программы}

  • for i:= 10 downto 1 do
  • writeln(i:2, " ", i * i);

Внимание: если в теле цикла необходимо использовать более одного оператора, то применяется составной оператор (операторные скобки begin и end ).

Пример 2. Известны оценки абитуриента на четырех экзаменах. Определить сумму набранных им баллов.

Задача. Известны оценки абитуриента на четырех экзаменах. Определить сумму набранных им баллов.

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

{Фрагмент кода программы}

  • s:= 0;
  • for i:= 1 to 4 do
  • begin
  • readln(mark);
  • s:= s + mark;
  • writeln(s);