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

Цель работы – научиться программировать циклические процессы с заранее известным числом повторений.

Теоретическая часть

Циклические операторы используются для многократного повторения некоторого фрагмента программы, который называется телом цикла. Количество повторений может быть заранее заданным (счетный цикл) или определяться выполнением некоторого условия (циклы с проверкой условия). Существуют три вида операторов цикла: оператор цикла с параметром, оператор с предварительным условием, оператор цикла с последующим условием. В данной работе рассмотрим оператор цикла с параметром.

Цель работы – умение программировать алгоритмы, связанные с вычислением конечных сумм и произведений, используя оператор цикла с параметром.

Для программирования вычислительных процессов с известным числом повторений обычно используется оператор цикла с параметром. Он имеет следующий вид

for k:= A1 to A2 do S;

где for, to, do – служебные слова(для, до, выполнить), k – параметр цикла (управляющая переменная любого порядкового типа), A1 – начальное значение (переменная того же типа), A2 – конечное значение (переменная того же типа), S – произвольный оператор Турбо Паскаля(или последовательность операторов, заключенная в операторные скобки begin…end).Оператор S называется также телом цикла.

Рассмотрим выполнение оператора цикла с параметром. Значения выражений A1и A2, задающих диапазон изменения k, вычисляются один раз при входе в цикл. Переменная k принимает значения от A1 до A2 с шагом 1, причем A1 должно быть меньше или равно A2, в противном случае цикл не выполняется ни разу. Последовательность операторов тела цикла выполняется один раз для каждого значения переменной k. Отметим, что значение управляющей переменной не должно изменяться в теле цикла. После нормального завершения оператора цикла с параметром (т.е. когда значение k превысило A2) управляющая переменная остается неопределенной.

Оператор цикла с параметром может иметь и другую форму

for k:= A1 downto A2 S;

В этом случае параметр цикла k принимает значения от A1 до A2 с шагом -1, причем A1 должно быть больше или равно A2.

Рассмотрим несколько примеров применения оператора цикла с параметром для вычисления конечных сумм и произведений.

Пример 1. Рассмотрим вычисление суммы

Общее слагаемое суммы (k=1,2,…N) выражается формулой .Однако использовать эту формулу для расчетов нерационально. Действительно, например, для определения требуется вычислить . Между тем при нахождении было вычислено значение , которое достаточно умножить на sin2x, чтобы получить нужную нам степень, а не вычислять ее заново. Для рационального вычисления общего члена конечной суммы, выведем рекуррентное соотношение, связывающее текущее слагаемое суммы с предыдущим. Рассмотрим отношение двух последующих слагаемых и

.

Запишем рекуррентные соотношения

, (k=2,3,…N).

Для начала счета по этим формулам нужно задать значения

, .

Число слагаемых в сумме зададим как константу N, а значение параметра x введем с клавиатуры. Программа будет иметь вид

program SUM1;

const N=20;

var x,S,a:real;

k: integer;

begin

writeln(‘введите x’);

readln(x);

a:=x/sqr(sin(2*x)); S:=a; {задание начальных значений}

for k:=2 to N do

begin

a:=a*x/sin(2*x);

S:= S+a

end;

writeln (‘S=’, S);

end.

Обратим внимание на то, что нет необходимости запоминать в программе промежуточные величины , ,…, , ,… и, следовательно, вводить для них отдельные имена, связанные с соответствующими индексами. Действительно, перед выполнением оператора цикла переменные a и S получают начальное значение , соответствующее k=1. На первом шаге цикла (k=2) вычисляется значение и результат снова присваивается переменной a, «забивая» ее уже не нужное первоначальное значение. Далее к переменной S, имеющей значение , прибавляется только что вычисленное значение переменной a (т.е. ) и результат снова присваивается переменной S, которая будет теперь содержать сумму + и т. д.

Отметим часто встречающиеся ошибки. Начальное значение переменной для суммы, которая вычисляется в цикле, часто бывает либо не присвоено перед входом в цикл, либо задано неправильно, особенно если цикл начинается не с первого члена последовательности. То же касается и задания начального значения для общего члена суммы перед циклом, если это необходимо. Часто ошибки связаны с непониманием того. какой смысл имеет использование составного оператора begin…end при необходимости повторения действия не одного, а группы операторов. При отсутствии этих операторных скобок в цикле повторяется только один оператор, непосредственно стоящий за служебным словом do.

Отладка программы является необходимым этапом ее реализации, особенно, когда устранены все ошибки, обнаруживаемые машиной, и возникает впечатление, что работа над программой на этом закончена.Чтобы убедиться в том, что составленная программа считает правильно, необходимо выполнить проверку. С этой целью, например, можно использовать операторы вывода промежуточных результатов. Для получения значений переменных a и S при k=1,2,3 внутри цикла после оператора S:= S+a поставим оператор вывода значений S и a при условии, что k <=3:

If k <=3 then writeln (' k =', k, 'a =', a, ' S =',S);

Вычислим теперь эти значения на калькуляторе. Если результаты, сосчитанные вручную, совпадают в пределах ошибок округления с результатами, выдаваемыми программой, то можно предполагать, что при большем количестве слагаемых программа считает верно.

Пример 2. Рассмотрим еще один пример вычисления конечной суммы

Общее слагаемое суммы выражается формулой В этом примере рекуррентное соотношение между двумя последующими слагаемыми суммы

не упрощает вычислений, а даже усложняет их, поэтому очередной член суммы будем вычислять по формуле для общего слагаемого. Программа имеет следующий вид

program SUM2

var x, S: real;

k, N: integer;

begin

writeln ( ' введите x, N' );

readln (x, N);

S:=0; { задание начального значения суммы }

for k:=1to N do

S:= S + ln(x * k) /sqr(k);

writeln ( 'S=', S)

end.

Пример 3.

Вычислить произведение N! =1 * 2 * 3*…*N (N – факториал). Обозначим произведение первых k сомножителей через Pk Справедливо рекуррентное соотношение (k = 2, 2,…,N), которое и будем использовать для вычислений, задав начальное значение P1=1. Программа, вычисляющая значение N!, имеет вид

program Nfact;

var P, N, k: integer;

begin

readln (N);

P:= 1;

for k:= 2 to N do

P:= P * k;

writeln (N, '! = ',P)

end.

Величина произведения накапливается в переменной P. Как и при вычислении суммы, после умножения на очередной сомножитель новое значение произведения помещается на место старого, которое уже не нужно. В качестве начального значения для произведения берется первый сомножитель или 1. При вычислении суммы это было первое слагаемое или 0.

Отчет по работе должен содержать задание, текст программы, результаты тестирования работы программы и результаты расчетов для заданных N.

Контрольные вопросы.

1.Что такое оператор цикла с параметром?

2.Как работает оператор цикла for?

3.Может ли параметр цикла for изменяться с произвольным шагом?

4.В каком случае тело оператора цикла for не будет выполнено ни разу?

5.Какие две формы оператора for вам известны?

Задания

Сосчитать суммы или произведения для указанных значений .

1.

2.

3. ;

4. ;

5. ;

6. ;

7. ;

8. ;

9. ;

10. ;

11. ;

12. ;

13. ;

14. ;

15. ;

Лабораторная работа №4.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: