- •Глава 7. Программирование циклических вычислительных процессов
- •7.1. Оператор цикла с предусловием while
- •7.2. Оператор цикла с постусловием repeat
- •2) Вычисляется логическое выражение l, результат вычисления анализируется;
- •X, y, dx, a, b : real;
- •7.3. Оператор цикла с параметром for
- •7.4. Одномерные массивы и их описание
- •7.4.1. Обращение к элементу массива
- •7.4.2. Ввод и вывод одномерных массивов
- •7.4.3. Организация циклов с использованием массивов
- •Пример 7.13
- •7.5. Вопросы для самоконтроля
X, y, dx, a, b : real;
begin
write ('введите a, b, dx - ');
readln (a, b, dx);
x := a; {присваивание параметру цикла x
его начального значения}
repeat
{вычисления, предусмотренные телом цикла}
y := sin(x * x);
writeln ('x=', x:10:3,' y=', y:10:3);
x := x + dx
until x > b {проверка условия выхода из цикла}
end.
Применяя операторы while и repeat, необходимо позаботиться о том, чтобы значения переменных, входящих в условие окончания цикла, менялись в теле цикла, иначе циклический процесс будет продолжаться бесконечно («зацикливание» программы).
Подчеркнем отличия между операторами repeat и while.
1. В операторе repeat проверка условия выхода из цикла производится в конце, а не в начале цикла, поэтому тело цикла выполняется хотя бы один раз.
2. В операторе repeat условие выхода из цикла удовлетворяется, если логическое выражение L истинно, а в операторе while - если ложно.
3. Тело цикла, организованного с помощью оператора while, может содержать только один оператор (в том числе и составной), в то время как между словами repeat и until их можно разместить несколько.
В приведенных примерах количество повторений тела цикла можно оценить до его выполнения цикла и воспользоваться оператором for. Однако, во многих задачах количество этих повторений заранее не известно и вычислено быть не может. Операторы repeat и while позволяют организовывать такие циклы. В следующих двух примерах рассмотрим нахождение суммы бесконечного ряда с заданной точностью.
Пример 7.3
Найти сумму членов бесконечного ряда с точностью до члена ряда, меньшего :
При нахождении суммы такого ряда не следует вычислять отдельно каждый элемент. Достаточно установить зависимость, по которой из предыдущего элемента ряда образуется следующий. Обозначим через an n-й член ряда, тогда an+1 = an x / (n + 1), a0 = 1. Такой подход позволяет сократить количество вычислительных операций и уменьшить время счета. Сумму будем накапливать в переменной S, которую предварительно необходимо обнулить. Условие окончания цикла an .
Ниже приведены два варианта программы. В первом варианте использован оператор while, во втором - repeat. Схема алгоритма соответствует второму варианту.
Схема алгоритма
Program example73;
var
x, s, e, a : real;
begin
write ('введите х и epsilon - ');
readln (x, e);
s:=0; n:=0;
a:=1; {задание параметру цикла
его начального значения}
while a > e do { проверка условия выхода из
цикла}
begin
s := s + a; n := n + 1; a := a * x / n
end;
writeln ('сумма ряда = ', s:10:3)
end.
Program example73a;
var
x, s, e, a : real;
begin
write ('введите х и epsilon - ');
readln (x, e);
s := 0; n := 0;
a := 1; { задание параметру цикла
его начального значения}
repeat
s := s + a; n := n + 1; a := a * x / n
until a < e; { проверка условия выхода из цикла}
writeln ('сумма ряда = ', s:10:3)
end.
В общем случае параметр цикла в процессе счёта задачи может выполнять следующие функции:
1) служить счётчиком числа выполненных повторений тела цикла;
2) в обращении к элементу массива играть роль индекса этого элемента (см. раздел 7.4);
3) участвовать в вычислениях, предусмотренных телом цикла, в качестве неиндексированной переменной; именно эту функцию выполняет параметр цикла в четырех предыдущих программах.