Операторы цикла
Циклический процесс, или просто цикл, – это повторение одних и тех же действий. Последовательность действий, которые повторяются в цикле, называют телом цикла. Один проход цикла называют шагом, или итерацией. Переменные, которые изменяются внутри цикла и влияют на его окончание, называются параметрами цикла.
При написании циклических алгоритмов следует помнить следующее. Во-первых, чтобы цикл имел шанс когда-нибудь закончиться, содержимое его тела должно обязательно влиять на условие цикла. Во-вторых, условие должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла. В языке Pascal для удобства программиста предусмотрены три оператора, реализующих циклический процесс: while, repeat…until и for.
Оператор цикла с предусловием while.. do На рис. изображена блок-схема алгоритма цикла с предусловием. Оператор, реализующий этот алгоритм в языке Pascal, имеет вид: while выражение do оператор; здесь while... do – зарезервированные слова языка Pascal, выражение – логическая константа, переменная или логическое выражение, оператор – любой допустимый оператор языка.
Работает оператор while следующим образом Вычисляется значение выражения. Если оно истинно (True), выполняется оператор. В противном случае цикл заканчивается, и управление передается оператору, следующему за телом цикла. Выражение вычисляется перед каждой итерацией цикла. Если при первой проверке выражение ложно (False ), цикл не выполнится ни разу.
Если в цикле надо выполнить более одного оператора, необходимо использовать составной оператор: while условие do begin оператор_1; оператор_2; … оператор_n; end;
Задача. Пусть необходимо вывести на экран значения функции на отрезке [0; ] с шагом 0.1. var x,y:real; 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.
Задания для самостоятельного решения Задание 1. Вычислить сумму натурального ряда чисел от 1 до N. Задание 2. Вычислить значения функции y=2lnx – 3x на отрезке [a,b] с шагом h (a, h>0). Задание 3. Найти значение минимального положительного члена числовой последовательности, заданной рекуррентными соотношениями: X n =X n -1 + X n-2 +X n , X 1 =X 2 =X 3 =-99. Задание 4. Используя алгоритм Евклида, найти НОД (наибольший общий делитель) двух чисел. Алгоритм Евклида: 1. пока переменные неравны, заменить большее значение на разность большего и меньшего; 2. выбрать любое значение в качестве результата.
Оператор цикла с постусловием repeat … until Если в цикле с предусловием проверка условия осуществляется до тела цикла, то в цикле с постусловием условие проверяется после тела цикла. Сначала выполняются операторы, являющиеся телом цикла, после чего проверяется условие, если последнее ложно, то цикл повторяется. Выполнение цикла прекратится, если условие станет истинным.
В языке Pascal цикл с постусловием реализован конструкцией: repeat оператор; until выражение; здесь repeat.. until – зарезервированные слова языка Pascal, выражение – логическая константа, переменная или логическое выражение, оператор – любой допустимый оператор языка.
Если тело цикла состоит более чем из одного оператора, то цикл с постусловием имеет вид: repeat оператор_1; оператор_2; оператор_N; until выражение; Алгоритм цикла с постусловием
Цикл с постусловием всегда будет выполнен хотя бы один раз в отличие от цикла с предусловием, который может не выполниться ни разу. Если применить цикл с постусловием для создания подпрограммы, которая выводит значения функции на отрезке [0; ] с шагом 0.1, получим:
var x,y:real; begin {Присваивание параметру цикла стартового значения.} x:=0; {Цикл с постусловием.} repeat {Начало цикла} y:=exp(sin(x))*cos(x); writeln('x=',x,' y=',y); x:=x+0.1; {Изменение параметра цикла.} until x>pi; {Закончить работу цикла, когда параметр превысит конечное значение.} end.
Задания для самостоятельного решения 1. Вычислите значение функции для х принадлежащего отрезку [-4; 4] с шагом 0,5. 2. Вычислите сумму ряда для n введенного с клавиатуры. 3. Напишите программу, которая проверяет, является ли целое число, введенное пользователем, простым.
Оператор цикла for … do Операторы цикла с условием обладают значительной гибкостью, но не слишком удобны для организации «строгих» циклов, которые должны быть выполнены заданное число раз. Оператор цикла for … do используется именно в таких случаях: for i:= in to ik do оператор; for i:= ik downto in do оператор; где оператор – любой оператор языка, i, in и ik - переменные целочисленного или перечислимого типов. Переменную i называют параметром цикла. Переменные in и ik диапазон изменения параметра цикла: in начальное значение, а ik конечное значение параметра цикла.
Шаг изменения цикла for всегда постоянен и равен интервалу между двумя ближайшими значениями типа параметра цикла (при целочисленном значении параметра цикла шаг равен 1). В случае если тело цикла состоит более чем из одного оператора, необходимо использовать составной оператор: for i:= in to ik do begin оператор_1; оператор_2; оператор_n; end;
Алгоритм работы цикла for...do Фрагмент подпрограммы, приведенный далее, демонстрирует применение цикла for: var i:integer; c:char; begin {Вывод на экран чисел от 1 до 10} for i:=1 to 10 do writeln(i); {Вывод на экран чисел от 10 до -10} for i:=10 downto -10 do writeln(i); {Вывод на экран символов от a до r} for c:='a' to 'r' do writeln(c); end;
Вернемся к задаче вывода значений функции на отрезке [0; ] с шагом 0.1. Как видим, здесь количество повторений цикла явно не задано. Однако это значение, можно легко вычислить. Предположим, что параметр цикла х принимает значения в диапазоне от xn до xk, изменяясь с шагом dj, тогда количество повторений тела цикла можно определить по формуле: округлив результат деления до целого числа. Следовательно, фрагмент программы вывода значений функции будет иметь вид:
var i,n:integer; x,y:real; begin {Количество повторений цикла:} {n=(xk-xn)/dx+1; xk=pi, xn=0, dx=0.1} n:=round((pi-0)/0.1)+1; x:=0; {Начальное значение аргумента.} {Цикл с известным числом повторений,} {i – параметр цикла,изменяется от 1 до n с шагом 1.} for i:=1 to n do begin {Начало цикла.} {Вычисление значения функции } y:=exp(sin(x))*cos(x); {для соответствующего значения аргумента.} writeln('x=',x,' y=',y); x:=x+0.1; {Вычисление нового значения аргумента.} end; {Конец цикла.} end.