Программирование циклических вычислительных процессов
Теоретическая часть
Вычислительный процесс называется циклическим, если он состоит из многократного выполнения одних и тех же действий при различных значениях промежуточных данных. Такие повторяющиеся действия называются циклами и реализуются в программах с использованием операторов цикла.
В языке Turbo Pascal существуют три оператора цикла: for, whileи repeat.
Оператор for используется, если некоторую последовательность действий надо выполнить несколько раз, причем число повторений заранее известно. Например, вычислить значения функции в нескольких различных, отстоящих на равное расстояние друг от друга точках (то есть построить таблицу значений функции).
В общем виде операторforзаписывается так:
forпараметр_цикла:=нач_значение toкон_значение do
Begin
{последовательность операторов тела цикла}
end;
где
· параметр_цикла — имя переменной-счетчика числа повторений операторов цикла;
· нач_значение — выражение, определяющее начальное значение параметра цикла;
· кон_значение — выражение, определяющее конечное значение параметра цикла.
Если между begin и end находится только одна оператор, то слова begin и end можно не писать. Обычно в качестве выражений, определяющих начальное и конечное значения параметра цикла, используются переменные или константы. В этом случае последовательность операторов тела цикла будет выполнена (кон_значение - нач_значение + 1) раз. В теле цикла допускается использовать значение параметра цикла.
П р и м е р 1. Вычислить сумму первых n элементов ряда 1+1/2+1/3+…+1/i…+1/n.
Блок-схема алгоритма решения представлена на рис. 1.
Рис. 1
Текст программы:
programsumma;
Var
i, n:integer; {номер элемента ряда и число элементов}
elem:real; {значение элемента ряда}
sum:real; {сумма элементов ряда}
Begin
writeln(‘Введите число элементов ряда’);
readln(n);
sum:=0;
fori:=l to n do
Begin
elem:=l/i;
sum: =sum+elem; {подсчет суммы элементов}
writeln(i:2, ' ',elem: 4:2); {вывод значения текущего элемента ряда}
end;
writeln('Сумма элементов ряда: ',sum: 4:2);
end.
Если в операторе for вместо слова to записать downto, то после очередного цикла значение переменной цикла будет не увеличиваться, а уменьшаться. Например, оператор
forj:=10 downto0do
writeln(j);
выводит на экран числа от 10 до 0.
Оператор while используется в том случае, если некоторую последовательность действий (операторов программы) надо выполнить несколько раз, причем необходимое число повторений во время разработки программы неизвестно и может быть определено только во время ее работы, т. е. определяется ходом вычисления.
Типичными примерами использования цикла while являются вычисления с заданной точностью, поиск в массиве или в файле.
В общем виде оператор while записывается так:
while <условие> do
Begin
{последовательность операторов тела цикла}
end;
где <условие> — выражение логического типа, определяющее условие выполнения тела цикла — операторов, находящихся между begin и end.
Если между begin и end находится только один оператор, то begin и end можно не писать.
Оператор while выполняется следующим образом: сначала проверяется условие (вычисляется значение выражения <условие>). Если условие не выполняется (значение выражения <условие> равно false), то операторы цикла, расположенные между begin и end, не выполняются, и на этом выполнение операторы while завершается. Если условие выполняется (значение выражения <условие> равно true), то выполняются следующие за do, расположенные между begin и end, операторы тела цикла, и после этого снова проверяется выполнение условия. Если условие выполняется, то операторы цикла выполняются еще раз. И так до тех пор, пока условие не станет ложным.
Важные особенности оператора цикла while:
1. Для того чтобы тело цикла было выполнено хотя бы один раз, необходимо, чтобы перед выполнением оператора while условие выполнения цикла было истинно;
2. Для того чтобы цикл завершился, необходимо, чтобы последовательность операторов между begin и end изменяла значения переменных, входящих в выражение <условие>.
П р и м е р 2. Составить программу решения задачи примера 1 с использованием оператора while.
Блок-схема алгоритма решения будет иметь вид, аналогичный рис. 1.
Текст программы:
programsumma;
Var
i, n:integer; {номер элемента ряда и число элементов}
elem:real; {значение элемента ряда}
sum:real; {сумма элементов ряда}
Begin
writeln(‘Введите число элементов ряда n’);
readln(n);
sum:=0; i:=1; {начальное значение суммы и параметра цикла}
whilei<=n do
Begin
elem:=l/i;
sum: =sum+elem; {подсчет суммы элементов}
writeln(i:2, ' ',elem: 4:2); {вывод значения текущего элемента ряда}
i:=i+1 {увеличение параметра цикла}
end;
writeln('Сумма элементов ряда: ',sum: 4:2);
end.
Оператор repeat, как и оператор while, используется в программе, если надо провести некоторые повторяющиеся вычисления (цикл), но число повторений во время разработки программы неизвестно и может быть определено только во время работы программы, т. е. определяется ходом вычисления.
В общем виде оператор repeat записывается так:
Repeat
{операторы тела цикла}
until <условие>;
где <условие> — выражение логического типа, определяющее условие завершения цикла.
Оператор repeat выполняется следующим образом: сначала выполняются операторы тела цикла, следующие за словом repeat. Затем проверяется условие (вычисляется значение выражения <условие>). Если условие ложно (значение выражения условие равно false), то операторы цикла (операторы, находящиеся между repeat и until) выполняются еще раз. Если условие истинно (значение выражения <условие> равно true), то выполнение цикла прекращается.
Таким образом, операторы, находящиеся между repeat и until, выполняются до тех пор, пока условие ложно (значение выражения <условие> равно false).
Важные особенности оператора цикла repeat:
1. Находящиеся между repeat и until, всегда будут выполнены хотя бы один раз;
2. Для того чтобы цикл завершился, необходимо, чтобы операторы цикла, находящиеся между repeat и until, изменяли значения переменных, входящих в выражение <условие>.
П р и м е р 3. Составить программу вычисления суммы целых положительных чисел, введенных с клавиатуры.