Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 5 6 ятп.doc
Скачиваний:
8
Добавлен:
22.02.2015
Размер:
240.13 Кб
Скачать

7) Оператор цикла while.

while (выражение) оператор;

Читается так: пока истинно выражение выполнять оператор.

8) Оператор цикла do while.

do оператор; while (выражение);

do {оператор;… оператор;} while (выражение);

Читается так: выполнять оператор (последовательность операторов) пока истинно выражение.

Как правило, при организации цикла одного оператора цикла недостаточно, т.к. выражение содержит некоторые переменные, при входе в цикл while эти переменные должны иметь значение, а значит перед входом в цикл им должно быть присвоено начпальное значение.

Пример 1.Последовательно вводятся целые неотрицательные числа. Определить их сумму, наименьшее из них.

Это пример на обработку последовательности. Последовательность – это конечная совокупность однотипных данных, для которой заранее неизвестно и не может быть вычислено их количество.

Итак есть совокупность x1, x2, … xk ,-1; -1 – это, например, признак конца этой группы. Задача содержит 3 основных элемента действий:

(1)получить очередное x т.е. считать его из последовательности. (2)проверить условие окончания: x=-1?

(3)обработка элемента последовательности: добавление к сумме и проверка на минимум.

Int main()

{

int x,s,min;

cin>>x; // начальные

s=0; min=x; // установки

while (x>=0) // проверка условия окончания

{//обработка элемента

s=s+x; //s+=x; действие накопления

if (x<min) min=x; // min на текущий момент

//получение нового элемента

сin>>x;

}

cout << “s=”<<s<<” min=”<<min<<endl;

return 0;

}

Выводы: использование циклического алгоритма включает два момента 1)повторяющуюся часть алгоритма; 2) начальные установки, текстуально они располагаются до while, а продумываются после написания while.

Рекомендуется: если в цикле идёт накопление, то необходимо позаботиться о начальных установках: для суммы – 0(либо другое нач. значение), для произведения - 1(либо другое нач. значение , не0),для минимума – либо первый элемент,либо максимальное допустимое значение для типа, для максимума – либо первый элемент,либо минимальное допустимое значение для типа.

Схемы циклов.

Цикл с предусловием Цикл с постусловием

нет

даВыход

да нет

Выход

Различают два типа циклов: итерационные и циклы с параметром

Итерационные циклы.

Это циклы, в которых заранее неизвестно и не может быть вычислено количество повторений цикла.

Рассмотрим пример 2. Для заданного x найти сумму s(x)c заданной точностью ε, где

=

Накопление суммы бесконечного числа слагаемых невозможно, поэтому здесь используется суммирование конечного числа слагаемых и доказанный в Мат. Анализе факт: если в бесконечной сумме слагаемые знакочередующиеся и стремятся к 0 с ростом n, то погрешность накопленной частично суммы определяется модулем первого из отброшенных членов, т.е.если |an|< ε, то найденная сумма вычислена с нужной точностью. Опять те же 3 элемента действий:

Условие окончания: |an|< ε

Обработка очередного слагаемого : S=S+ an

Получение очередного слагаемого нельзя выполнять “в лоб”т.к. возведение х каждый раз в свою степень неэффективно, лучше домножать степень х предыдущего слагаемого на (-x2). Вычисление факториала как целого числа возможно только для 2n<=12(для int)и как вещественного тоже по причине погрешности , возникающей из-за хранения не более 15-16 десятичных знаков (для double).Поэтому самое выгодное получать очередное слагаемое домножением предыдущего на некоторую величину w(обозначим её так).

Для хранения слагаемого можно использовать переменную x, т.е. получение очередного слагаемого x=x*w.

//summa.cpp

#include <iostream>

#include <cmath>

using namespace std;

//сумма бесконечного ряда

const double eps=1.0E-9;

int main ()

{double x,s,r,a;

int k,n;

cout<<"vvedite x\n";

cin>>x;

//начальные установки

s=0;

n=0; r=-x*x;

a=1;

while (fabs(a)>=eps) // проверка на конец

{//обработка слагаемого

s=s+a;

//получение нового слагаемого

n=n+1; k=2*n;

a=a*r/((k-1)*k);

}

cout <<s<<endl;// вывод результата

return 0;

}

Итерационные циклы встречаются в задачах:

=накопления суммы, произведения с заданной точностью(см.пример2)

=обработки рекуррентной последовательности. Говорят: элементы x0,x1,…xk-1,xk,xk+1,…xn-1,xn,… образуют рекуррентную последовательность,если задано к начальных элементов x0,x1,…xk-1 , а следующие вычисляются по формулам

xk=φ(x0,x1,…xk-1)

xk+1=φ(x1,…xk-1,xk)

………….и т.д.

Могут быть поставлены задачи, например

=если последовательность сходится, то можно найти предел последовательности с заданной точностью ε;

=найти N-ый элемент такой последовательности;

= найти такой элемент последовательности, для которого выполняется некоторое условие;

Особенность такого алгоритма в том, что нельзя гарантировать возможность хранить все вычисляемые элементы посл-ти. Хранят минимум элементов т.е. к+1. Для них заводят к+1 рабочие переменные r0,r1,…rk-1,rk и в них хранят к предыдущих элементов и

вычисленный к+1 элемент. Это окно r0,r1,…rk-1,rk в процессе вычислений как бы передвигают по последовательности.

Схема такого алгоритма:

// начальные установки

r1=x0; r2=; … rk= xk-1;

while (условие продолжения)

{r0=r1; r1=r2;….rk_1=rk; rk=φ(r0,r1,…rk_1);}

Замечание: r0 либо ничего не присваивается в нач. установках (если r0 не используется в условии), либо присваивается некоторое фиктивное значение, которое позволит войти в цикл первый раз.

Пример 3. Для заданных целых a и b найти с=nod(a,b).

nod(20,12)=nod(12,8)=nod(8,4)=nod(4,0)=4 Здесь строится последовательность a,b, и остатков , пока не получится остаток =0, т.е. нужны 3 рабочие переменные.

int r0,r1,r2;

r1=abs(a); r2=abs(b);

while (r2!=0) // while (r2)

{r0=r1; r1=r2;r2=r0%r1;}

сout<<”nod=”<<r1<<endl;

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

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