Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лекция 6.
Организация циклов. Операторы цикла.
Цикл многократно повторяющаяся группа действий. Для удобства пользователей в языке есть 3 разных оператора цикла.
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 (обозначим её так).
an / an-1 =(-1)n *(x)2n /(2n)! / ( (-1)(n-1) *(x)2(n-1)) *(2(n-1))!
Для хранения слагаемого можно использовать переменную a, т.е. получение очередного слагаемого a=a * 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
20 12 8 4 0
Здесь строится последовательность 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;
Замечание: В случае итерационного цикла удобно предусмотреть в программе аварийный выход из цикла по достижению некоторого количества итераций (например , если не доказана сходимость пос-ти , а решается задача отыскания её предела).
Циклы с параметром.
это циклы, для которых известно или м.б. вычислено заранее количество повторений цикла. Для него заводится счётчик параметр цикла, который получает начальное значение и для сравнения цикла на конец выполняется проверка некоторого условия после каждого выполнения тела цикла. Это может быть и сравнение параметра с эталоном.
9) Оператор цикла for.
for(инициализация; выражение; модификации)оператор;
for(инициализация; выражение; модификации){оператор;… оператор;}
Инициализация Здесь объявляются переменные, используемые в цикле, в том числе и параметр цикла, далее им могут быть присвоены начальные значения. Всё это выполняется в начале цикла(НУ).
Выражение задаёт условие выполнения цикла, значение выражения приводится к типу bool, если оно истинно, тело цикла выполняется, если ложно происходит выход из цикла.
Модификации здесь записаны действия, которые выполняются после каждой итерации цикла, обычно они служат для изменения параметра цикла. Любая из этих частей может быть опущена.
for (int i=n/2; i<5,i<10; i++) cout<<i<<" ";// проверка возможностей цикла for
i<5,i<10- работает последнее условие.
Примеры. 1. int m,s; //s- сумма цифр m
сin>>m; for(s=0;m>0;s+=m%10,m/=10);cout<<s;
2. int n,i,r0,r1,r2; //n-ое число Фибоначчи
cin>>n;
for(r1=1,r2=1,i=2;i<=n;i++,r0=r1,r1=r2,r2=r1+r0);
cout<<r2<<endl;
Замечание О выборе эталона цикла.
Дано: [a,b],N. Отрезок делится на N частей длины h, найти
s=f(a)+f(a+h)+…f(a+N*h); пусть f(x)=cos(x);
double s=0,a,b; int N;
cin>>a>>b>>N;
double x=a,h=(b-a)/N;
while (x<b){s+=cos(x);x+=h;}//Здесь параметр цикла вещест. типа!
Возможны разные результаты на разных компьютерах:
h-вещ.типа и его значение представлено с погрешностью ε.
Либо h+ ε, либо h- ε, в конце эталон будет либо a+N*h+N*ε,
либо a+N*h-N*ε, в первом случае последнее слагаемое не вычисляется.
Замечание: Циклы while и for взаимозаменяемы.
b1;
while(b2)
{
оператор;…оператор;≈ for(b1;b2;b3){оператор;…оператор;}
B3;
}
Кратные циклы.
Цикл наз. простым, если он не содержит в себе других циклов, в противном случае цикл наз. кратным. Уровень кратности уровень вложенности цикла.
A-простой B кратный (двойной) D- кратный (тройной)
С
С простой B кратный (двойной) D -тройной
A B D
Внутренний цикл вкладывается в тело внешнего. Каждый цикл организуется по тем же правилам, что и простой.
Рекомендации:
Замечания об оптимизции циклов:
1.Вычисление выражений, не изменяющихся внутри цикла, необходимо выносить за пределы цикла.
2. Понижать сложность операций, выполняющихся в цикле: можно вычислять двояко: либо sqrt(x), либо pow(x,0.5). Лучше первый способ, т.к. во втором случае работают exp(x) и ln(x).