Вы находитесь на странице: 1из 9

Лекция 05 Программирование алгоритмов циклической структуры

1. Общая характеристика операторов цикла


2. Операторы цикла с параметром
3. Операторы цикла с условием
4. Вложенные циклы
5. Процедуры управления циклами.

1. Общая характеристика операторов цикла


Алгоритмы решения многих задач являются циклическими, то есть для
получения результата определенная последовательность действий должна быть
выполнена несколько раз. Последователь повторяющихся действий называется
циклом. Все операторы цикла можно разделить на 2 группы:
 операторы цикла с параметром (счетные);
 операторы цикла с условием (итерационные).
Операторы цикла с параметром применяются в тех случаях, когда известно
количество повторений цикла (вычисление конечных сумм, работа со
статическими массивами или строками и т.д.)
Операторы цикла с условием применяются в случаях, когда количество
повторений цикла заранее неизвестно, и выход из цикла зависит от выполнения
(невыполнения) некоторого условия (приближенные вычисления).
В PascalABC.net 5 операторов цикла: 3 оператора цикла с параметром и 2 с
условием.

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


В PascalABC.net 3 оператора цикла с параметром:
 оператор цикла for;
 оператор цикла loop;
 оператор цикла foreach.

Оператор цикла for


Оператор цикла for имеет одну из двух форм (параметр_ц = параметр
цикла)
for параметр_ц:= начальное значение to конечное значение do оператор
или
for параметр_ц:= начальное значение downto конечное значение do
оператор.

1
В первом случае начальное значение параметра цикла должно быть меньше
конечного, во втором – больше.
Кроме того, в PascalABC.net параметр цикла следует описывать
непосредственно в заголовке цикла:
for параметр_ц: тип:= начальное значение to (downto) конечное значение do
оператор
или
for var параметр_ц:= начальное значение to (downto) конечное значение do
оператор
В последнем случае используется автоопределение типа переменной по
типу начального значения.
При описании параметра цикла в заголовке цикла область действия
параметра распространяется до конца тела цикла. Вне тела цикла этот параметр
недоступен.
for i: integer := 1 to 10 do Print(i);
for var i := 1 to 5 do Print(i*i);
Текст от слова for до слова do включительно называется заголовком цикла,
а оператор после do – телом цикла.
Параметр цикла может иметь любой порядковый тип данных
Примеры
1. for var z1:= ‘a’ to ‘k’ do Print(ord(z1));
2. var en: (red, green, blue, white);
...
for en := red to blue do write(Ord(en):2);

Порядок выполнения:
1) присваивание параметру цикла начального значения
2) проверка условия п_ц <= к_з
3) если условие не выполнено, цикл завершается
4) если условие выполнено, выполняется оператор
5) параметр цикла увеличивается на 1
6) переход к п. 2
Блок-схема:

2
Сч = нач_зн, кон_зн

Тело цикла

Пример 1: Вычислить S = 1 + 4 + 9 + … +n*n


begin
var n:= ReadInteger(‘ведите целое число’)
var s:= 0;
for var i:= 1 to n do s:= s + sqr(i);
println(‘s =’, s);
end;

Оператор цикла loop


Оператор цикла loop имеет форму:
loop выражение do оператор
Выражение должно быть целого типа и указывает количество повторений
тела цикла. Если значение выражения <= 0 , то тело цикла не выполняется ни
разу.
Цикл loop используется в простых ситуациях, когда тело цикла не зависит от
номера итерации цикла.
Примеры
1. loop 5 do Print(1);
2. var x := 1;
loop 5 do
begin
Print(x);
x += 2;
end;

Оператор цикла foreach


Оператор цикла foreach имеет одну из следующих форм:
foreach переменная in контейнер do оператор
3
или
foreach переменная: тип in контейнер do оператор
или
foreach var переменная in контейнер do оператор
Контейнером может быть динамический массив, строка, множество, список и
т.д. Переменная цикла должна иметь тип, совпадающий с типом элементов
контейнера. В последней форме foreach тип переменной цикла выводится
автоматически по типу элементов контейнера.
Переменная цикла пробегает все значения элементов контейнера и для
каждого значения переменной цикла выполняется тело цикла. Изменение
переменной цикла внутри тела цикла не меняет элементы контейнера, т.е. они
доступны только для чтения.
Например:
var
ss: set of string := ['Иванов','Петров','Сидоров'];
a: array of integer := (3, 4, 5);
b: array [1..5] of integer := (1, 3, 5, 7, 9);
l := new List<real>;
begin
foreach s: string in ss do write(s,' ');
writeln;
foreach x: integer in a do write(x,' ');
writeln;
foreach var x in b do write(x,' ');
writeln;
foreach var r in l do write(r,' ');
end.

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


Этот вид операторов цикла применяется в случаях, когда необходимо
выполнить некоторое действие до нарушения (или, наоборот, выполнения)
определенного условия.
В PascalABC.net два вида операторов цикла с условием: оператор цикла с
предусловием и оператор цикла с постусловием.
4
Оператор цикла с предусловием
Общий вид оператора:
while условие do оператор;
условие – выражение логического типа;
оператор – произвольный оператор Паскаля.
Способ выполнения:
1) вычисление значения логического выражения условие;
2) если условие имеет значение true, то выполняется оператор, переход к п.1;
если условие имеет значение false, оператор while прекращает работу.
Блок-схема оператора цикла с предусловием.

Усл.

Операторы

Пример 3: Вычислить сумму всех нечетных чисел от 101 до 151.


begin
var (s, i):= (0; 101);
while i <= 151 do
begin
s += i;
inc(i, 2);
end;
writeln(‘Sum = ’, s);
end.

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


Общий вид оператора:
repeat операторы until условие;
Способ выполнения:
1) выполнение операторов
2) вычисление значения логического выражения условие

5
3) если значение условия false, операторы выполняются снова, иначе
оператор завершает работу.
Блок-схема

Операторы

Усл.

Пример 4. Вычислить, через сколько лет в банке будет сумма S, если начальный
вклад равен V, а годовой процент прироста вклада – P.
begin
var (v, p, s) := ReadReal3(‘Введите вклад, годовой процент
и требуемую сумму’);
var w:= v; var q: real; var k:= 0;
repeat
q:= v*p/100; v:= v + q; inc(k);
until v > s;
println(‘Сумма ', s,’ будет накоплена за‘, k,’лет’);
readln;
end.
Для завершения циклов типа repeat и while необходимо чтобы внутри тела
цикла изменялись параметры, влияющие на значение условия.

4. Вложенные циклы
Возможны случаи, когда внутри тела цикла необходимо повторять некоторую
последовательность операторов, т. е. организовать внутренний цикл. Такая
структура получила название цикла в цикле или вложенных циклов. Глубина
вложения циклов (то есть количество вложенных друг в друга циклов) может быть
различной.
1 1 1
S=1+ + +⋯
Пример: Вычислить сумму 1! 2 ! n! .
begin
var n:= ReadInteger(‘Введите n’);

6
var s:= 1;
for var i:= 1 to n do
begin
var k:= i;
for var j:= 1 to k do k:= k*j;
s += 1/k;
end;
writeln(‘s = ’, s:7:4);
end.

5. Процедуры управления циклами.


Пусть требуется досрочно прервать текущую итерацию и перейти к
выполнению следующей. Для этой цели применяется оператор продолжения
continue.
Если нужно досрочно прервать оператор цикла применяется оператор break.
Оператор break завершает выполнение только самого внутреннего из вложенных
циклов.
Пример. Просуммировать первые члены гармонического ряда,
1 1 1
S=1+ + +…+ +…
2 3 n
пока значение S не станет больше некоторого заданного значения a.
begin
var a:= ReadReal;
var s:= 1.0; var i:= 1; var b: real;
while s < a do
begin
inc (i); b:= 1/i;
if b = 0.0 then break;
s += b;
end;
writeln ('i = ', i:5, ' s = ', s:10:6);
end.

Примеры
7
При помощи оператора с постусловием вычислить сумму сходящегося ряда с
заданной точностью ε .
Пример 1: Вычислить сумму сходящегося ряда с заданной точностью 

cosk
∑ k 2+3
S= k =1

Т.к. ряд сходится, будем считать, что для вычисления ряда с точностью ε ,
нужно суммировать слагаемые, до тех пор, пока очередное слагаемое не станет
¿ε (свойство Лейбница).
Поскольку число слагаемых неизвестно лучше воспользоваться
итерационным циклом.
begin
var eps:= ReadlnReal(‘введите точность eps’);
var s:= 0.0; var k:= 0; var a: real;
repeat
k += 1;
a:= cos(k)/(sqr(k) + 3);
s += a
until abs(a) <= eps;
writeln(‘S=’,S:10:4):
end.

Пример 2: Составить таблицу значений функции


x
y= e + 7 на отрезке [a, b] с шагом h.

i ¿¿
Необходимо вычислить и вывести на экран значения x ¿ и соответствующие

им значения y ¿ .
¿i ¿
Первое значение x равно a, все последующие вычисления с добавлением
шага h к предыдущему значению x, т.е. x:= x + h

program tab;
begin
var (a, b, h):= ReadReal3 (‘Введите границы a, b и шаг h’);
var x:= a;
repeat
8
var y:= exp(x) + 7;
writeln(‘x = ’, x:10:2,’ y = ’, y:10:2);
x:= x + h
until x > b;
end.