Электронная версия курса лекций по дисциплине "Информатика", страница 14

5.1  Схема алгоритма решения задачи

c

Программа для решения задачи

program forp;

var

a,b,y:real;

x,xn,xk:integer;

begin

write('введите значения переменных a,b,xn,xk: ');

readln(a,b,xn,xk);

writeln('Исходныеданные: a=',a:4:2,' b=',b:4:2,' xn=',xn,' xk=',xk);

writeln('Результат табулирования функции y=ax+b: ');

for x:=xn to xk do

begin

y:=a*x+b;

writeln(' x=',x,' y=':20,y:4:2);

end;

                 readln

end.


Лекция 6

Разработка и программирование итерационных  алгоритмов

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

Задача 1 на использование итерационных  алгоритмов

1  Условие задачи

Даны действительные числа a, b и натуральное число n.            

Вычислить

2  Анализ особенностей задачи

В этой задаче удобно считать последнее слагаемое n-ым. С учетом этого, получим заданное выражение в виде:

 


Будем использовать следующие обозначения: Slо, Sl1, …, Sln – соответственно слагаемые  нулевое, первое, …, n-oe; So, S1, …, Sn – сумма нулевая, первая,  …, n-ая.

Для выполнения циклических действий введем переменную i, которая представляет собой одновременно порядковый номер текущих слагаемого и частичной суммы. Для удобства записи данного выражения с включением в него (i-1) и i-го слагаемых, пусть n достаточно велико, по крайней мере, не меньше пяти, тогда выражение можно записать в виде:

 


S2

 

Si

 
 


Sln

 
 


Из приведенного выражения видно следующее.

Переменная i меняется от нуля до n, с шагом  1.

Для нахождения значения заданного выражения можно использовать циклический алгоритм, в теле цикла которого очередная (текущая) сумма находится в результате сложения предыдущей суммы и текущего слагаемого.

В свою очередь текущее слагаемое находится как произведение предыдущего (i-1)-го слагаемого на сомножитель (b+i)/(a+i).

Решение задачи имеет итерационный характер. Итеративно изменяемыми элементами являются текущие сумма и слагаемое.

При n=1 выражение (полная сумма) вычисляется следующим образом: S1=S0+Sl1,  где S0=b/a; Sl1=Sl0·(b+1)/(a+1).

3  Метод решения задачи

С учетом проведенного анализа особенностей задачи, будем использовать для ее решения итерационный алгоритм. Составим два варианта эквивалентных формул, позволяющих найти искомый результат. При первом будем использовать индексированные переменные (массивы). При втором – простые переменные и оператор присваивания. Получим формулы:

Sli=Sli-1·(b+i)/(a+i);                              Sl:=Sl·(b+i)/(a+i);

Si=Si-1+Sli;                                                                   S:=S+Sl.

В этом пункте необходимо уточнить пределы изменения i в указанных формулах. Формулы позволяют находить значения текущих слагаемого и суммы по значениям полученным на предыдущем шаге. Но какие-то значения нужно задать в явном виде либо Sl0 и S0, либо Sl1 и S1. В первом случае i=0,…,n, с шагом 1. Это позволяет найти решение при n³0, т.е. и при n=0. А во втором i=1, …,n,  т.е. решение можно найти только для натурального n. Далее рассмотрим второй случай. Тогда в приведенных выше формулах i=2,…,n.

Теперь Sl1=b·(b+1)/[a(a+1)],   при i=1,   Sl=b·(b+1)/[a(a+1)]

              S1=a/b+Sl1.                                     S=a/b+Sl.

4  Проверка разработанного метода решения

Она заключается в нахождении и анализе результатов полученных при n=1,2,3 с использованием приведенных в п. 1.3 формул. Здесь и ниже при проверке алгоритма, результаты могут фиксироваться, как в численном виде, так и в общем.

5 Блок-схема алгоритма решения задачи с использованием индексированных переменных

 


6  Блок-схема алгоритма решения задачи без использования  индексированных переменных

 


7  Протокол испытания алгоритма

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

8  Программа для решения задачи без использования индексированных переменных

program Iter;

var a,b,s,sl:real; i,n:integer;

begin

write('введитезначенияпеременных a,b,n: '); readln(a,b,n); writeln('Исходныеданные: a=',a:4:2,' b=',b:4:2,' n=',n); sl:=b*(b+1)/(a*(a+1));

s:=b/a+sl;

for i:=2 to n do

                      begin

                              sl:=sl*(b+i)/(a+i);

                              s:=s+sl

end;

writeln('Результат: выражение равно ',s:4:2);

readln

end.

Задача 2 на использование итерационных алгоритмов

1  Условие задачи

Найти


     

2  Анализ особенностей решения задачи

Из формулы видно, что требуется найти сумму слагаемых. Их порядковые номера принимают значения от 1 до 100 с шагом 1,  т.е. требуется найти сумму ста слагаемых. Для упрощения анализа правильности работы алгоритма и расширения сферы  применения  программы (нахождения суммы произвольного количества слагаемых) целесообразно максимальный порядковый номер слагаемого 100  заменить на n .

Текущее (i-е) слагаемое находится по формуле: Sli=i2.  Каждое слагаемое, в отличие от предыдущей задачи, не является  итеративно изменяемым элементом, т. к. значение текущего слагаемого не зависит от значения предшествующего слагаемого.

Можно записать, что у=Sn, где Sn  - n-я сумма. Пусть n=3. Тогда имеет место следующее равенство:  у=Sl1 + Sl2 + Sl3. Текущая сумма Si является итеративно изменяемым элементом, например, S3=S2+ Sl3. В этой задаче в качестве явно получаемого значения текущей суммы S1 возьмем 11=1.