Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TA / Гл 1 ПРОСТЕЙШИЕ АЛГОРИТМЫ.doc
Скачиваний:
28
Добавлен:
14.04.2015
Размер:
749.06 Кб
Скачать

1.7. Общие вопросы организации циклов

Пример 1.10. Пусть СП вычисления EXP в нашем распоряжении нет, и нам самим требуется составить соответствующий алгоритм. Запишем разложение exp(x) в ряд Тейлора, ограничившись n-м членом:

(1.2)

Обозначим hi общий член ряда,

(1.3)

Тогда ряд (1.2) может быть представлен выражением:

(1.4)

Вычисления можно проводить двояко

  • непосредственно по формуле (1.3);

  • используя рекуррентную связь между значениями h, индексы которых отличаются на единицу.

В первом случае мы должны для каждого следующего члена ряда проводить все вычисления как для степени, так и для факториала; во втором случае вычисления проводятся с использованием результатов предыдущих вычислений по формуле:

(1.5)

Ясно, что второй способ более рациональный.

При вычислении суммы ряда (1.4) также более рационально использовать предыдущие результаты, так что:

(1.6)

где Si - значение частичной суммы членов ряда с 1-го по i-й включительно.

Вернемся к примеру 1.3. В общем случае представления функции рядом Тейлора она может быть записана как

y = (1.8)

где qi - коэффициенты разложения функции в ряд.

При вычислении значений рядов возможны два варианта организации вычислительного процесса (точнее, определения момента его окончания):

  • n задано или известно в результате анализа погрешности ряда (константа n также должна быть введена в блоке 1). Чаще всего это бывает, если определяется значение функции для одного конкретного значения x=x0 или небольшого числа мало отличающихся значений x в том смысле, что для них n не меняется. Тогда организуется циклические вычисления, которые заканчиваются при достижении параметром i цикла значения n;

  • n заранее неизвестно, однако задана допустимая погрешность Rn(x) (Rn вводится в блоке 1) и циклический процесс заканчивается по условию достижения этой погрешности, то есть :

(1.21)

В нашем случае ряд является знакопеременным и потому [2] погрешность Rn ряда не превышает значения первого отброшенного его члена, то есть

(1.22)

Вычислительный процесс организуется по-разному для случаев вычисления у=f(x) при конкретном значении x=x0 и для некоторого множества значений xi (например, необходимо построить график у=f(x), а  х  в ), В первом случае вычисление производится однократно и потому нет необходимости в дополнительной организации вычислитель-ного процесса; во втором случае необходимо организовать циклический перебор всех значений xi, используя номера i-x точек на оси ОХ при неравномерном разбиении отрезка [a, b] либо приращение по х, ,

xi = i*x+a,

при равномерном разбиении на к интервалов (к - известно).

Итак, мы видим, что циклический процесс в данном и аналогичных ему случаях заканчивается по-разному, в зависимости от того, известно либо нет число повторений в цикле: в первом случае цикл заканчивается, если вычисления в теле цикла проведены для всех значений параметра цикла, а во втором - если выполнено условие завершения цикла.

Стандартные способы организации циклов – использование конструк-ций for, while <условие> do <оператор> , repeat <оператор> until <условие>.

Оператор for имеет внутренний счетчик в обоих вариантах реализации (Iнач Iкон - целые константы ):

for I:= Iнач to Iкон do <оператор> - счет в прямом направлении;

for I:= Iкон downto Iнач do <оператор> - счет в обратном направлении.

Применять этот оператор целесообразно при известном числе циклов.

На рис. 1.16, а и б приведены фрагменты СА для оператора for; здесь S1, S2 - тело цикла.

Запишем фрагмент программы примера 1.7 (строки 3-9) с использова-нием оператора for (здесь invel(lel, rel) - процедура инверсии элементов):

с:=А[1];

for i:=1 to n-1 do

if lel<rel then invel(lel,rel);

c:=rel;

Этот же фрагмент можно представить, не используя процедуру invel (на каждом шаге запоминается значение c=minel):

c:=A[1];

for i:=2 to n do

if ca[i] then c:=a[i];

Реализация операторов while...do , и repeat...until в виде СА приведена на рис. 1.16, в и г. Смысл этих операторов заключается в следующем: для первого - пока выполняется условие W, делать S1, S2,..., а для второго - повторять S1, S2,..., пока не выполнится условие U. Различие этих условных операторов заключается в том , что при организации одного и того же вычислительного процесса (S1; S2 ;...Sn) условия W и U должны быть противоположны; кроме того, во втором случае последовательность операторов выполняется по меньшей мере один раз. Достоинством этих операторов является то, что можно строить циклические алгоритмы с заранее неизвестным числом циклов. Эти операторы можно использовать и при известном числе повторений; при этом в теле цикла должен быть предусмотрен счётчик, а условием выхода из цикла будет его конечное значение. Операторы while...do , и repeat...until, также как и оператор if, создают простое разветвление, но, в отличие от операторов if, они предназначены для многократного выполнения одного и того же вычислительного процесса (S1;S2;...Sn).

Отметим, что организация цикла на рис. 1.12 соответствует оператору repeat..until для первого варианта СА и оператору while..do - для второго (в обоих вариантах со встроенным счётчиком).

Обычно для проверки правильности организации цикла рассматривают вычислительный процесс по шагам, каждому из которых соответствует своё значение параметра цикла; это можно сделать как на бумаге, так и на компьютере. На каждом шаге выполняют операторы тела цикла, причём в случае использования бумаги принимаются следующие упрощения: малое число повторов, данные только целого типа, количество варьируемых данных уменьшается до предела, после которого задача теряет смысл, и т.п. Эти упрощения возможно сделать при глубоком понимании сути задачи. На рис. 1.12в приведен образец анализа правильности организации цикла (верификация алгоритма).

Ошибки в организации цикла связаны обычно с неправильным выполнением начала цикла или его конца; именно этим моментам и следует уделить особое внимание.

Рис. 1.16. Способы реализации операторов цикла:

а, б - for; в: while .. do ; г: repeat .. until.

Отметим, что если в теле цикла встречается оператор, который не зависит от параметра цикла, то его можно и нужно вынести за цикл, что сократит время выполнения алгоритма. Если переменная X[I], зависящая от параметра цикла I, встречается в теле цикла более одного раза, то имеет смысл переобозначить её (например Y:=X[I]), с тем, чтобы не тра-тить время (кроме первого раза!) на вычисление адреса этой переменной в оперативной памяти .

******************* Об организации циклов***************

Соседние файлы в папке TA