
6. Циклы в языке Паскаль
6.1. Циклические вычисления. Виды циклов в языке Паскаль
При решении многих задач, особенно требующих перебора значений в массивах, требуется многократно выполнять одинаковые действия с изменяющимися по некоторому закону данными. Такой вид вычислений называют циклическим, а наборы операторов, используемые для организации таких многократно повторяющихся расчетов, называют циклами. Тело цикла - последовательность операторов, повторяемых в процессе выполнения оператора цикла. Совокупность вычислений, проводимых за один проход тела цикла, называют итерацией. В структурном программировании цикл является одной из трех базовых алгоритмических структур.
В зависимости от того, каким образом, организованы повторяющиеся (циклические) вычисления, различают несколько видов и разновидностей циклов. Арифметическим называют вид циклов, в которых количество необходимых повторений расчетов заранее определено путем задания начального и конечного значений специальной целочисленной величины, которую называют управляющей переменной или параметром цикла и которая может автоматически изменяться на (+1) или (-1), пробегая заданный диапазон значений. Арифметические циклы имеют 2 разновидности - с возрастанием параметра (параметр цикла возрастает на 1 на каждой итерации) и с убыванием параметра (параметр цикла убывает на 1).
Итерационным называют вид циклов, в которых количество повторений расчетов заранее не известно и зависит от выполнения некоторого условия. Если проверка этого условия производится перед выполнением тела цикла, то такой итерационный цикл называют циклом с предусловием (цикл "пока"), а если проверка производится после выполнения тела цикла, то его называют циклом с постусловием (цикл "до"). Очевидно, тело цикла с постусловием всегда выполняется хотя бы один раз, а тело цикла с предусловием может ни разу не выполняться. Итерационные циклы принципиально отличаются от арифметического тем, что в них заранее неизвестно число повторений. В зависимости от решаемой задачи необходимо использовать тот или иной вид итерационных циклов.
Схема с основными видами и разновидностями циклов, используемых в Паскале, дана на рис.6.1.
Рис.6.1. Классификация циклов, используемых в Паскале
Вопросы для проверки знаний.
1. Какие виды вычислений называют циклическими ?
2. Какие группы операторов называют циклами ?
3. Что называют “телом цикла”, “итерацией” ?
4. Какие существуют два вида циклов в Паскале ?
5. Назовите разновидности арифметических циклов в Паскале.
6. Что называют управляющей переменной или параметром цикла ?
7. Назовите разновидности итерационных циклов в Паскале.
6.2. Арифметические циклы
В данных циклах для задания итераций используется управляющая переменная (параметр цикла), которая может автоматически изменяться на (+1) или (-1) и по которой проверяется условие выполнения цикла.
В разновидности арифметического цикла с возрастанием параметра синтаксис имеет вид:
for переменная := значение 1 to значение 2 do оператор
При убывании параметра синтаксис арифметического цикла следующий:
for переменная := значение 1 downto значение 2 do оператор
Переменная - параметр цикла (переменная), начальное и конечное значения (значение 1, значение 2) должны иметь порядковый тип. Со словом to, значение переменной цикла увеличивается на 1 при каждой итерации цикла. Со словом downto, значение переменной цикла уменьшается на 1 при каждой итерации цикла. Изменять значение управляющей переменной внутри цикла не рекомендуется. В синтаксисе арифметического цикла заложена проверка логического условия окончания цикла. Блок-схема арифметического цикла с возрастанием управляющей переменной (со словом to) приведена на рис.6.2. Логика цикла с убыванием управляющей переменной (со словом downto) отличается тем, что переменная на каждом шаге изменяется на (-1) и в проверка завершения цикла неравенство направлено в обратную сторону.
Рис.6.2. Блок-схема арифметического цикла с возрастанием управляющей переменной
Оператор for вызывает оператор, находящийся после слова do, по одному разу для каждого значения в диапазоне от значения 1 до значения 2. Если при возрастании переменной значение 1 больше значения 2, то цикл выполняться не будет. Аналогичная ситуация при убывании переменной, когда значение 1 меньше значения 2. Если после do требуется выполнить группу операторов, их обязательно нужно поместить в составной оператор.
В Паскале считается, что при нормальном завершении выполнения оператора арифметического цикла значение параметра цикла не определено.
Примеры 1 применения арифметического цикла:
1) for i:=5 to 9 do WriteLn(2*i+3);{Расчет и вывод значений формулы (2i+3) при целых 5i9}
2) for ch:='A' to 'Z' do Writeln(ch);{Вывод всех букв латинского алфавита "в столбик"}
3) S:=0;for i:=1 to n do S:=S+1/i;{Расчет суммы первых n членов гармонического ряда}
4) for i:=10 downto -10 do WriteLn(2*i); {Вывод на экран всех целых четных чисел, убывающих от 2*10=20 до -2*10=-20}
5) for i:=0 to 10 do begin{Применение составного оператора в теле цикла}
y:=i*i+i+1;
WriteLn('f(',i,')=',y);
end;
Рассмотрим также пример типовой задачи, которая решается с помощью оператора арифметического цикла.
Пример 2. С использованием арифметического цикла написать программу, которая определяет для функции f(x)= x 3- 3x2 – x + 3 на отрезке [-2;3] экстремумы: точку минимума (imin, min = f(imin)) и максимума (imax, max = f(imax)) с целочисленными значениями imin и imax аргумента х.
Решение. Логика решения является типичной для задач данного вида: вначале в качестве текущих экстремальных точек (и минимума и максимума) принимаем начальную точку графика функции с целочисленным значением аргумента x=-2, а затем, проходя по всем остальным целочисленным значениям аргумента x от (-1) до 3, сравниваем значения f(x) функции в них с текущими (найденными ранее) значениями минимума и максимума и при необходимости корректируем координаты текущего минимума и максимума.
Для иллюстрации поведения графика функции в исследуемых точках в программе дополнительно организован вывод:
1) начальных значений координат точек минимума и максимума,
2)координат текущих точек графика и новых координат точек минимума и максимума в случае их коррекции.
Ниже приведена программа с подробными комментариями.
program EXTREMUM;
uses Crt; {подключение библиотеки CRT для работы с экраном}
var min,max,f:real; {описание вещественных переменных программы}
imin,imax,x:integer; {описание целочисленных переменных программы}
begin {начало раздела операторов}
ClrScr; { очистка экрана }
x:=-2; {задание начального значения аргумента }
f:=x*x*x-3*x*x-x+3; {вычисление функции при начальном значении аргумента }
imin:=-2; min:=f; { начальное задание текущего положения точки минимума}
WriteLn('first: imin=',imin,' min=',min);{вывод начальной точки минимума}
imax:=-2; max:=f; { начальное задание текущего положения точки максимума}
WriteLn('first: imax=',imax,' max=',max);{вывод начальной точки максимума}
For x:=-1 to 3 do {арифметический цикл по аргументу от -1 до 3}
Begin {начало тела арифметического цикла}
f:=x*x*x-3*x*x-x+3; {вычисление функции при текущем значении аргумента }
WriteLn('argument=',x,' function=',f); {вывод координат текущей точки графика}
if(f<min)then {сравнение текущей точки графика с минимумом и коррекция последнего }
begin
min:=f; imin:=x; {коррекция координат текущей точки минимума}
WriteLn(' correct:imin=',imin,' min=',min){вывод новой точки минимума}
end;
if(f>max)then {сравнение текущей точки графика с максимумом и коррекция последнего }
begin
max:=f; imax:=x; {коррекция координат текущей точки максимума}
WriteLn(' correct:imax=',imax,' max=',max){вывод новой точки максимума}
end;
end; {конец тела арифметического цикла}
WriteLn('rezult: imin=',imin,' min=',min); {вывод итоговой точки минимума}
WriteLn('rezult: imax=',imax,' max=',max); {вывод итоговой точки максимума}
ReadKey; {ожидание нажатия клавиши для перехода от пользовательского экрана в основной}
end. {конец раздела операторов и всей программы}
Усложненным вариантом арифметического является такой цикл, в котором параметр цикла изменяется не на +1 или -1, а на произвольную величину, которую называют шагом приращения. В Паскале такой цикл можно организовать из обычного арифметического или использовать итерационные циклы.
Вопросы для проверки знаний.
1. Чем различается синтаксис арифметических циклов с возрастанием и убыванием параметра ?
2. В каком случае ни разу не выполняется арифметический цикл а) с возрастанием и б) с убыванием параметра ?
3. Может ли арифметический цикл в Паскале иметь произвольную величину шага ?
Практическое задание.
1. Написать оператор арифметического цикла для вычисления и суммирования значений функции sin при всех значениях ее аргумента от 0 до 1 с шагом приращения, равным 0,05.